radeon/llvm: Use a custom inserter for MASK_WRITE
authorTom Stellard <thomas.stellard@amd.com>
Fri, 25 May 2012 16:53:22 +0000 (12:53 -0400)
committerTom Stellard <thomas.stellard@amd.com>
Fri, 25 May 2012 19:40:59 +0000 (15:40 -0400)
src/gallium/drivers/radeon/AMDGPUInstructions.td
src/gallium/drivers/radeon/R600ISelLowering.cpp
src/gallium/drivers/radeon/R600Instructions.td
src/gallium/drivers/radeon/R600LowerInstructions.cpp

index f4abbae6397ba92da2ee6a9e7abc88df458981e9..28ea93d06ede1c4777910f1052696dd27c93c861 100644 (file)
@@ -49,16 +49,7 @@ def FP_ONE : PatLeaf <
   [{return N->isExactlyValue(1.0);}]
 >;
 
-let isCodeGenOnly = 1 in {
-
-  def MASK_WRITE : AMDGPUShaderInst <
-    (outs),
-    (ins GPRF32:$src),
-    "MASK_WRITE $src",
-    []
-  >;
-
-let isPseudo = 1, usesCustomInserter = 1  in {
+let isCodeGenOnly = 1, isPseudo = 1, usesCustomInserter = 1  in {
 
 class CLAMP <RegisterClass rc> : AMDGPUShaderInst <
   (outs rc:$dst),
@@ -81,9 +72,7 @@ class FNEG <RegisterClass rc> : AMDGPUShaderInst <
   [(set rc:$dst, (fneg rc:$src0))]
 >;
 
-} // End isPseudo = 1, hasCustomInserter = 1
-
-} // End isCodeGenOnly = 1
+} // End isCodeGenOnly = 1, isPseudo = 1, hasCustomInserter = 1
 
 /* Generic helper patterns for intrinsics */
 /* -------------------------------------- */
index de60a2d0e59254062be7d99ddb325d67bf536601..77d90e21d1b6da8d6b5dca935dd15f03b7c94f84 100644 (file)
@@ -139,6 +139,18 @@ MachineBasicBlock * R600TargetLowering::EmitInstrWithCustomInserter(
                 AMDIL::R600_TReg32RegClass.getRegister(RegIndex));
       break;
     }
+
+  case AMDIL::MASK_WRITE:
+    {
+      unsigned maskedRegister = MI->getOperand(0).getReg();
+      assert(TargetRegisterInfo::isVirtualRegister(maskedRegister));
+      MachineInstr * defInstr = MRI.getVRegDef(maskedRegister);
+      MachineOperand * def = defInstr->findRegisterDefOperand(maskedRegister);
+      def->addTargetFlag(MO_FLAG_MASK);
+      // Return early so the instruction is not erased
+      return BB;
+    }
+
   case AMDIL::STORE_OUTPUT:
     {
       int64_t OutputIndex = MI->getOperand(1).getImm();
index f038736267bac7be0e5ef1d9279fb6381d12fe2a..2f6378d8e53d6e72334f59aa3fd90a5552d08e6a 100644 (file)
@@ -538,16 +538,6 @@ def TEX_SAMPLE_C_G : R600_TEX <
   []
 >;
 
-def KILP : Pat <
-  (int_AMDGPU_kilp),
-  (MASK_WRITE (KILLGT (f32 ONE), (f32 ZERO)))
->;
-
-def KIL : Pat <
-  (int_AMDGPU_kill R600_Reg32:$src0),
-  (MASK_WRITE (KILLGT (f32 ZERO), (f32 R600_Reg32:$src0)))
->;
-
 /* Helper classes for common instructions */
 
 class MUL_LIT_Common <bits<32> inst> : R600_3OP <
@@ -1072,6 +1062,17 @@ def CLAMP_R600 :  CLAMP <R600_Reg32>;
 def FABS_R600 : FABS<R600_Reg32>;
 def FNEG_R600 : FNEG<R600_Reg32>;
 
+let usesCustomInserter = 1 in {
+
+def MASK_WRITE : AMDGPUShaderInst <
+    (outs),
+    (ins R600_Reg32:$src),
+    "MASK_WRITE $src",
+    []
+>;
+
+} // End usesCustomInserter = 1
+
 let isPseudo = 1 in {
 
 def LOAD_VTX : AMDGPUShaderInst <
@@ -1088,6 +1089,17 @@ def LOAD_VTX : AMDGPUShaderInst <
 // ISel Patterns
 //===----------------------------------------------------------------------===//
 
+// KIL Patterns
+def KILP : Pat <
+  (int_AMDGPU_kilp),
+  (MASK_WRITE (KILLGT (f32 ONE), (f32 ZERO)))
+>;
+
+def KIL : Pat <
+  (int_AMDGPU_kill R600_Reg32:$src0),
+  (MASK_WRITE (KILLGT (f32 ZERO), (f32 R600_Reg32:$src0)))
+>;
+
 // SGT Reverse args
 def : Pat <
   (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, FP_ONE, FP_ZERO, COND_LT),
index 70c9b8b9f6773382a35e1685169a1d67708233f5..61fd4f6db8afee22eb76e5e4d34bd2d0b13bf267 100644 (file)
@@ -204,17 +204,6 @@ bool R600LowerInstructionsPass::runOnMachineFunction(MachineFunction &MF)
           break;
         }
 
-      case AMDIL::MASK_WRITE:
-      {
-        unsigned maskedRegister = MI.getOperand(0).getReg();
-        assert(TargetRegisterInfo::isVirtualRegister(maskedRegister));
-        MachineInstr * defInstr = MRI->getVRegDef(maskedRegister);
-        MachineOperand * def = defInstr->findRegisterDefOperand(maskedRegister);
-        def->addTargetFlag(MO_FLAG_MASK);
-        /* Continue so the instruction is not erased */
-        continue;
-      }
-
       case AMDIL::ULT:
         BuildMI(MBB, I, MBB.findDebugLoc(I), TII->get(AMDIL::SETGT_UINT))
                 .addOperand(MI.getOperand(0))