radeon/llvm: Fix VOPC and V_CNDMASK encoding
authorTom Stellard <thomas.stellard@amd.com>
Thu, 26 Jul 2012 12:41:00 +0000 (08:41 -0400)
committerTom Stellard <thomas.stellard@amd.com>
Fri, 27 Jul 2012 17:08:09 +0000 (17:08 +0000)
src/gallium/drivers/radeon/SIISelLowering.cpp
src/gallium/drivers/radeon/SIInstrFormats.td
src/gallium/drivers/radeon/SIInstrInfo.td
src/gallium/drivers/radeon/SIInstructions.td

index 5ce85e1770f4e6345d4285355d1ef77df852e9c7..591968a079d0046f23a257a6e29b785a87b75ec4 100644 (file)
@@ -179,12 +179,14 @@ void SITargetLowering::LowerSI_INTERP_CONST(MachineInstr *MI,
 void SITargetLowering::LowerSI_V_CNDLT(MachineInstr *MI, MachineBasicBlock &BB,
     MachineBasicBlock::iterator I, MachineRegisterInfo & MRI) const
 {
-  BuildMI(BB, I, BB.findDebugLoc(I), TII->get(AMDGPU::V_CMP_LT_F32_e32))
+  BuildMI(BB, I, BB.findDebugLoc(I), TII->get(AMDGPU::V_CMP_LT_F32_e32),
+          AMDGPU::VCC)
           .addOperand(MI->getOperand(1))
           .addReg(AMDGPU::SREG_LIT_0);
 
   BuildMI(BB, I, BB.findDebugLoc(I), TII->get(AMDGPU::V_CNDMASK_B32))
           .addOperand(MI->getOperand(0))
+         .addReg(AMDGPU::VCC)
           .addOperand(MI->getOperand(2))
           .addOperand(MI->getOperand(3));
 
index 3d9d47489d75ae2e116933bddfdb131162b6a999..8f56e21f5a69819a14f04fc19e5b2fde906d8f34 100644 (file)
@@ -100,7 +100,7 @@ class SOPK_64 <bits<5> op, string opName, list<dag> pattern>
 class VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
                  string opName, list<dag> pattern> :
   VOPC <
-    op, (outs), (ins arc:$src0, vrc:$src1), opName, pattern
+    op, (ins arc:$src0, vrc:$src1), opName, pattern
   >;
 
 multiclass VOPC_32 <bits<8> op, string opName, list<dag> pattern> {
index 72f03d29315a9844afe23ff79ac2eff853dea68a..d71df43d0a494a46ab4cb659fce36045644e878f 100644 (file)
@@ -407,8 +407,8 @@ class VOP3 <bits<9> op, dag outs, dag ins, string asm, list<dag> pattern> :
   let PostEncoderMethod = "VOPPostEncode";
 }
 
-class VOPC <bits<8> op, dag outs, dag ins, string asm, list<dag> pattern> :
-    Enc32 <outs, ins, asm, pattern> {
+class VOPC <bits<8> op, dag ins, string asm, list<dag> pattern> :
+    Enc32 <(outs VCCReg:$dst), ins, asm, pattern> {
 
   bits<9> SRC0;
   bits<8> VSRC1;
@@ -420,8 +420,7 @@ class VOPC <bits<8> op, dag outs, dag ins, string asm, list<dag> pattern> :
  
   let EncodingType = 15; //SIInstrEncodingType::VOPC
   let PostEncoderMethod = "VOPPostEncode";
-
-  let Defs = [VCC];
+  let DisableEncoding = "$dst";
 }
 
 class MIMG_Load_Helper <bits<7> op, string asm> : MIMG <
index 01fb81e948e0931e78183f6b279e96cff59ed7f0..544ef20bdd9d99a055c5f752edf0e3ed2c818d89 100644 (file)
@@ -590,10 +590,12 @@ def S_WAITCNT : SOPP <0x0000000c, (ins i32imm:$simm16), "S_WAITCNT $simm16">;
 //def S_TTRACEDATA : SOPP_ <0x00000016, "S_TTRACEDATA", []>;
 
 /* XXX: No VOP3 version of this instruction yet */
-def V_CNDMASK_B32 : VOP2_Helper <
-  0x00000000, VReg_32, AllReg_32, "V_CNDMASK_B32", []> {
-  let VDST = 0;
-  let Uses = [VCC];
+def V_CNDMASK_B32 : VOP2 <0x00000000, (outs VReg_32:$dst),
+  (ins VCCReg:$vcc, AllReg_32:$src0, VReg_32:$src1), "V_CNDMASK_B32",
+  [(set (i32 VReg_32:$dst),
+   (select VCCReg:$vcc, AllReg_32:$src0, VReg_32:$src1))] > {
+
+  let DisableEncoding = "$vcc";
 }
 defm V_READLANE_B32 : VOP2_32 <0x00000001, "V_READLANE_B32", []>;
 defm V_WRITELANE_B32 : VOP2_32 <0x00000002, "V_WRITELANE_B32", []>;