From 3db921673e0760a324c405cbf10be3af1dde9388 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Mon, 9 Mar 2015 18:49:54 +0000 Subject: [PATCH] R600/SI: Move gds operand to the end of operand list Also print it in the assembly string. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231684 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../R600/InstPrinter/AMDGPUInstPrinter.cpp | 6 +++ .../R600/InstPrinter/AMDGPUInstPrinter.h | 1 + lib/Target/R600/SIInstrInfo.td | 49 ++++++++++--------- lib/Target/R600/SIInstructions.td | 18 +++---- lib/Target/R600/SILoadStoreOptimizer.cpp | 4 +- 5 files changed, 44 insertions(+), 34 deletions(-) diff --git a/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp b/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp index b66ed100025..efac73b5aa4 100644 --- a/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp +++ b/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp @@ -99,6 +99,12 @@ void AMDGPUInstPrinter::printDSOffset1(const MCInst *MI, unsigned OpNo, printU8ImmDecOperand(MI, OpNo, O); } +void AMDGPUInstPrinter::printGDS(const MCInst *MI, unsigned OpNo, + raw_ostream &O) { + if (MI->getOperand(OpNo).getImm()) + O << " gds"; +} + void AMDGPUInstPrinter::printGLC(const MCInst *MI, unsigned OpNo, raw_ostream &O) { if (MI->getOperand(OpNo).getImm()) diff --git a/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.h b/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.h index 1d43c7acbe7..23376490b04 100644 --- a/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.h +++ b/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.h @@ -44,6 +44,7 @@ private: void printDSOffset(const MCInst *MI, unsigned OpNo, raw_ostream &O); void printDSOffset0(const MCInst *MI, unsigned OpNo, raw_ostream &O); void printDSOffset1(const MCInst *MI, unsigned OpNo, raw_ostream &O); + void printGDS(const MCInst *MI, unsigned OpNo, raw_ostream &O); void printGLC(const MCInst *MI, unsigned OpNo, raw_ostream &O); void printSLC(const MCInst *MI, unsigned OpNo, raw_ostream &O); void printTFE(const MCInst *MI, unsigned OpNo, raw_ostream &O); diff --git a/lib/Target/R600/SIInstrInfo.td b/lib/Target/R600/SIInstrInfo.td index 2830f0672b6..7a313326bd6 100644 --- a/lib/Target/R600/SIInstrInfo.td +++ b/lib/Target/R600/SIInstrInfo.td @@ -264,6 +264,9 @@ def ds_offset0 : Operand { def ds_offset1 : Operand { let PrintMethod = "printDSOffset1"; } +def gds : Operand { + let PrintMethod = "printGDS"; +} def glc : Operand { let PrintMethod = "printGLC"; } @@ -1503,8 +1506,8 @@ class DS_Off16_Real_vi op, string opName, dag outs, dag ins, string asm multiclass DS_1A_RET op, string opName, RegisterClass rc, dag outs = (outs rc:$vdst), - dag ins = (ins i1imm:$gds, VGPR_32:$addr, ds_offset:$offset, M0Reg:$m0), - string asm = opName#" $vdst, $addr"#"$offset"> { + dag ins = (ins VGPR_32:$addr, ds_offset:$offset, gds:$gds, M0Reg:$m0), + string asm = opName#" $vdst, $addr"#"$offset$gds"> { def "" : DS_Pseudo ; @@ -1516,9 +1519,9 @@ multiclass DS_1A_RET op, string opName, RegisterClass rc, multiclass DS_1A_Off8_RET op, string opName, RegisterClass rc, dag outs = (outs rc:$vdst), - dag ins = (ins i1imm:$gds, VGPR_32:$addr, ds_offset0:$offset0, - ds_offset1:$offset1, M0Reg:$m0), - string asm = opName#" $vdst, $addr"#"$offset0"#"$offset1"> { + dag ins = (ins VGPR_32:$addr, ds_offset0:$offset0, ds_offset1:$offset1, + gds:$gds, M0Reg:$m0), + string asm = opName#" $vdst, $addr"#"$offset0"#"$offset1$gds"> { def "" : DS_Pseudo ; @@ -1530,9 +1533,9 @@ multiclass DS_1A_Off8_RET op, string opName, RegisterClass rc, multiclass DS_1A1D_NORET op, string opName, RegisterClass rc, dag outs = (outs), - dag ins = (ins i1imm:$gds, VGPR_32:$addr, rc:$data0, ds_offset:$offset, + dag ins = (ins VGPR_32:$addr, rc:$data0, ds_offset:$offset, gds:$gds, M0Reg:$m0), - string asm = opName#" $addr, $data0"#"$offset"> { + string asm = opName#" $addr, $data0"#"$offset$gds"> { def "" : DS_Pseudo , AtomicNoRet; @@ -1545,9 +1548,9 @@ multiclass DS_1A1D_NORET op, string opName, RegisterClass rc, multiclass DS_1A1D_Off8_NORET op, string opName, RegisterClass rc, dag outs = (outs), - dag ins = (ins i1imm:$gds, VGPR_32:$addr, rc:$data0, rc:$data1, - ds_offset0:$offset0, ds_offset1:$offset1, M0Reg:$m0), - string asm = opName#" $addr, $data0, $data1"#"$offset0"#"$offset1"> { + dag ins = (ins VGPR_32:$addr, rc:$data0, rc:$data1, + ds_offset0:$offset0, ds_offset1:$offset1, gds:$gds, M0Reg:$m0), + string asm = opName#" $addr, $data0, $data1"#"$offset0"#"$offset1"#"$gds"> { def "" : DS_Pseudo ; @@ -1560,9 +1563,9 @@ multiclass DS_1A1D_Off8_NORET op, string opName, RegisterClass rc, multiclass DS_1A1D_RET op, string opName, RegisterClass rc, string noRetOp = "", dag outs = (outs rc:$vdst), - dag ins = (ins i1imm:$gds, VGPR_32:$addr, rc:$data0, ds_offset:$offset, + dag ins = (ins VGPR_32:$addr, rc:$data0, ds_offset:$offset, gds:$gds, M0Reg:$m0), - string asm = opName#" $vdst, $addr, $data0"#"$offset"> { + string asm = opName#" $vdst, $addr, $data0"#"$offset$gds"> { def "" : DS_Pseudo , AtomicNoRet; @@ -1576,7 +1579,7 @@ multiclass DS_1A1D_RET op, string opName, RegisterClass rc, multiclass DS_1A2D_RET_m op, string opName, RegisterClass rc, string noRetOp = "", dag ins, dag outs = (outs rc:$vdst), - string asm = opName#" $vdst, $addr, $data0, $data1"#"$offset"> { + string asm = opName#" $vdst, $addr, $data0, $data1"#"$offset"#"$gds"> { def "" : DS_Pseudo , AtomicNoRet; @@ -1588,16 +1591,16 @@ multiclass DS_1A2D_RET_m op, string opName, RegisterClass rc, multiclass DS_1A2D_RET op, string asm, RegisterClass rc, string noRetOp = "", RegisterClass src = rc> : DS_1A2D_RET_m ; multiclass DS_1A2D_NORET op, string opName, RegisterClass rc, string noRetOp = opName, dag outs = (outs), - dag ins = (ins i1imm:$gds, VGPR_32:$addr, rc:$data0, rc:$data1, - ds_offset:$offset, M0Reg:$m0), - string asm = opName#" $addr, $data0, $data1"#"$offset"> { + dag ins = (ins VGPR_32:$addr, rc:$data0, rc:$data1, + ds_offset:$offset, gds:$gds, M0Reg:$m0), + string asm = opName#" $addr, $data0, $data1"#"$offset"#"$gds"> { def "" : DS_Pseudo , AtomicNoRet; @@ -1610,8 +1613,8 @@ multiclass DS_1A2D_NORET op, string opName, RegisterClass rc, multiclass DS_0A_RET op, string opName, dag outs = (outs VGPR_32:$vdst), - dag ins = (ins i1imm:$gds, ds_offset:$offset, M0Reg:$m0), - string asm = opName#" $vdst $offset"> { + dag ins = (ins ds_offset:$offset, gds:$gds, M0Reg:$m0), + string asm = opName#" $vdst"#"$offset"#"$gds"> { let mayLoad = 1, mayStore = 1 in { def "" : DS_Pseudo ; @@ -1626,7 +1629,7 @@ multiclass DS_0A_RET op, string opName, multiclass DS_1A_RET_GDS op, string opName, dag outs = (outs VGPR_32:$vdst), dag ins = (ins VGPR_32:$addr, ds_offset:$offset, M0Reg:$m0), - string asm = opName#" $vdst, $addr $offset"> { + string asm = opName#" $vdst, $addr"#"$offset gds"> { def "" : DS_Pseudo ; @@ -1651,8 +1654,8 @@ multiclass DS_1A_GDS op, string opName, multiclass DS_1A op, string opName, dag outs = (outs), - dag ins = (ins i1imm:$gds, VGPR_32:$addr, ds_offset:$offset, M0Reg:$m0), - string asm = opName#" $addr $offset"> { + dag ins = (ins VGPR_32:$addr, ds_offset:$offset, M0Reg:$m0, gds:$gds), + string asm = opName#" $addr"#"$offset"#"$gds"> { let mayLoad = 1, mayStore = 1 in { def "" : DS_Pseudo ; diff --git a/lib/Target/R600/SIInstructions.td b/lib/Target/R600/SIInstructions.td index b0025dc03bc..8ba89a47b27 100644 --- a/lib/Target/R600/SIInstructions.td +++ b/lib/Target/R600/SIInstructions.td @@ -2846,7 +2846,7 @@ def : ROTRPattern ; class DSReadPat : Pat < (vt (frag (DS1Addr1Offset i32:$ptr, i32:$offset))), - (inst (i1 0), $ptr, (as_i16imm $offset), (S_MOV_B32 -1)) + (inst $ptr, (as_i16imm $offset), (i1 0), (S_MOV_B32 -1)) >; def : DSReadPat ; @@ -2864,12 +2864,12 @@ def : DSReadPat ; def : Pat < (v2i32 (local_load (DS64Bit4ByteAligned i32:$ptr, i8:$offset0, i8:$offset1))), - (DS_READ2_B32 (i1 0), $ptr, $offset0, $offset1, (S_MOV_B32 -1)) + (DS_READ2_B32 $ptr, $offset0, $offset1, (i1 0), (S_MOV_B32 -1)) >; class DSWritePat : Pat < (frag vt:$value, (DS1Addr1Offset i32:$ptr, i32:$offset)), - (inst (i1 0), $ptr, $value, (as_i16imm $offset), (S_MOV_B32 -1)) + (inst $ptr, $value, (as_i16imm $offset), (i1 0), (S_MOV_B32 -1)) >; def : DSWritePat ; @@ -2884,14 +2884,14 @@ def : DSWritePat ; def : Pat < (local_store v2i32:$value, (DS64Bit4ByteAligned i32:$ptr, i8:$offset0, i8:$offset1)), - (DS_WRITE2_B32 (i1 0), $ptr, (EXTRACT_SUBREG $value, sub0), - (EXTRACT_SUBREG $value, sub1), $offset0, $offset1, - (S_MOV_B32 -1)) + (DS_WRITE2_B32 $ptr, (EXTRACT_SUBREG $value, sub0), + (EXTRACT_SUBREG $value, sub1), $offset0, $offset1, + (i1 0), (S_MOV_B32 -1)) >; class DSAtomicRetPat : Pat < (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$value), - (inst (i1 0), $ptr, $value, (as_i16imm $offset), (S_MOV_B32 -1)) + (inst $ptr, $value, (as_i16imm $offset), (i1 0), (S_MOV_B32 -1)) >; // Special case of DSAtomicRetPat for add / sub 1 -> inc / dec @@ -2907,13 +2907,13 @@ class DSAtomicRetPat : Pat < class DSAtomicIncRetPat : Pat < (frag (DS1Addr1Offset i32:$ptr, i32:$offset), (vt 1)), - (inst (i1 0), $ptr, (LoadImm (vt -1)), (as_i16imm $offset), (S_MOV_B32 -1)) + (inst $ptr, (LoadImm (vt -1)), (as_i16imm $offset), (i1 0), (S_MOV_B32 -1)) >; class DSAtomicCmpXChg : Pat < (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$cmp, vt:$swap), - (inst (i1 0), $ptr, $cmp, $swap, (as_i16imm $offset), (S_MOV_B32 -1)) + (inst $ptr, $cmp, $swap, (as_i16imm $offset), (i1 0), (S_MOV_B32 -1)) >; diff --git a/lib/Target/R600/SILoadStoreOptimizer.cpp b/lib/Target/R600/SILoadStoreOptimizer.cpp index 46630d073d9..3d96fe5bc5c 100644 --- a/lib/Target/R600/SILoadStoreOptimizer.cpp +++ b/lib/Target/R600/SILoadStoreOptimizer.cpp @@ -249,10 +249,10 @@ MachineBasicBlock::iterator SILoadStoreOptimizer::mergeRead2Pair( DebugLoc DL = I->getDebugLoc(); MachineInstrBuilder Read2 = BuildMI(*MBB, I, DL, Read2Desc, DestReg) - .addImm(0) // gds .addOperand(*AddrReg) // addr .addImm(NewOffset0) // offset0 .addImm(NewOffset1) // offset1 + .addImm(0) // gds .addOperand(*M0Reg) // M0 .addMemOperand(*I->memoperands_begin()) .addMemOperand(*Paired->memoperands_begin()); @@ -332,12 +332,12 @@ MachineBasicBlock::iterator SILoadStoreOptimizer::mergeWrite2Pair( MachineInstrBuilder Write2 = BuildMI(*MBB, I, DL, Write2Desc) - .addImm(0) // gds .addOperand(*Addr) // addr .addOperand(*Data0) // data0 .addOperand(*Data1) // data1 .addImm(NewOffset0) // offset0 .addImm(NewOffset1) // offset1 + .addImm(0) // gds .addOperand(*M0Reg) // m0 .addMemOperand(*I->memoperands_begin()) .addMemOperand(*Paired->memoperands_begin()); -- 2.34.1