radeon/llvm: Add intrinsic for enabling whole quad mode in SI pixel shaders.
authorMichel Dänzer <michel.daenzer@amd.com>
Wed, 29 Aug 2012 16:55:08 +0000 (18:55 +0200)
committerMichel Dänzer <michel@daenzer.net>
Thu, 6 Sep 2012 14:46:42 +0000 (16:46 +0200)
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
src/gallium/drivers/radeon/SIISelLowering.cpp
src/gallium/drivers/radeon/SIISelLowering.h
src/gallium/drivers/radeon/SIInstructions.td
src/gallium/drivers/radeon/SIIntrinsics.td

index 2c8167382c7bcd9f247b43643e965cf53a05e2b7..ebe9514a2b94843d510753f94d43c59967a810b4 100644 (file)
@@ -132,6 +132,9 @@ MachineBasicBlock * SITargetLowering::EmitInstrWithCustomInserter(
   case AMDGPU::SI_KIL:
     LowerSI_KIL(MI, *BB, I, MRI);
     break;
+  case AMDGPU::SI_WQM:
+    LowerSI_WQM(MI, *BB, I, MRI);
+    break;
   case AMDGPU::SI_V_CNDLT:
     LowerSI_V_CNDLT(MI, *BB, I, MRI);
     break;
@@ -146,6 +149,16 @@ void SITargetLowering::AppendS_WAITCNT(MachineInstr *MI, MachineBasicBlock &BB,
           .addImm(0);
 }
 
+
+void SITargetLowering::LowerSI_WQM(MachineInstr *MI, MachineBasicBlock &BB,
+    MachineBasicBlock::iterator I, MachineRegisterInfo & MRI) const
+{
+  BuildMI(BB, I, BB.findDebugLoc(I), TII->get(AMDGPU::S_WQM_B64), AMDGPU::EXEC)
+          .addReg(AMDGPU::EXEC);
+
+  MI->eraseFromParent();
+}
+
 void SITargetLowering::LowerSI_INTERP(MachineInstr *MI, MachineBasicBlock &BB,
     MachineBasicBlock::iterator I, MachineRegisterInfo & MRI) const
 {
index 80c7f4bb86c6e621135cb870c266c6caf0ac77df..4407bf0466742f4621ba02c08a194ba9692296d6 100644 (file)
@@ -37,6 +37,8 @@ class SITargetLowering : public AMDGPUTargetLowering
               MachineBasicBlock::iterator I, MachineRegisterInfo &MRI) const;
   void LowerSI_KIL(MachineInstr *MI, MachineBasicBlock &BB,
               MachineBasicBlock::iterator I, MachineRegisterInfo & MRI) const;
+  void LowerSI_WQM(MachineInstr *MI, MachineBasicBlock &BB,
+              MachineBasicBlock::iterator I, MachineRegisterInfo & MRI) const;
   void LowerSI_V_CNDLT(MachineInstr *MI, MachineBasicBlock &BB,
               MachineBasicBlock::iterator I, MachineRegisterInfo & MRI) const;
 
index 20d4c003aa194543c0f99e5350ef583f70e62b1e..286819638a8f4515895fd4d88f352e73724b979f 100644 (file)
@@ -986,6 +986,13 @@ def SI_KIL : InstSI <
        [(int_AMDGPU_kill VReg_32:$src)]
 >;
 
+def SI_WQM : InstSI <
+       (outs),
+       (ins),
+       "SI_WQM",
+       [(int_SI_wqm)]
+>;
+
 } // end usesCustomInserter 
 
 // SI Psuedo branch instructions.  These are used by the CFG structurizer pass
index 401325bf5b11b532700817266281bef985aca30a..fbb8dc90fbe0690070a4b5b155d46025ae8cf71a 100644 (file)
@@ -20,6 +20,7 @@ let TargetPrefix = "SI", isTarget = 1 in {
   def int_SI_load_const : Intrinsic <[llvm_float_ty], [llvm_i64_ty, llvm_i32_ty], []>;
   def int_SI_vs_load_buffer_index : Intrinsic <[llvm_i32_ty], [], [IntrNoMem]>;
   def int_SI_vs_load_input : Intrinsic <[llvm_v4f32_ty], [llvm_v4i32_ty, llvm_i16_ty, llvm_i32_ty], []> ;
+  def int_SI_wqm : Intrinsic <[], [], []>;
 
   def int_SI_sample : Intrinsic <[llvm_v4f32_ty], [llvm_i32_ty, llvm_v4f32_ty, llvm_v8i32_ty, llvm_v4i32_ty]>;