diff options
Diffstat (limited to 'lib/Target/AMDGPU/SIInstrFormats.td')
| -rw-r--r-- | lib/Target/AMDGPU/SIInstrFormats.td | 124 |
1 files changed, 86 insertions, 38 deletions
diff --git a/lib/Target/AMDGPU/SIInstrFormats.td b/lib/Target/AMDGPU/SIInstrFormats.td index 0e883f64caa3..2f63d4ed13b3 100644 --- a/lib/Target/AMDGPU/SIInstrFormats.td +++ b/lib/Target/AMDGPU/SIInstrFormats.td @@ -11,8 +11,9 @@ // //===----------------------------------------------------------------------===// -class InstSI <dag outs, dag ins, string asm, list<dag> pattern> : - AMDGPUInst<outs, ins, asm, pattern>, PredicateControl { +class InstSI <dag outs, dag ins, string asm = "", + list<dag> pattern = []> : + AMDGPUInst<outs, ins, asm, pattern>, PredicateControl { field bits<1> VM_CNT = 0; field bits<1> EXP_CNT = 0; @@ -31,6 +32,8 @@ class InstSI <dag outs, dag ins, string asm, list<dag> pattern> : field bits<1> VOP2 = 0; field bits<1> VOP3 = 0; field bits<1> VOPC = 0; + field bits<1> SDWA = 0; + field bits<1> DPP = 0; field bits<1> MUBUF = 0; field bits<1> MTBUF = 0; @@ -45,6 +48,8 @@ class InstSI <dag outs, dag ins, string asm, list<dag> pattern> : // is unable to infer the encoding from the operands. field bits<1> VOPAsmPrefer32Bit = 0; + field bits<1> Gather4 = 0; + // These need to be kept in sync with the enum in SIInstrFlags. let TSFlags{0} = VM_CNT; let TSFlags{1} = EXP_CNT; @@ -63,18 +68,33 @@ class InstSI <dag outs, dag ins, string asm, list<dag> pattern> : let TSFlags{11} = VOP2; let TSFlags{12} = VOP3; let TSFlags{13} = VOPC; + let TSFlags{14} = SDWA; + let TSFlags{15} = DPP; - let TSFlags{14} = MUBUF; - let TSFlags{15} = MTBUF; - let TSFlags{16} = SMRD; - let TSFlags{17} = DS; - let TSFlags{18} = MIMG; - let TSFlags{19} = FLAT; - let TSFlags{20} = WQM; - let TSFlags{21} = VGPRSpill; - let TSFlags{22} = VOPAsmPrefer32Bit; + let TSFlags{16} = MUBUF; + let TSFlags{17} = MTBUF; + let TSFlags{18} = SMRD; + let TSFlags{19} = DS; + let TSFlags{20} = MIMG; + let TSFlags{21} = FLAT; + let TSFlags{22} = WQM; + let TSFlags{23} = VGPRSpill; + let TSFlags{24} = VOPAsmPrefer32Bit; + let TSFlags{25} = Gather4; let SchedRW = [Write32Bit]; + + field bits<1> DisableSIDecoder = 0; + field bits<1> DisableVIDecoder = 0; + field bits<1> DisableDecoder = 0; + + let isAsmParserOnly = !if(!eq(DisableDecoder{0}, {0}), 0, 1); +} + +class PseudoInstSI<dag outs, dag ins, list<dag> pattern = []> + : InstSI<outs, ins, "", pattern> { + let isPseudo = 1; + let isCodeGenOnly = 1; } class Enc32 { @@ -123,8 +143,10 @@ class VOP2Common <dag outs, dag ins, string asm, list<dag> pattern> : let Size = 4; } -class VOP3Common <dag outs, dag ins, string asm, list<dag> pattern> : - VOPAnyCommon <outs, ins, asm, pattern> { +class VOP3Common <dag outs, dag ins, string asm = "", + list<dag> pattern = [], bit HasMods = 0, + bit VOP3Only = 0> : + VOPAnyCommon <outs, ins, asm, pattern> { // Using complex patterns gives VOP3 patterns a very high complexity rating, // but standalone patterns are almost always prefered, so we need to adjust the @@ -135,7 +157,11 @@ class VOP3Common <dag outs, dag ins, string asm, list<dag> pattern> : let VOP3 = 1; let VALU = 1; - let AsmMatchConverter = "cvtVOP3"; + let AsmMatchConverter = + !if(!eq(VOP3Only,1), + "cvtVOP3", + !if(!eq(HasMods,1), "cvtVOP3_2_mod", "")); + let isCodeGenOnly = 0; int Size = 8; @@ -154,9 +180,9 @@ class VOP3Common <dag outs, dag ins, string asm, list<dag> pattern> : class SOP1e <bits<8> op> : Enc32 { bits<7> sdst; - bits<8> ssrc0; + bits<8> src0; - let Inst{7-0} = ssrc0; + let Inst{7-0} = src0; let Inst{15-8} = op; let Inst{22-16} = sdst; let Inst{31-23} = 0x17d; //encoding; @@ -164,22 +190,22 @@ class SOP1e <bits<8> op> : Enc32 { class SOP2e <bits<7> op> : Enc32 { bits<7> sdst; - bits<8> ssrc0; - bits<8> ssrc1; + bits<8> src0; + bits<8> src1; - let Inst{7-0} = ssrc0; - let Inst{15-8} = ssrc1; + let Inst{7-0} = src0; + let Inst{15-8} = src1; let Inst{22-16} = sdst; let Inst{29-23} = op; let Inst{31-30} = 0x2; // encoding } class SOPCe <bits<7> op> : Enc32 { - bits<8> ssrc0; - bits<8> ssrc1; + bits<8> src0; + bits<8> src1; - let Inst{7-0} = ssrc0; - let Inst{15-8} = ssrc1; + let Inst{7-0} = src0; + let Inst{15-8} = src1; let Inst{22-16} = op; let Inst{31-23} = 0x17e; } @@ -218,9 +244,7 @@ class SOPPe <bits<7> op> : Enc32 { class SMRDe <bits<5> op, bits<1> imm> : Enc32 { bits<7> sdst; bits<7> sbase; - bits<8> offset; - let Inst{7-0} = offset; let Inst{8} = imm; let Inst{14-9} = sbase{6-1}; let Inst{21-15} = sdst; @@ -228,6 +252,18 @@ class SMRDe <bits<5> op, bits<1> imm> : Enc32 { let Inst{31-27} = 0x18; //encoding } +class SMRD_IMMe <bits<5> op> : SMRDe<op, 1> { + bits<8> offset; + let Inst{7-0} = offset; +} + +class SMRD_SOFFe <bits<5> op> : SMRDe<op, 0> { + bits<8> soff; + let Inst{7-0} = soff; +} + + + class SMRD_IMMe_ci <bits<5> op> : Enc64 { bits<7> sdst; bits<7> sbase; @@ -348,19 +384,18 @@ class VOP2_MADKe <bits<6> op> : Enc64 { bits<8> vdst; bits<9> src0; - bits<8> vsrc1; - bits<32> src2; + bits<8> src1; + bits<32> imm; let Inst{8-0} = src0; - let Inst{16-9} = vsrc1; + let Inst{16-9} = src1; let Inst{24-17} = vdst; let Inst{30-25} = op; let Inst{31} = 0x0; // encoding - let Inst{63-32} = src2; + let Inst{63-32} = imm; } -class VOP3e <bits<9> op> : Enc64 { - bits<8> vdst; +class VOP3a <bits<9> op> : Enc64 { bits<2> src0_modifiers; bits<9> src0; bits<2> src1_modifiers; @@ -370,7 +405,6 @@ class VOP3e <bits<9> op> : Enc64 { bits<1> clamp; bits<2> omod; - let Inst{7-0} = vdst; let Inst{8} = src0_modifiers{1}; let Inst{9} = src1_modifiers{1}; let Inst{10} = src2_modifiers{1}; @@ -386,6 +420,20 @@ class VOP3e <bits<9> op> : Enc64 { let Inst{63} = src2_modifiers{0}; } +class VOP3e <bits<9> op> : VOP3a <op> { + bits<8> vdst; + + let Inst{7-0} = vdst; +} + +// Encoding used for VOPC instructions encoded as VOP3 +// Differs from VOP3e by destination name (sdst) as VOPC doesn't have vector dst +class VOP3ce <bits<9> op> : VOP3a <op> { + bits<8> sdst; + + let Inst{7-0} = sdst; +} + class VOP3be <bits<9> op> : Enc64 { bits<8> vdst; bits<2> src0_modifiers; @@ -412,10 +460,10 @@ class VOP3be <bits<9> op> : Enc64 { class VOPCe <bits<8> op> : Enc32 { bits<9> src0; - bits<8> vsrc1; + bits<8> src1; let Inst{8-0} = src0; - let Inst{16-9} = vsrc1; + let Inst{16-9} = src1; let Inst{24-17} = op; let Inst{31-25} = 0x3e; } @@ -675,17 +723,17 @@ class FLAT <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> : let UseNamedOperandTable = 1; let hasSideEffects = 0; - let AsmMatchConverter = "cvtFlat"; let SchedRW = [WriteVMEM]; } -class MIMG <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> : - InstSI <outs, ins, asm, pattern>, MIMGe <op> { +class MIMG <dag outs, dag ins, string asm, list<dag> pattern> : + InstSI <outs, ins, asm, pattern> { let VM_CNT = 1; let EXP_CNT = 1; let MIMG = 1; let Uses = [EXEC]; + let UseNamedOperandTable = 1; let hasSideEffects = 0; // XXX ???? } |
