//===- AMDGPULaneMaskUtils.h - Exec/lane mask helper functions -*- C++ -*--===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPULANEMASKUTILS_H #define LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPULANEMASKUTILS_H #include "GCNSubtarget.h" #include "llvm/CodeGen/Register.h" namespace llvm { class GCNSubtarget; namespace AMDGPU { class LaneMaskConstants { public: const Register ExecReg; const Register VccReg; const unsigned AndOpc; const unsigned AndTermOpc; const unsigned AndN2Opc; const unsigned AndN2SaveExecOpc; const unsigned AndN2TermOpc; const unsigned AndSaveExecOpc; const unsigned AndSaveExecTermOpc; const unsigned BfmOpc; const unsigned CMovOpc; const unsigned CSelectOpc; const unsigned MovOpc; const unsigned MovTermOpc; const unsigned OrOpc; const unsigned OrTermOpc; const unsigned OrSaveExecOpc; const unsigned XorOpc; const unsigned XorTermOpc; const unsigned WQMOpc; constexpr LaneMaskConstants(bool IsWave32) : ExecReg(IsWave32 ? AMDGPU::EXEC_LO : AMDGPU::EXEC), VccReg(IsWave32 ? AMDGPU::VCC_LO : AMDGPU::VCC), AndOpc(IsWave32 ? AMDGPU::S_AND_B32 : AMDGPU::S_AND_B64), AndTermOpc(IsWave32 ? AMDGPU::S_AND_B32_term : AMDGPU::S_AND_B64_term), AndN2Opc(IsWave32 ? AMDGPU::S_ANDN2_B32 : AMDGPU::S_ANDN2_B64), AndN2SaveExecOpc(IsWave32 ? AMDGPU::S_ANDN2_SAVEEXEC_B32 : AMDGPU::S_ANDN2_SAVEEXEC_B64), AndN2TermOpc(IsWave32 ? AMDGPU::S_ANDN2_B32_term : AMDGPU::S_ANDN2_B64_term), AndSaveExecOpc(IsWave32 ? AMDGPU::S_AND_SAVEEXEC_B32 : AMDGPU::S_AND_SAVEEXEC_B64), AndSaveExecTermOpc(IsWave32 ? AMDGPU::S_AND_SAVEEXEC_B32_term : AMDGPU::S_AND_SAVEEXEC_B64_term), BfmOpc(IsWave32 ? AMDGPU::S_BFM_B32 : AMDGPU::S_BFM_B64), CMovOpc(IsWave32 ? AMDGPU::S_CMOV_B32 : AMDGPU::S_CMOV_B64), CSelectOpc(IsWave32 ? AMDGPU::S_CSELECT_B32 : AMDGPU::S_CSELECT_B64), MovOpc(IsWave32 ? AMDGPU::S_MOV_B32 : AMDGPU::S_MOV_B64), MovTermOpc(IsWave32 ? AMDGPU::S_MOV_B32_term : AMDGPU::S_MOV_B64_term), OrOpc(IsWave32 ? AMDGPU::S_OR_B32 : AMDGPU::S_OR_B64), OrTermOpc(IsWave32 ? AMDGPU::S_OR_B32_term : AMDGPU::S_OR_B64_term), OrSaveExecOpc(IsWave32 ? AMDGPU::S_OR_SAVEEXEC_B32 : AMDGPU::S_OR_SAVEEXEC_B64), XorOpc(IsWave32 ? AMDGPU::S_XOR_B32 : AMDGPU::S_XOR_B64), XorTermOpc(IsWave32 ? AMDGPU::S_XOR_B32_term : AMDGPU::S_XOR_B64_term), WQMOpc(IsWave32 ? AMDGPU::S_WQM_B32 : AMDGPU::S_WQM_B64) {} static inline const LaneMaskConstants &get(const GCNSubtarget &ST); }; static constexpr LaneMaskConstants LaneMaskConstants32 = LaneMaskConstants(/*IsWave32=*/true); static constexpr LaneMaskConstants LaneMaskConstants64 = LaneMaskConstants(/*IsWave32=*/false); inline const LaneMaskConstants &LaneMaskConstants::get(const GCNSubtarget &ST) { unsigned WavefrontSize = ST.getWavefrontSize(); assert(WavefrontSize == 32 || WavefrontSize == 64); return WavefrontSize == 32 ? LaneMaskConstants32 : LaneMaskConstants64; } } // end namespace AMDGPU } // end namespace llvm #endif // LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPULANEMASKUTILS_H