diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SIInstrInfo.td')
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIInstrInfo.td | 132 |
1 files changed, 78 insertions, 54 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.td b/llvm/lib/Target/AMDGPU/SIInstrInfo.td index 1eecbf555613..85e8d0582dcd 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.td +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.td @@ -225,7 +225,6 @@ class SDGlobalAtomicNoRtn<string opcode, ValueType ty> : SDNode <opcode, [SDNPMemOperand, SDNPHasChain, SDNPMayLoad, SDNPMayStore] >; -def SIglobal_atomic_fadd : SDGlobalAtomicNoRtn <"AMDGPUISD::ATOMIC_FADD", f32>; def SIglobal_atomic_pk_fadd : SDGlobalAtomicNoRtn <"AMDGPUISD::ATOMIC_PK_FADD", v2f16>; def SIpc_add_rel_offset : SDNode<"AMDGPUISD::PC_ADD_REL_OFFSET", @@ -324,7 +323,7 @@ defm atomic_load_fmax_#as : binary_atomic_op<SIatomic_fmax, 0>; def atomic_fadd_global_noret : PatFrag< (ops node:$ptr, node:$value), - (SIglobal_atomic_fadd node:$ptr, node:$value)> { + (atomic_load_fadd node:$ptr, node:$value)> { // FIXME: Move this let MemoryVT = f32; let IsAtomic = 1; @@ -580,46 +579,37 @@ def si_setcc_uniform : PatFrag < // SDNodes PatFrags for d16 loads //===----------------------------------------------------------------------===// -class LoadD16Frag <SDPatternOperator op> : PatFrag<(ops node:$ptr, node:$tied_in), (op node:$ptr, node:$tied_in)>; -class LocalLoadD16 <SDPatternOperator op> : LoadD16Frag <op>, LocalAddress; -class GlobalLoadD16 <SDPatternOperator op> : LoadD16Frag <op>, GlobalLoadAddress; -class PrivateLoadD16 <SDPatternOperator op> : LoadD16Frag <op>, PrivateAddress; -class FlatLoadD16 <SDPatternOperator op> : LoadD16Frag <op>, FlatLoadAddress; - -def load_d16_hi_local : LocalLoadD16 <SIload_d16_hi>; -def az_extloadi8_d16_hi_local : LocalLoadD16 <SIload_d16_hi_u8>; -def sextloadi8_d16_hi_local : LocalLoadD16 <SIload_d16_hi_i8>; - -def load_d16_hi_global : GlobalLoadD16 <SIload_d16_hi>; -def az_extloadi8_d16_hi_global : GlobalLoadD16 <SIload_d16_hi_u8>; -def sextloadi8_d16_hi_global : GlobalLoadD16 <SIload_d16_hi_i8>; - -def load_d16_hi_private : PrivateLoadD16 <SIload_d16_hi>; -def az_extloadi8_d16_hi_private : PrivateLoadD16 <SIload_d16_hi_u8>; -def sextloadi8_d16_hi_private : PrivateLoadD16 <SIload_d16_hi_i8>; +class LoadD16Frag <SDPatternOperator op> : PatFrag< + (ops node:$ptr, node:$tied_in), + (op node:$ptr, node:$tied_in)> { + let IsLoad = 1; +} -def load_d16_hi_flat : FlatLoadD16 <SIload_d16_hi>; -def az_extloadi8_d16_hi_flat : FlatLoadD16 <SIload_d16_hi_u8>; -def sextloadi8_d16_hi_flat : FlatLoadD16 <SIload_d16_hi_i8>; +foreach as = [ "global", "flat", "constant", "local", "private", "region" ] in { +let AddressSpaces = !cast<AddressSpaceList>("LoadAddress_"#as).AddrSpaces in { +def load_d16_hi_#as : LoadD16Frag <SIload_d16_hi>; -def load_d16_lo_local : LocalLoadD16 <SIload_d16_lo>; -def az_extloadi8_d16_lo_local : LocalLoadD16 <SIload_d16_lo_u8>; -def sextloadi8_d16_lo_local : LocalLoadD16 <SIload_d16_lo_i8>; +def az_extloadi8_d16_hi_#as : LoadD16Frag <SIload_d16_hi_u8> { + let MemoryVT = i8; +} -def load_d16_lo_global : GlobalLoadD16 <SIload_d16_lo>; -def az_extloadi8_d16_lo_global : GlobalLoadD16 <SIload_d16_lo_u8>; -def sextloadi8_d16_lo_global : GlobalLoadD16 <SIload_d16_lo_i8>; +def sextloadi8_d16_hi_#as : LoadD16Frag <SIload_d16_hi_i8> { + let MemoryVT = i8; +} -def load_d16_lo_private : PrivateLoadD16 <SIload_d16_lo>; -def az_extloadi8_d16_lo_private : PrivateLoadD16 <SIload_d16_lo_u8>; -def sextloadi8_d16_lo_private : PrivateLoadD16 <SIload_d16_lo_i8>; +def load_d16_lo_#as : LoadD16Frag <SIload_d16_lo>; -def load_d16_lo_flat : FlatLoadD16 <SIload_d16_lo>; -def az_extloadi8_d16_lo_flat : FlatLoadD16 <SIload_d16_lo_u8>; -def sextloadi8_d16_lo_flat : FlatLoadD16 <SIload_d16_lo_i8>; +def az_extloadi8_d16_lo_#as : LoadD16Frag <SIload_d16_lo_u8> { + let MemoryVT = i8; +} +def sextloadi8_d16_lo_#as : LoadD16Frag <SIload_d16_lo_i8> { + let MemoryVT = i8; +} +} // End let AddressSpaces = ... +} // End foreach AddrSpace def lshr_rev : PatFrag < (ops node:$src1, node:$src0), @@ -687,6 +677,10 @@ def as_i16imm : SDNodeXForm<imm, [{ return CurDAG->getTargetConstant(N->getSExtValue(), SDLoc(N), MVT::i16); }]>; +def as_i16timm : SDNodeXForm<timm, [{ + return CurDAG->getTargetConstant(N->getSExtValue(), SDLoc(N), MVT::i16); +}]>; + def as_i32imm: SDNodeXForm<imm, [{ return CurDAG->getTargetConstant(N->getSExtValue(), SDLoc(N), MVT::i32); }]>; @@ -738,14 +732,27 @@ def i64imm_32bit : ImmLeaf<i64, [{ return (Imm & 0xffffffffULL) == static_cast<uint64_t>(Imm); }]>; -class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{ - return isInlineImmediate(N); +def InlineImm16 : ImmLeaf<i16, [{ + return isInlineImmediate16(Imm); +}]>; + +def InlineImm32 : ImmLeaf<i32, [{ + return isInlineImmediate32(Imm); +}]>; + +def InlineImm64 : ImmLeaf<i64, [{ + return isInlineImmediate64(Imm); }]>; -class InlineFPImm <ValueType vt> : PatLeaf <(vt fpimm), [{ - return isInlineImmediate(N); +def InlineImmFP32 : FPImmLeaf<f32, [{ + return isInlineImmediate(Imm); }]>; +def InlineImmFP64 : FPImmLeaf<f64, [{ + return isInlineImmediate(Imm); +}]>; + + class VGPRImm <dag frag> : PatLeaf<frag, [{ return isVGPRImm(N); }]>; @@ -763,8 +770,8 @@ def NegSubInlineConst16 : ImmLeaf<i16, [{ return Imm < -16 && Imm >= -64; }], NegateImm>; -def ShiftAmt32Imm : PatLeaf <(imm), [{ - return N->getZExtValue() < 32; +def ShiftAmt32Imm : ImmLeaf <i32, [{ + return Imm < 32; }]>; def getNegV2I16Imm : SDNodeXForm<build_vector, [{ @@ -996,6 +1003,12 @@ class NamedOperandBit<string Name, AsmOperandClass MatchClass> : Operand<i1> { let ParserMatchClass = MatchClass; } +class NamedOperandBit_0<string Name, AsmOperandClass MatchClass> : + OperandWithDefaultOps<i1, (ops (i1 0))> { + let PrintMethod = "print"#Name; + let ParserMatchClass = MatchClass; +} + class NamedOperandU8<string Name, AsmOperandClass MatchClass> : Operand<i8> { let PrintMethod = "print"#Name; let ParserMatchClass = MatchClass; @@ -1011,6 +1024,12 @@ class NamedOperandU32<string Name, AsmOperandClass MatchClass> : Operand<i32> { let ParserMatchClass = MatchClass; } +class NamedOperandU32_0<string Name, AsmOperandClass MatchClass> : + OperandWithDefaultOps<i32, (ops (i32 0))> { + let PrintMethod = "print"#Name; + let ParserMatchClass = MatchClass; +} + class NamedOperandU32Default0<string Name, AsmOperandClass MatchClass> : OperandWithDefaultOps<i32, (ops (i32 0))> { let PrintMethod = "print"#Name; @@ -1031,7 +1050,13 @@ def offset1 : NamedOperandU8<"Offset1", NamedMatchClass<"Offset1">>; def gds : NamedOperandBit<"GDS", NamedMatchClass<"GDS">>; def omod : NamedOperandU32<"OModSI", NamedMatchClass<"OModSI">>; +def omod0 : NamedOperandU32_0<"OModSI", NamedMatchClass<"OModSI">>; + +// We need to make the cases with a default of 0 distinct from no +// default to help deal with some cases where the operand appears +// before a mandatory operand. def clampmod : NamedOperandBit<"ClampSI", NamedMatchClass<"ClampSI">>; +def clampmod0 : NamedOperandBit_0<"ClampSI", NamedMatchClass<"ClampSI">>; def highmod : NamedOperandBit<"High", NamedMatchClass<"High">>; def DLC : NamedOperandBit<"DLC", NamedMatchClass<"DLC">>; @@ -1245,7 +1270,6 @@ def MOVRELOffset : ComplexPattern<i32, 2, "SelectMOVRELOffset">; def VOP3Mods0 : ComplexPattern<untyped, 4, "SelectVOP3Mods0">; def VOP3Mods0Clamp : ComplexPattern<untyped, 3, "SelectVOP3Mods0Clamp">; -def VOP3Mods0Clamp0OMod : ComplexPattern<untyped, 4, "SelectVOP3Mods0Clamp0OMod">; def VOP3Mods : ComplexPattern<untyped, 2, "SelectVOP3Mods">; def VOP3NoMods : ComplexPattern<untyped, 1, "SelectVOP3NoMods">; // VOP3Mods, but the input source is known to never be NaN. @@ -1381,7 +1405,7 @@ multiclass EXP_m<bit done, SDPatternOperator node> { def _si : EXP_Helper<done>, SIMCInstr <"exp"#!if(done, "_done", ""), SIEncodingFamily.SI>, EXPe { - let AssemblerPredicates = [isGFX6GFX7]; + let AssemblerPredicate = isGFX6GFX7; let DecoderNamespace = "GFX6GFX7"; let DisableDecoder = DisableSIDecoder; } @@ -1389,7 +1413,7 @@ multiclass EXP_m<bit done, SDPatternOperator node> { def _vi : EXP_Helper<done>, SIMCInstr <"exp"#!if(done, "_done", ""), SIEncodingFamily.VI>, EXPe_vi { - let AssemblerPredicates = [isGFX8GFX9]; + let AssemblerPredicate = isGFX8GFX9; let DecoderNamespace = "GFX8"; let DisableDecoder = DisableVIDecoder; } @@ -1397,7 +1421,7 @@ multiclass EXP_m<bit done, SDPatternOperator node> { def _gfx10 : EXP_Helper<done>, SIMCInstr <"exp"#!if(done, "_done", ""), SIEncodingFamily.GFX10>, EXPe { - let AssemblerPredicates = [isGFX10Plus]; + let AssemblerPredicate = isGFX10Plus; let DecoderNamespace = "GFX10"; let DisableDecoder = DisableSIDecoder; } @@ -1587,11 +1611,11 @@ class getIns64 <RegisterOperand Src0RC, RegisterOperand Src1RC, !if (!eq(HasModifiers, 1), // VOP1 with modifiers (ins Src0Mod:$src0_modifiers, Src0RC:$src0, - clampmod:$clamp, omod:$omod) + clampmod0:$clamp, omod0:$omod) /* else */, // VOP1 without modifiers !if (!eq(HasIntClamp, 1), - (ins Src0RC:$src0, clampmod:$clamp), + (ins Src0RC:$src0, clampmod0:$clamp), (ins Src0RC:$src0)) /* endif */ ), !if (!eq(NumSrcArgs, 2), @@ -1600,14 +1624,14 @@ class getIns64 <RegisterOperand Src0RC, RegisterOperand Src1RC, !if( !eq(HasOMod, 1), (ins Src0Mod:$src0_modifiers, Src0RC:$src0, Src1Mod:$src1_modifiers, Src1RC:$src1, - clampmod:$clamp, omod:$omod), + clampmod0:$clamp, omod0:$omod), (ins Src0Mod:$src0_modifiers, Src0RC:$src0, Src1Mod:$src1_modifiers, Src1RC:$src1, - clampmod:$clamp)) + clampmod0:$clamp)) /* else */, // VOP2 without modifiers !if (!eq(HasIntClamp, 1), - (ins Src0RC:$src0, Src1RC:$src1, clampmod:$clamp), + (ins Src0RC:$src0, Src1RC:$src1, clampmod0:$clamp), (ins Src0RC:$src0, Src1RC:$src1)) /* endif */ ) @@ -1619,12 +1643,12 @@ class getIns64 <RegisterOperand Src0RC, RegisterOperand Src1RC, (ins Src0Mod:$src0_modifiers, Src0RC:$src0, Src1Mod:$src1_modifiers, Src1RC:$src1, Src2Mod:$src2_modifiers, Src2RC:$src2, - clampmod:$clamp, omod:$omod), + clampmod0:$clamp, omod0:$omod), !if (!eq(HasIntClamp, 1), (ins Src0Mod:$src0_modifiers, Src0RC:$src0, Src1Mod:$src1_modifiers, Src1RC:$src1, Src2Mod:$src2_modifiers, Src2RC:$src2, - clampmod:$clamp), + clampmod0:$clamp), (ins Src0Mod:$src0_modifiers, Src0RC:$src0, Src1Mod:$src1_modifiers, Src1RC:$src1, Src2Mod:$src2_modifiers, Src2RC:$src2))), @@ -1632,18 +1656,18 @@ class getIns64 <RegisterOperand Src0RC, RegisterOperand Src1RC, !if (!eq(HasOMod, 1), (ins Src0Mod:$src0_modifiers, Src0RC:$src0, Src1Mod:$src1_modifiers, Src1RC:$src1, - Src2RC:$src2, clampmod:$clamp, omod:$omod), + Src2RC:$src2, clampmod0:$clamp, omod0:$omod), !if (!eq(HasIntClamp, 1), (ins Src0Mod:$src0_modifiers, Src0RC:$src0, Src1Mod:$src1_modifiers, Src1RC:$src1, - Src2RC:$src2, clampmod:$clamp), + Src2RC:$src2, clampmod0:$clamp), (ins Src0Mod:$src0_modifiers, Src0RC:$src0, Src1Mod:$src1_modifiers, Src1RC:$src1, Src2RC:$src2)))) /* else */, // VOP3 without modifiers !if (!eq(HasIntClamp, 1), - (ins Src0RC:$src0, Src1RC:$src1, Src2RC:$src2, clampmod:$clamp), + (ins Src0RC:$src0, Src1RC:$src1, Src2RC:$src2, clampmod0:$clamp), (ins Src0RC:$src0, Src1RC:$src1, Src2RC:$src2)) /* endif */ )))); } |