diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SOPInstructions.td')
-rw-r--r-- | llvm/lib/Target/AMDGPU/SOPInstructions.td | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/llvm/lib/Target/AMDGPU/SOPInstructions.td b/llvm/lib/Target/AMDGPU/SOPInstructions.td index 404ee4260aa..7056b41c695 100644 --- a/llvm/lib/Target/AMDGPU/SOPInstructions.td +++ b/llvm/lib/Target/AMDGPU/SOPInstructions.td @@ -7,6 +7,18 @@ // //===----------------------------------------------------------------------===// +def GPRIdxModeMatchClass : AsmOperandClass { + let Name = "GPRIdxMode"; + let PredicateMethod = "isGPRIdxMode"; + let RenderMethod = "addImmOperands"; +} + +def GPRIdxMode : Operand<i32> { + let PrintMethod = "printVGPRIndexMode"; + let ParserMatchClass = GPRIdxModeMatchClass; + let OperandType = "OPERAND_IMMEDIATE"; +} + //===----------------------------------------------------------------------===// // SOP1 Instructions //===----------------------------------------------------------------------===// @@ -63,6 +75,13 @@ class SOP1_32 <string opName, list<dag> pattern=[]> : SOP1_Pseudo < "$sdst, $src0", pattern >; +// 32-bit input, no output. +class SOP1_0_32 <string opName, list<dag> pattern = []> : SOP1_Pseudo < + opName, (outs), (ins SSrc_b32:$src0), + "$src0", pattern> { + let has_sdst = 0; +} + class SOP1_64 <string opName, list<dag> pattern=[]> : SOP1_Pseudo < opName, (outs SReg_64:$sdst), (ins SSrc_b64:$src0), "$sdst, $src0", pattern @@ -198,6 +217,12 @@ def S_ABS_I32 : SOP1_32 <"s_abs_i32">; } // End Defs = [SCC] def S_MOV_FED_B32 : SOP1_32 <"s_mov_fed_b32">; +let SubtargetPredicate = HasVGPRIndexMode in { +def S_SET_GPR_IDX_IDX : SOP1_0_32<"s_set_gpr_idx_idx"> { + let Uses = [M0]; + let Defs = [M0]; +} +} //===----------------------------------------------------------------------===// // SOP2 Instructions @@ -597,7 +622,8 @@ class SOPCe <bits<7> op> : Enc32 { let Inst{31-23} = 0x17e; } -class SOPC <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> : +class SOPC <bits<7> op, dag outs, dag ins, string asm, + list<dag> pattern = []> : InstSI<outs, ins, asm, pattern>, SOPCe <op> { let mayLoad = 0; let mayStore = 0; @@ -670,6 +696,17 @@ def S_CMP_EQ_U64 : SOPC_CMP_64 <0x12, "s_cmp_eq_u64", COND_EQ>; def S_CMP_LG_U64 : SOPC_CMP_64 <0x13, "s_cmp_lg_u64", COND_NE>; } +let SubtargetPredicate = HasVGPRIndexMode in { +def S_SET_GPR_IDX_ON : SOPC <0x11, + (outs), + (ins SSrc_b32:$src0, GPRIdxMode:$src1), + "s_set_gpr_idx_on $src0,$src1"> { + let Defs = [M0]; // No scc def + let Uses = [M0]; // Other bits of m0 unmodified. + let hasSideEffects = 1; // Sets mode.gpr_idx_en +} +} + //===----------------------------------------------------------------------===// // SOPP Instructions //===----------------------------------------------------------------------===// @@ -809,8 +846,20 @@ def S_DECPERFLEVEL : SOPP <0x00000015, (ins i32imm:$simm16), "s_decperflevel $si def S_TTRACEDATA : SOPP <0x00000016, (ins), "s_ttracedata"> { let simm16 = 0; } + +let SubtargetPredicate = HasVGPRIndexMode in { +def S_SET_GPR_IDX_OFF : SOPP<0x1c, (ins), "s_set_gpr_idx_off"> { + let simm16 = 0; +} +} } // End hasSideEffects +let SubtargetPredicate = HasVGPRIndexMode in { +def S_SET_GPR_IDX_MODE : SOPP<0x1d, (ins GPRIdxMode:$simm16), + "s_set_gpr_idx_mode$simm16"> { + let Defs = [M0]; +} +} let Predicates = [isGCN] in { @@ -1071,6 +1120,7 @@ def S_CBRANCH_JOIN_vi : SOP1_Real_vi <0x2e, S_CBRANCH_JOIN>; def S_MOV_REGRD_B32_vi : SOP1_Real_vi <0x2f, S_MOV_REGRD_B32>; def S_ABS_I32_vi : SOP1_Real_vi <0x30, S_ABS_I32>; def S_MOV_FED_B32_vi : SOP1_Real_vi <0x31, S_MOV_FED_B32>; +def S_SET_GPR_IDX_IDX_vi : SOP1_Real_vi <0x32, S_SET_GPR_IDX_IDX>; def S_ADD_U32_vi : SOP2_Real_vi <0x00, S_ADD_U32>; def S_ADD_I32_vi : SOP2_Real_vi <0x02, S_ADD_I32>; |