[llvm] [AMDGPU] Add GFX12 encoding and aliases for existing SOP (SALU) instructions (PR #74305)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 4 03:45:45 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mc
Author: Jay Foad (jayfoad)
<details>
<summary>Changes</summary>
---
Patch is 816.02 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/74305.diff
15 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/AMDGPU.td (+2)
- (modified) llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp (+7)
- (modified) llvm/lib/Target/AMDGPU/SOPInstructions.td (+428-268)
- (added) llvm/test/MC/AMDGPU/gfx12_asm_sop1.s (+4216)
- (added) llvm/test/MC/AMDGPU/gfx12_asm_sop2.s (+6061)
- (added) llvm/test/MC/AMDGPU/gfx12_asm_sop2_alias.s (+19)
- (added) llvm/test/MC/AMDGPU/gfx12_asm_sopc.s (+2161)
- (added) llvm/test/MC/AMDGPU/gfx12_asm_sopk.s (+199)
- (added) llvm/test/MC/AMDGPU/gfx12_asm_sopk_alias.s (+4)
- (added) llvm/test/MC/AMDGPU/gfx12_asm_sopp.s (+346)
- (added) llvm/test/MC/Disassembler/AMDGPU/gfx12_dasm_sop1.txt (+3649)
- (added) llvm/test/MC/Disassembler/AMDGPU/gfx12_dasm_sop2.txt (+5726)
- (added) llvm/test/MC/Disassembler/AMDGPU/gfx12_dasm_sopc.txt (+2161)
- (added) llvm/test/MC/Disassembler/AMDGPU/gfx12_dasm_sopk.txt (+206)
- (added) llvm/test/MC/Disassembler/AMDGPU/gfx12_dasm_sopp.txt (+268)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/AMDGPU.td b/llvm/lib/Target/AMDGPU/AMDGPU.td
index f7315ecb9fa64..799e102d56174 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPU.td
+++ b/llvm/lib/Target/AMDGPU/AMDGPU.td
@@ -1460,6 +1460,8 @@ def FeatureISAVersion12 : FeatureSet<
FeatureExtendedImageInsts,
FeaturePackedTID,
FeatureVcmpxPermlaneHazard,
+ FeatureSALUFloatInsts,
+ FeatureVGPRSingleUseHintInsts,
FeatureMADIntraFwdBug]>;
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp
index 1b301ee5f49b2..d613ea4abd44a 100644
--- a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp
+++ b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp
@@ -606,6 +606,9 @@ DecodeStatus AMDGPUDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
Address, CS);
if (Res) break;
+ Res = tryDecodeInst(DecoderTableGFX1232, MI, DW, Address, CS);
+ if (Res) break;
+
if (Bytes.size() < 4) break;
const uint64_t QW = ((uint64_t)eatBytes<uint32_t>(Bytes) << 32) | DW;
@@ -633,6 +636,10 @@ DecodeStatus AMDGPUDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
Res = tryDecodeInst(DecoderTableGFX1064, MI, QW, Address, CS);
if (Res) break;
+ Res = tryDecodeInst(DecoderTableGFX1264, MI, QW, Address, CS);
+ if (Res)
+ break;
+
Res = tryDecodeInst(DecoderTableGFX1164, DecoderTableGFX11_FAKE1664, MI, QW,
Address, CS);
if (Res)
diff --git a/llvm/lib/Target/AMDGPU/SOPInstructions.td b/llvm/lib/Target/AMDGPU/SOPInstructions.td
index 9e10efd1b07e1..87f64913c02d0 100644
--- a/llvm/lib/Target/AMDGPU/SOPInstructions.td
+++ b/llvm/lib/Target/AMDGPU/SOPInstructions.td
@@ -852,9 +852,9 @@ class SOPK_Pseudo <string opName, dag outs, dag ins,
let has_sdst = 1;
}
-class SOPK_Real<SOPK_Pseudo ps> :
+class SOPK_Real<SOPK_Pseudo ps, string real_name = ps.Mnemonic> :
InstSI <ps.OutOperandList, ps.InOperandList,
- ps.Mnemonic # ps.AsmOperands> {
+ real_name # ps.AsmOperands> {
let SALU = 1;
let SOPK = 1;
let isPseudo = 0;
@@ -878,8 +878,8 @@ class SOPK_Real<SOPK_Pseudo ps> :
bits<32> imm;
}
-class SOPK_Real32<bits<5> op, SOPK_Pseudo ps> :
- SOPK_Real <ps>,
+class SOPK_Real32<bits<5> op, SOPK_Pseudo ps, string real_name = ps.Mnemonic> :
+ SOPK_Real <ps, real_name>,
Enc32 {
let Inst{15-0} = simm16;
let Inst{22-16} = !if(ps.has_sdst, sdst, ?);
@@ -1730,6 +1730,11 @@ def : ScalarNot2Pat<S_ORN2_B64, or, v2i32>;
// Target-specific instruction encodings.
//===----------------------------------------------------------------------===//
+class Select_gfx12<string opName> : SIMCInstr<opName, SIEncodingFamily.GFX12> {
+ Predicate AssemblerPredicate = isGFX12Only;
+ string DecoderNamespace = "GFX12";
+}
+
class Select_gfx11<string opName> : SIMCInstr<opName, SIEncodingFamily.GFX11> {
Predicate AssemblerPredicate = isGFX11Only;
string DecoderNamespace = "GFX11";
@@ -1751,105 +1756,130 @@ class Select_gfx6_gfx7<string opName> : SIMCInstr<opName, SIEncodingFamily.SI> {
}
//===----------------------------------------------------------------------===//
-// GFX11.
+// SOP1 - GFX11, GFX12
//===----------------------------------------------------------------------===//
+multiclass SOP1_Real_gfx12<bits<8> op> {
+ def _gfx12 : SOP1_Real<op, !cast<SOP1_Pseudo>(NAME)>,
+ Select_gfx12<!cast<SOP1_Pseudo>(NAME).Mnemonic>;
+}
+
+multiclass SOP1_M0_Real_gfx12<bits<8> op> {
+ def _gfx12 : SOP1_Real<op, !cast<SOP1_Pseudo>(NAME)>,
+ Select_gfx12<!cast<SOP1_Pseudo>(NAME).Mnemonic> {
+ let Inst{7-0} = M0_gfx11plus.HWEncoding{7-0}; // Set Src0 encoding to M0
+ }
+}
+
multiclass SOP1_Real_gfx11<bits<8> op> {
def _gfx11 : SOP1_Real<op, !cast<SOP1_Pseudo>(NAME)>,
Select_gfx11<!cast<SOP1_Pseudo>(NAME).Mnemonic>;
}
+multiclass SOP1_Real_Renamed_gfx12<bits<8> op, SOP1_Pseudo backing_pseudo, string real_name> {
+ def _gfx12 : SOP1_Real<op, backing_pseudo, real_name>,
+ Select_gfx12<backing_pseudo.Mnemonic>,
+ MnemonicAlias<backing_pseudo.Mnemonic, real_name>, Requires<[isGFX12Plus]>;
+}
+
multiclass SOP1_Real_Renamed_gfx11<bits<8> op, SOP1_Pseudo backing_pseudo, string real_name> {
def _gfx11 : SOP1_Real<op, backing_pseudo, real_name>,
Select_gfx11<backing_pseudo.Mnemonic>,
- MnemonicAlias<backing_pseudo.Mnemonic, real_name>, Requires<[isGFX11Plus]>;
-}
-
-defm S_MOV_B32 : SOP1_Real_gfx11<0x000>;
-defm S_MOV_B64 : SOP1_Real_gfx11<0x001>;
-defm S_CMOV_B32 : SOP1_Real_gfx11<0x002>;
-defm S_CMOV_B64 : SOP1_Real_gfx11<0x003>;
-defm S_BREV_B32 : SOP1_Real_gfx11<0x004>;
-defm S_BREV_B64 : SOP1_Real_gfx11<0x005>;
-defm S_CTZ_I32_B32 : SOP1_Real_Renamed_gfx11<0x008, S_FF1_I32_B32, "s_ctz_i32_b32">;
-defm S_CTZ_I32_B64 : SOP1_Real_Renamed_gfx11<0x009, S_FF1_I32_B64, "s_ctz_i32_b64">;
-defm S_CLZ_I32_U32 : SOP1_Real_Renamed_gfx11<0x00a, S_FLBIT_I32_B32, "s_clz_i32_u32">;
-defm S_CLZ_I32_U64 : SOP1_Real_Renamed_gfx11<0x00b, S_FLBIT_I32_B64, "s_clz_i32_u64">;
-defm S_CLS_I32 : SOP1_Real_Renamed_gfx11<0x00c, S_FLBIT_I32, "s_cls_i32">;
-defm S_CLS_I32_I64 : SOP1_Real_Renamed_gfx11<0x00d, S_FLBIT_I32_I64, "s_cls_i32_i64">;
-defm S_SEXT_I32_I8 : SOP1_Real_gfx11<0x00e>;
-defm S_SEXT_I32_I16 : SOP1_Real_gfx11<0x00f>;
-defm S_BITSET0_B32 : SOP1_Real_gfx11<0x010>;
-defm S_BITSET0_B64 : SOP1_Real_gfx11<0x011>;
-defm S_BITSET1_B32 : SOP1_Real_gfx11<0x012>;
-defm S_BITSET1_B64 : SOP1_Real_gfx11<0x013>;
-defm S_BITREPLICATE_B64_B32 : SOP1_Real_gfx11<0x014>;
-defm S_ABS_I32 : SOP1_Real_gfx11<0x015>;
-defm S_BCNT0_I32_B32 : SOP1_Real_gfx11<0x016>;
-defm S_BCNT0_I32_B64 : SOP1_Real_gfx11<0x017>;
-defm S_BCNT1_I32_B32 : SOP1_Real_gfx11<0x018>;
-defm S_BCNT1_I32_B64 : SOP1_Real_gfx11<0x019>;
-defm S_QUADMASK_B32 : SOP1_Real_gfx11<0x01a>;
-defm S_QUADMASK_B64 : SOP1_Real_gfx11<0x01b>;
-defm S_WQM_B32 : SOP1_Real_gfx11<0x01c>;
-defm S_WQM_B64 : SOP1_Real_gfx11<0x01d>;
-defm S_NOT_B32 : SOP1_Real_gfx11<0x01e>;
-defm S_NOT_B64 : SOP1_Real_gfx11<0x01f>;
-defm S_AND_SAVEEXEC_B32 : SOP1_Real_gfx11<0x020>;
-defm S_AND_SAVEEXEC_B64 : SOP1_Real_gfx11<0x021>;
-defm S_OR_SAVEEXEC_B32 : SOP1_Real_gfx11<0x022>;
-defm S_OR_SAVEEXEC_B64 : SOP1_Real_gfx11<0x023>;
-defm S_XOR_SAVEEXEC_B32 : SOP1_Real_gfx11<0x024>;
-defm S_XOR_SAVEEXEC_B64 : SOP1_Real_gfx11<0x025>;
-defm S_NAND_SAVEEXEC_B32 : SOP1_Real_gfx11<0x026>;
-defm S_NAND_SAVEEXEC_B64 : SOP1_Real_gfx11<0x027>;
-defm S_NOR_SAVEEXEC_B32 : SOP1_Real_gfx11<0x028>;
-defm S_NOR_SAVEEXEC_B64 : SOP1_Real_gfx11<0x029>;
-defm S_XNOR_SAVEEXEC_B32 : SOP1_Real_gfx11<0x02a>;
-/*defm S_XNOR_SAVEEXEC_B64 : SOP1_Real_gfx11<0x02b>; //same as older arch, handled there*/
-defm S_AND_NOT0_SAVEEXEC_B32 : SOP1_Real_Renamed_gfx11<0x02c, S_ANDN1_SAVEEXEC_B32, "s_and_not0_saveexec_b32">;
-defm S_AND_NOT0_SAVEEXEC_B64 : SOP1_Real_Renamed_gfx11<0x02d, S_ANDN1_SAVEEXEC_B64, "s_and_not0_saveexec_b64">;
-defm S_OR_NOT0_SAVEEXEC_B32 : SOP1_Real_Renamed_gfx11<0x02e, S_ORN1_SAVEEXEC_B32, "s_or_not0_saveexec_b32">;
-defm S_OR_NOT0_SAVEEXEC_B64 : SOP1_Real_Renamed_gfx11<0x02f, S_ORN1_SAVEEXEC_B64, "s_or_not0_saveexec_b64">;
-defm S_AND_NOT1_SAVEEXEC_B32 : SOP1_Real_Renamed_gfx11<0x030, S_ANDN2_SAVEEXEC_B32, "s_and_not1_saveexec_b32">;
-defm S_AND_NOT1_SAVEEXEC_B64 : SOP1_Real_Renamed_gfx11<0x031, S_ANDN2_SAVEEXEC_B64, "s_and_not1_saveexec_b64">;
-defm S_OR_NOT1_SAVEEXEC_B32 : SOP1_Real_Renamed_gfx11<0x032, S_ORN2_SAVEEXEC_B32, "s_or_not1_saveexec_b32">;
-defm S_OR_NOT1_SAVEEXEC_B64 : SOP1_Real_Renamed_gfx11<0x033, S_ORN2_SAVEEXEC_B64, "s_or_not1_saveexec_b64">;
-defm S_AND_NOT0_WREXEC_B32 : SOP1_Real_Renamed_gfx11<0x034, S_ANDN1_WREXEC_B32, "s_and_not0_wrexec_b32">;
-defm S_AND_NOT0_WREXEC_B64 : SOP1_Real_Renamed_gfx11<0x035, S_ANDN1_WREXEC_B64, "s_and_not0_wrexec_b64">;
-defm S_AND_NOT1_WREXEC_B32 : SOP1_Real_Renamed_gfx11<0x036, S_ANDN2_WREXEC_B32, "s_and_not1_wrexec_b32">;
-defm S_AND_NOT1_WREXEC_B64 : SOP1_Real_Renamed_gfx11<0x037, S_ANDN2_WREXEC_B64, "s_and_not1_wrexec_b64">;
-defm S_MOVRELS_B32 : SOP1_Real_gfx11<0x040>;
-defm S_MOVRELS_B64 : SOP1_Real_gfx11<0x041>;
-defm S_MOVRELD_B32 : SOP1_Real_gfx11<0x042>;
-defm S_MOVRELD_B64 : SOP1_Real_gfx11<0x043>;
-defm S_MOVRELSD_2_B32 : SOP1_Real_gfx11<0x044>;
-defm S_GETPC_B64 : SOP1_Real_gfx11<0x047>;
-defm S_SETPC_B64 : SOP1_Real_gfx11<0x048>;
-defm S_SWAPPC_B64 : SOP1_Real_gfx11<0x049>;
-defm S_RFE_B64 : SOP1_Real_gfx11<0x04a>;
-defm S_SENDMSG_RTN_B32 : SOP1_Real_gfx11<0x04c>;
-defm S_SENDMSG_RTN_B64 : SOP1_Real_gfx11<0x04d>;
+ MnemonicAlias<backing_pseudo.Mnemonic, real_name>, Requires<[isGFX11Only]>;
+}
+
+multiclass SOP1_Real_gfx11_gfx12<bits<8> op> :
+ SOP1_Real_gfx11<op>, SOP1_Real_gfx12<op>;
+
+multiclass SOP1_Real_Renamed_gfx11_gfx12<bits<8> op, SOP1_Pseudo backing_pseudo, string real_name> :
+ SOP1_Real_Renamed_gfx11<op, backing_pseudo, real_name>,
+ SOP1_Real_Renamed_gfx12<op, backing_pseudo, real_name>;
+
+defm S_MOV_B32 : SOP1_Real_gfx11_gfx12<0x000>;
+defm S_MOV_B64 : SOP1_Real_gfx11_gfx12<0x001>;
+defm S_CMOV_B32 : SOP1_Real_gfx11_gfx12<0x002>;
+defm S_CMOV_B64 : SOP1_Real_gfx11_gfx12<0x003>;
+defm S_BREV_B32 : SOP1_Real_gfx11_gfx12<0x004>;
+defm S_BREV_B64 : SOP1_Real_gfx11_gfx12<0x005>;
+defm S_CTZ_I32_B32 : SOP1_Real_Renamed_gfx11_gfx12<0x008, S_FF1_I32_B32, "s_ctz_i32_b32">;
+defm S_CTZ_I32_B64 : SOP1_Real_Renamed_gfx11_gfx12<0x009, S_FF1_I32_B64, "s_ctz_i32_b64">;
+defm S_CLZ_I32_U32 : SOP1_Real_Renamed_gfx11_gfx12<0x00a, S_FLBIT_I32_B32, "s_clz_i32_u32">;
+defm S_CLZ_I32_U64 : SOP1_Real_Renamed_gfx11_gfx12<0x00b, S_FLBIT_I32_B64, "s_clz_i32_u64">;
+defm S_CLS_I32 : SOP1_Real_Renamed_gfx11_gfx12<0x00c, S_FLBIT_I32, "s_cls_i32">;
+defm S_CLS_I32_I64 : SOP1_Real_Renamed_gfx11_gfx12<0x00d, S_FLBIT_I32_I64, "s_cls_i32_i64">;
+defm S_SEXT_I32_I8 : SOP1_Real_gfx11_gfx12<0x00e>;
+defm S_SEXT_I32_I16 : SOP1_Real_gfx11_gfx12<0x00f>;
+defm S_BITSET0_B32 : SOP1_Real_gfx11_gfx12<0x010>;
+defm S_BITSET0_B64 : SOP1_Real_gfx11_gfx12<0x011>;
+defm S_BITSET1_B32 : SOP1_Real_gfx11_gfx12<0x012>;
+defm S_BITSET1_B64 : SOP1_Real_gfx11_gfx12<0x013>;
+defm S_BITREPLICATE_B64_B32 : SOP1_Real_gfx11_gfx12<0x014>;
+defm S_ABS_I32 : SOP1_Real_gfx11_gfx12<0x015>;
+defm S_BCNT0_I32_B32 : SOP1_Real_gfx11_gfx12<0x016>;
+defm S_BCNT0_I32_B64 : SOP1_Real_gfx11_gfx12<0x017>;
+defm S_BCNT1_I32_B32 : SOP1_Real_gfx11_gfx12<0x018>;
+defm S_BCNT1_I32_B64 : SOP1_Real_gfx11_gfx12<0x019>;
+defm S_QUADMASK_B32 : SOP1_Real_gfx11_gfx12<0x01a>;
+defm S_QUADMASK_B64 : SOP1_Real_gfx11_gfx12<0x01b>;
+defm S_WQM_B32 : SOP1_Real_gfx11_gfx12<0x01c>;
+defm S_WQM_B64 : SOP1_Real_gfx11_gfx12<0x01d>;
+defm S_NOT_B32 : SOP1_Real_gfx11_gfx12<0x01e>;
+defm S_NOT_B64 : SOP1_Real_gfx11_gfx12<0x01f>;
+defm S_AND_SAVEEXEC_B32 : SOP1_Real_gfx11_gfx12<0x020>;
+defm S_AND_SAVEEXEC_B64 : SOP1_Real_gfx11_gfx12<0x021>;
+defm S_OR_SAVEEXEC_B32 : SOP1_Real_gfx11_gfx12<0x022>;
+defm S_OR_SAVEEXEC_B64 : SOP1_Real_gfx11_gfx12<0x023>;
+defm S_XOR_SAVEEXEC_B32 : SOP1_Real_gfx11_gfx12<0x024>;
+defm S_XOR_SAVEEXEC_B64 : SOP1_Real_gfx11_gfx12<0x025>;
+defm S_NAND_SAVEEXEC_B32 : SOP1_Real_gfx11_gfx12<0x026>;
+defm S_NAND_SAVEEXEC_B64 : SOP1_Real_gfx11_gfx12<0x027>;
+defm S_NOR_SAVEEXEC_B32 : SOP1_Real_gfx11_gfx12<0x028>;
+defm S_NOR_SAVEEXEC_B64 : SOP1_Real_gfx11_gfx12<0x029>;
+defm S_XNOR_SAVEEXEC_B32 : SOP1_Real_gfx11_gfx12<0x02a>;
+/*defm S_XNOR_SAVEEXEC_B64 : SOP1_Real_gfx11_gfx12<0x02b>; //same as older arch, handled there*/
+defm S_AND_NOT0_SAVEEXEC_B32 : SOP1_Real_Renamed_gfx11_gfx12<0x02c, S_ANDN1_SAVEEXEC_B32, "s_and_not0_saveexec_b32">;
+defm S_AND_NOT0_SAVEEXEC_B64 : SOP1_Real_Renamed_gfx11_gfx12<0x02d, S_ANDN1_SAVEEXEC_B64, "s_and_not0_saveexec_b64">;
+defm S_OR_NOT0_SAVEEXEC_B32 : SOP1_Real_Renamed_gfx11_gfx12<0x02e, S_ORN1_SAVEEXEC_B32, "s_or_not0_saveexec_b32">;
+defm S_OR_NOT0_SAVEEXEC_B64 : SOP1_Real_Renamed_gfx11_gfx12<0x02f, S_ORN1_SAVEEXEC_B64, "s_or_not0_saveexec_b64">;
+defm S_AND_NOT1_SAVEEXEC_B32 : SOP1_Real_Renamed_gfx11_gfx12<0x030, S_ANDN2_SAVEEXEC_B32, "s_and_not1_saveexec_b32">;
+defm S_AND_NOT1_SAVEEXEC_B64 : SOP1_Real_Renamed_gfx11_gfx12<0x031, S_ANDN2_SAVEEXEC_B64, "s_and_not1_saveexec_b64">;
+defm S_OR_NOT1_SAVEEXEC_B32 : SOP1_Real_Renamed_gfx11_gfx12<0x032, S_ORN2_SAVEEXEC_B32, "s_or_not1_saveexec_b32">;
+defm S_OR_NOT1_SAVEEXEC_B64 : SOP1_Real_Renamed_gfx11_gfx12<0x033, S_ORN2_SAVEEXEC_B64, "s_or_not1_saveexec_b64">;
+defm S_AND_NOT0_WREXEC_B32 : SOP1_Real_Renamed_gfx11_gfx12<0x034, S_ANDN1_WREXEC_B32, "s_and_not0_wrexec_b32">;
+defm S_AND_NOT0_WREXEC_B64 : SOP1_Real_Renamed_gfx11_gfx12<0x035, S_ANDN1_WREXEC_B64, "s_and_not0_wrexec_b64">;
+defm S_AND_NOT1_WREXEC_B32 : SOP1_Real_Renamed_gfx11_gfx12<0x036, S_ANDN2_WREXEC_B32, "s_and_not1_wrexec_b32">;
+defm S_AND_NOT1_WREXEC_B64 : SOP1_Real_Renamed_gfx11_gfx12<0x037, S_ANDN2_WREXEC_B64, "s_and_not1_wrexec_b64">;
+defm S_MOVRELS_B32 : SOP1_Real_gfx11_gfx12<0x040>;
+defm S_MOVRELS_B64 : SOP1_Real_gfx11_gfx12<0x041>;
+defm S_MOVRELD_B32 : SOP1_Real_gfx11_gfx12<0x042>;
+defm S_MOVRELD_B64 : SOP1_Real_gfx11_gfx12<0x043>;
+defm S_MOVRELSD_2_B32 : SOP1_Real_gfx11_gfx12<0x044>;
+defm S_GETPC_B64 : SOP1_Real_gfx11_gfx12<0x047>;
+defm S_SETPC_B64 : SOP1_Real_gfx11_gfx12<0x048>;
+defm S_SWAPPC_B64 : SOP1_Real_gfx11_gfx12<0x049>;
+defm S_RFE_B64 : SOP1_Real_gfx11_gfx12<0x04a>;
+defm S_SENDMSG_RTN_B32 : SOP1_Real_gfx11_gfx12<0x04c>;
+defm S_SENDMSG_RTN_B64 : SOP1_Real_gfx11_gfx12<0x04d>;
//===----------------------------------------------------------------------===//
-// SOP1 - GFX1150
+// SOP1 - GFX1150, GFX12
//===----------------------------------------------------------------------===//
-defm S_CEIL_F32 : SOP1_Real_gfx11<0x060>;
-defm S_FLOOR_F32 : SOP1_Real_gfx11<0x061>;
-defm S_TRUNC_F32 : SOP1_Real_gfx11<0x062>;
-defm S_RNDNE_F32 : SOP1_Real_gfx11<0x063>;
-defm S_CVT_F32_I32 : SOP1_Real_gfx11<0x064>;
-defm S_CVT_F32_U32 : SOP1_Real_gfx11<0x065>;
-defm S_CVT_I32_F32 : SOP1_Real_gfx11<0x066>;
-defm S_CVT_U32_F32 : SOP1_Real_gfx11<0x067>;
-defm S_CVT_F16_F32 : SOP1_Real_gfx11<0x068>;
-defm S_CVT_F32_F16 : SOP1_Real_gfx11<0x069>;
-defm S_CVT_HI_F32_F16 : SOP1_Real_gfx11<0x06a>;
-defm S_CEIL_F16 : SOP1_Real_gfx11<0x06b>;
-defm S_FLOOR_F16 : SOP1_Real_gfx11<0x06c>;
-defm S_TRUNC_F16 : SOP1_Real_gfx11<0x06d>;
-defm S_RNDNE_F16 : SOP1_Real_gfx11<0x06e>;
+defm S_CEIL_F32 : SOP1_Real_gfx11_gfx12<0x060>;
+defm S_FLOOR_F32 : SOP1_Real_gfx11_gfx12<0x061>;
+defm S_TRUNC_F32 : SOP1_Real_gfx11_gfx12<0x062>;
+defm S_RNDNE_F32 : SOP1_Real_gfx11_gfx12<0x063>;
+defm S_CVT_F32_I32 : SOP1_Real_gfx11_gfx12<0x064>;
+defm S_CVT_F32_U32 : SOP1_Real_gfx11_gfx12<0x065>;
+defm S_CVT_I32_F32 : SOP1_Real_gfx11_gfx12<0x066>;
+defm S_CVT_U32_F32 : SOP1_Real_gfx11_gfx12<0x067>;
+defm S_CVT_F16_F32 : SOP1_Real_gfx11_gfx12<0x068>;
+defm S_CVT_F32_F16 : SOP1_Real_gfx11_gfx12<0x069>;
+defm S_CVT_HI_F32_F16 : SOP1_Real_gfx11_gfx12<0x06a>;
+defm S_CEIL_F16 : SOP1_Real_gfx11_gfx12<0x06b>;
+defm S_FLOOR_F16 : SOP1_Real_gfx11_gfx12<0x06c>;
+defm S_TRUNC_F16 : SOP1_Real_gfx11_gfx12<0x06d>;
+defm S_RNDNE_F16 : SOP1_Real_gfx11_gfx12<0x06e>;
//===----------------------------------------------------------------------===//
// SOP1 - GFX10.
@@ -1861,8 +1891,8 @@ multiclass SOP1_Real_gfx10<bits<8> op> {
Select_gfx10<ps.Mnemonic>;
}
-multiclass SOP1_Real_gfx10_gfx11<bits<8> op> :
- SOP1_Real_gfx10<op>, SOP1_Real_gfx11<op>;
+multiclass SOP1_Real_gfx10_gfx11_gfx12<bits<8> op> :
+ SOP1_Real_gfx10<op>, SOP1_Real_gfx11_gfx12<op>;
defm S_ANDN1_SAVEEXEC_B64 : SOP1_Real_gfx10<0x037>;
defm S_ORN1_SAVEEXEC_B64 : SOP1_Real_gfx10<0x038>;
@@ -1897,8 +1927,8 @@ multiclass SOP1_Real_gfx6_gfx7<bits<8> op> {
multiclass SOP1_Real_gfx6_gfx7_gfx10<bits<8> op> :
SOP1_Real_gfx6_gfx7<op>, SOP1_Real_gfx10<op>;
-multiclass SOP1_Real_gfx6_gfx7_gfx10_gfx11<bits<8> op> :
- SOP1_Real_gfx6_gfx7<op>, SOP1_Real_gfx10_gfx11<op>;
+multiclass SOP1_Real_gfx6_gfx7_gfx10_gfx11_gfx12<bits<8> op> :
+ SOP1_Real_gfx6_gfx7<op>, SOP1_Real_gfx10_gfx11_gfx12<op>;
defm S_CBRANCH_JOIN : SOP1_Real_gfx6_gfx7<0x032>;
@@ -1941,7 +1971,7 @@ defm S_ANDN2_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x027>;
defm S_ORN2_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x028>;
defm S_NAND_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x029>;
defm S_NOR_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x02a>;
-defm S_XNOR_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10_gfx11<0x02b>;
+defm S_XNOR_SAVEEXEC_B64 : SOP1_Real_gfx6_gfx7_gfx10_gfx11_gfx12<0x02b>;
defm S_QUADMASK_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x02c>;
defm S_QUADMASK_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x02d>;
defm S_MOVRELS_B32 : SOP1_Real_gfx6_gfx7_gfx10<0x02e>;
@@ -1951,7 +1981,34 @@ defm S_MOVRELD_B64 : SOP1_Real_gfx6_gfx7_gfx10<0x031>;
defm S_ABS_I32 : SOP1_Real_gfx6_gfx7_gfx10<0x034>;
//===----------------------------------------------------------------------===//
-// SOP2 - GFX11.
+// SOP2 - GFX12
+//===----------------------------------------------------------------------===//
+
+multiclass SOP2_Real_gfx12<bits<7> op> {
+ def _gfx12 : SOP2_Real32<op, !cast<SOP2_Pseudo>(NAME)>,
+ Select_gfx12<!cast<SOP2_Pseudo>(NAME).Mnemonic>;
+}
+
+multiclass SOP2_Real_Renamed_gfx12<bits<7> op, SOP2_Pseudo backing_pseudo, string real_name> {
+ def _gfx12 : SOP2_Real32<op, backing_pseudo, real_name>,
+ Select_gfx12<backing_pseudo.Mnemonic>,
+ MnemonicAlias<backing_pseudo.Mnemonic, real_name>, Requires<[isGFX12Plus]>;
+}
+
+defm S_MIN_NUM_F32 : SOP2_Real_Renamed_gfx12<0x042, S_MIN_F32, "s_min_num_f32">;
+defm S_MAX_NUM_F32 : SOP2_Real_Renamed_gfx12<0x043, S_MAX_F32, "s_max_num_f32">;
+defm S_MIN_NUM_F16 : SOP2_Real_Renamed_gfx12<0x04b, S_MIN_F16, "s_min_num_f16">;
+defm S_MAX_NUM_F16 : SOP2_Real_Renamed_gfx12<0x04c, S_MAX_F16, "s_max_num_f16">;
+
+defm S_ADD_CO_U32 : SOP2_Real_Renamed_gfx12<0x000, S_ADD_U32, "s_add_co_u32">;
+defm S_SUB_CO_U32 : SOP2_Real_Renamed_gfx12<0x001, S_SUB_U32, "s_sub_co_u32">;
+defm S_ADD_CO_I32 : SOP2_Real_Renamed_gfx12<0x002, S_ADD_I32, "s_add_co_i32">;
+defm S_SUB_CO_I32 : SOP2_Real_Renamed_gfx12<0x003, S_SUB_I32, "s_sub_co_i32">;
+defm S_ADD_CO_CI_U32 : SOP2_Real_Renamed_gfx12<0x004, S_ADDC_U32, "s_add_co_ci_u32">;
+defm S_SUB_CO_CI_U32 : SOP2_Real_Renamed_gfx12<0x005, S_SUBB_U32, "s_sub_co_ci_u32">;
+
+//===----------------------------------------------------------------------===//
+// SOP2 - GFX11, GFX12.
//===----------------------------------------------------------------------===//
multiclass SOP2_Real_gfx11<bits<7> op> {
@@ -1962,77 +2019,97 @@ multiclass SOP2_Real_gfx11<bits<7> op> {
multiclass SOP2_Real_Renamed_gfx11<bits<7> op, SOP2_Pseudo backing_pseudo, string real_name> {
def _gfx11 : SOP2_Real32<op, backing_...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/74305
More information about the llvm-commits
mailing list