diff options
| author | Valery Pykhtin <Valery.Pykhtin@amd.com> | 2016-03-10 13:06:08 +0000 |
|---|---|---|
| committer | Valery Pykhtin <Valery.Pykhtin@amd.com> | 2016-03-10 13:06:08 +0000 |
| commit | a4db224d541b773f4e6d8fb7e546a5670d94464f (patch) | |
| tree | dcc39da08e03865c77f6ee052c7ace7555654d34 /llvm/lib/Target/AMDGPU | |
| parent | 7648dd375fd8dfc9f4468b2bf29ebc784837078d (diff) | |
| download | bcm5719-llvm-a4db224d541b773f4e6d8fb7e546a5670d94464f.tar.gz bcm5719-llvm-a4db224d541b773f4e6d8fb7e546a5670d94464f.zip | |
[AMDGPU] Fix SMEM instructions encoding/operand namings
Differential Revision: http://reviews.llvm.org/D17651
llvm-svn: 263108
Diffstat (limited to 'llvm/lib/Target/AMDGPU')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/SIInstrFormats.td | 14 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/SIInstrInfo.td | 96 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/SIInstructions.td | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/VIInstrFormats.td | 14 |
5 files changed, 91 insertions, 37 deletions
diff --git a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp index 32135f9236e..a3c58663ef8 100644 --- a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp +++ b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp @@ -66,10 +66,12 @@ DECODE_OPERAND(VReg_64) DECODE_OPERAND(VReg_96) DECODE_OPERAND(VReg_128) +DECODE_OPERAND(SGPR_32) DECODE_OPERAND(SReg_32) DECODE_OPERAND(SReg_64) DECODE_OPERAND(SReg_128) DECODE_OPERAND(SReg_256) +DECODE_OPERAND(SReg_512) #define GET_SUBTARGETINFO_ENUM #include "AMDGPUGenSubtargetInfo.inc" diff --git a/llvm/lib/Target/AMDGPU/SIInstrFormats.td b/llvm/lib/Target/AMDGPU/SIInstrFormats.td index ea7b6a1c138..f292dc9d031 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrFormats.td +++ b/llvm/lib/Target/AMDGPU/SIInstrFormats.td @@ -229,9 +229,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; @@ -239,6 +237,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; diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.td b/llvm/lib/Target/AMDGPU/SIInstrInfo.td index 6c00d854edc..49fbee561a4 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.td +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.td @@ -1083,53 +1083,88 @@ class SMRD_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> : let isCodeGenOnly = 1; } -class SMRD_Real_si <bits<5> op, string opName, bit imm, dag outs, dag ins, - string asm> : +class SMRD_IMM_Real_si <bits<5> op, string opName, dag outs, dag ins, + string asm> : + SMRD <outs, ins, asm, []>, + SMRD_IMMe <op>, + SIMCInstr<opName, SISubtarget.SI> { + let AssemblerPredicates = [isSICI]; + let DecoderNamespace = "SICI"; + let DisableDecoder = DisableSIDecoder; +} + +class SMRD_SOFF_Real_si <bits<5> op, string opName, dag outs, dag ins, + string asm> : SMRD <outs, ins, asm, []>, - SMRDe <op, imm>, + SMRD_SOFFe <op>, SIMCInstr<opName, SISubtarget.SI> { let AssemblerPredicates = [isSICI]; let DecoderNamespace = "SICI"; let DisableDecoder = DisableSIDecoder; } -class SMRD_Real_vi <bits<8> op, string opName, bit imm, dag outs, dag ins, - string asm, list<dag> pattern = []> : + +class SMRD_IMM_Real_vi <bits<8> op, string opName, dag outs, dag ins, + string asm, list<dag> pattern = []> : + SMRD <outs, ins, asm, pattern>, + SMEM_IMMe_vi <op>, + SIMCInstr<opName, SISubtarget.VI> { + let AssemblerPredicates = [isVI]; + let DecoderNamespace = "VI"; + let DisableDecoder = DisableVIDecoder; +} + +class SMRD_SOFF_Real_vi <bits<8> op, string opName, dag outs, dag ins, + string asm, list<dag> pattern = []> : SMRD <outs, ins, asm, pattern>, - SMEMe_vi <op, imm>, + SMEM_SOFFe_vi <op>, SIMCInstr<opName, SISubtarget.VI> { let AssemblerPredicates = [isVI]; let DecoderNamespace = "VI"; let DisableDecoder = DisableVIDecoder; } -multiclass SMRD_m <smrd op, string opName, bit imm, dag outs, dag ins, + +multiclass SMRD_IMM_m <smrd op, string opName, dag outs, dag ins, string asm, list<dag> pattern> { def "" : SMRD_Pseudo <opName, outs, ins, pattern>; - def _si : SMRD_Real_si <op.SI, opName, imm, outs, ins, asm>; + def _si : SMRD_IMM_Real_si <op.SI, opName, outs, ins, asm>; + + // glc is only applicable to scalar stores, which are not yet + // implemented. + let glc = 0 in { + def _vi : SMRD_IMM_Real_vi <op.VI, opName, outs, ins, asm>; + } +} + +multiclass SMRD_SOFF_m <smrd op, string opName, dag outs, dag ins, + string asm, list<dag> pattern> { + + def "" : SMRD_Pseudo <opName, outs, ins, pattern>; + + def _si : SMRD_SOFF_Real_si <op.SI, opName, outs, ins, asm>; // glc is only applicable to scalar stores, which are not yet // implemented. let glc = 0 in { - def _vi : SMRD_Real_vi <op.VI, opName, imm, outs, ins, asm>; + def _vi : SMRD_SOFF_Real_vi <op.VI, opName, outs, ins, asm>; } } multiclass SMRD_Special <smrd op, string opName, dag outs, + int sdst_ = ?, string opStr = "", list<dag> pattern = []> { let hasSideEffects = 1 in { def "" : SMRD_Pseudo <opName, outs, (ins), pattern>; - let sbase = 0, offset = 0 in { - let sdst = 0 in { - def _si : SMRD_Real_si <op.SI, opName, 0, outs, (ins), opName#opStr>; - } + let sbase = 0, soff = 0, sdst = sdst_ in { + def _si : SMRD_SOFF_Real_si <op.SI, opName, outs, (ins), opName#opStr>; - let glc = 0, sdata = 0 in { - def _vi : SMRD_Real_vi <op.VI, opName, 0, outs, (ins), opName#opStr>; + let glc = 0 in { + def _vi : SMRD_SOFF_Real_vi <op.VI, opName, outs, (ins), opName#opStr>; } } } @@ -1138,51 +1173,50 @@ multiclass SMRD_Special <smrd op, string opName, dag outs, multiclass SMRD_Inval <smrd op, string opName, SDPatternOperator node> { let mayStore = 1 in { - defm : SMRD_Special<op, opName, (outs), "", [(node)]>; + defm : SMRD_Special<op, opName, (outs), 0, "", [(node)]>; } } class SMEM_Inval <bits<8> op, string opName, SDPatternOperator node> : - SMRD_Real_vi<op, opName, 0, (outs), (ins), opName, [(node)]> { + SMRD_SOFF_Real_vi<op, opName, (outs), (ins), opName, [(node)]> { let hasSideEffects = 1; let mayStore = 1; let sbase = 0; - let sdata = 0; + let sdst = 0; let glc = 0; - let offset = 0; + let soff = 0; } class SMEM_Ret <bits<8> op, string opName, SDPatternOperator node> : - SMRD_Real_vi<op, opName, 0, (outs SReg_64:$dst), (ins), - opName#" $dst", [(set i64:$dst, (node))]> { + SMRD_SOFF_Real_vi<op, opName, (outs SReg_64:$sdst), (ins), + opName#" $sdst", [(set i64:$sdst, (node))]> { let hasSideEffects = 1; let mayStore = ?; let mayLoad = ?; let sbase = 0; - let sdata = 0; let glc = 0; - let offset = 0; + let soff = 0; } multiclass SMRD_Helper <smrd op, string opName, RegisterClass baseClass, RegisterClass dstClass> { - defm _IMM : SMRD_m < - op, opName#"_IMM", 1, (outs dstClass:$dst), + defm _IMM : SMRD_IMM_m < + op, opName#"_IMM", (outs dstClass:$sdst), (ins baseClass:$sbase, smrd_offset:$offset), - opName#" $dst, $sbase, $offset", [] + opName#" $sdst, $sbase, $offset", [] >; def _IMM_ci : SMRD < - (outs dstClass:$dst), (ins baseClass:$sbase, smrd_literal_offset:$offset), - opName#" $dst, $sbase, $offset", []>, SMRD_IMMe_ci <op.SI> { + (outs dstClass:$sdst), (ins baseClass:$sbase, smrd_literal_offset:$offset), + opName#" $sdst, $sbase, $offset", []>, SMRD_IMMe_ci <op.SI> { let AssemblerPredicates = [isCIOnly]; let DecoderNamespace = "CI"; } - defm _SGPR : SMRD_m < - op, opName#"_SGPR", 0, (outs dstClass:$dst), + defm _SGPR : SMRD_SOFF_m < + op, opName#"_SGPR", (outs dstClass:$sdst), (ins baseClass:$sbase, SReg_32:$soff), - opName#" $dst, $sbase, $soff", [] + opName#" $sdst, $sbase, $soff", [] >; } diff --git a/llvm/lib/Target/AMDGPU/SIInstructions.td b/llvm/lib/Target/AMDGPU/SIInstructions.td index 36f21197dae..7602498c274 100644 --- a/llvm/lib/Target/AMDGPU/SIInstructions.td +++ b/llvm/lib/Target/AMDGPU/SIInstructions.td @@ -94,7 +94,7 @@ let mayStore = ? in { // Pat. Each considers the other contradictory. defm S_MEMTIME : SMRD_Special <smrd<0x1e, 0x24>, "s_memtime", - (outs SReg_64:$dst), " $dst", [(set i64:$dst, (int_amdgcn_s_memtime))] + (outs SReg_64:$sdst), ?, " $sdst", [(set i64:$sdst, (int_amdgcn_s_memtime))] >; } diff --git a/llvm/lib/Target/AMDGPU/VIInstrFormats.td b/llvm/lib/Target/AMDGPU/VIInstrFormats.td index 8a1cee7adc1..d801a3d120e 100644 --- a/llvm/lib/Target/AMDGPU/VIInstrFormats.td +++ b/llvm/lib/Target/AMDGPU/VIInstrFormats.td @@ -91,19 +91,27 @@ class MTBUFe_vi <bits<4> op> : Enc64 { class SMEMe_vi <bits<8> op, bit imm> : Enc64 { bits<7> sbase; - bits<7> sdata; + bits<7> sdst; bits<1> glc; - bits<20> offset; let Inst{5-0} = sbase{6-1}; - let Inst{12-6} = sdata; + let Inst{12-6} = sdst; let Inst{16} = glc; let Inst{17} = imm; let Inst{25-18} = op; let Inst{31-26} = 0x30; //encoding +} + +class SMEM_IMMe_vi <bits<8> op> : SMEMe_vi<op, 1> { + bits<20> offset; let Inst{51-32} = offset; } +class SMEM_SOFFe_vi <bits<8> op> : SMEMe_vi<op, 0> { + bits<20> soff; + let Inst{51-32} = soff; +} + class VOP3a_vi <bits<10> op> : Enc64 { bits<2> src0_modifiers; bits<9> src0; |

