diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2012-03-07 15:37:45 -0500 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2012-03-07 15:37:45 -0500 |
commit | e5cc5a59d75975a7ebf8ee5ae173fd45df8e3d03 (patch) | |
tree | 53b0912f35ae9ec8dd1b176c9cda415409509bef /src | |
parent | b7879597a6fea027c23979330c8c5eee03a3caf2 (diff) |
r600/llvm: Add some instructions for dealing with optimized divide
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/radeon/R600InstrInfo.cpp | 12 | ||||
-rw-r--r-- | src/gallium/drivers/radeon/R600InstrInfo.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/radeon/R600Instructions.td | 9 |
3 files changed, 22 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeon/R600InstrInfo.cpp b/src/gallium/drivers/radeon/R600InstrInfo.cpp index 2790def7253..a015258d4e4 100644 --- a/src/gallium/drivers/radeon/R600InstrInfo.cpp +++ b/src/gallium/drivers/radeon/R600InstrInfo.cpp @@ -73,6 +73,18 @@ unsigned R600InstrInfo::getISAOpcode(unsigned opcode) const case AMDIL::MOVE_f32: case AMDIL::MOVE_i32: return AMDIL::MOV; + case AMDIL::SHR_i32: + return getLSHRop(); + } +} + +unsigned R600InstrInfo::getLSHRop() const +{ + unsigned gen = TM.getSubtarget<AMDILSubtarget>().device()->getGeneration(); + if (gen < AMDILDeviceInfo::HD5XXX) { + return AMDIL::LSHR_r600; + } else { + return AMDIL::LSHR_eg; } } diff --git a/src/gallium/drivers/radeon/R600InstrInfo.h b/src/gallium/drivers/radeon/R600InstrInfo.h index 170e0e0de0b..4bad516e2e1 100644 --- a/src/gallium/drivers/radeon/R600InstrInfo.h +++ b/src/gallium/drivers/radeon/R600InstrInfo.h @@ -66,6 +66,7 @@ namespace llvm { virtual unsigned getISAOpcode(unsigned opcode) const; bool isTrig(const MachineInstr &MI) const; + unsigned getLSHRop() const; unsigned getMULHI_UINT() const; unsigned getMULLO_UINT() const; unsigned getRECIP_UINT() const; diff --git a/src/gallium/drivers/radeon/R600Instructions.td b/src/gallium/drivers/radeon/R600Instructions.td index f0135819c3a..9b2f784f40b 100644 --- a/src/gallium/drivers/radeon/R600Instructions.td +++ b/src/gallium/drivers/radeon/R600Instructions.td @@ -497,6 +497,12 @@ class LSHR_Common <bits<32> inst> : R600_2OP < let AMDILOp = AMDILInst.USHR_i32; } +class MULHI_INT_Common <bits<32> inst> : R600_2OP < + inst, "MULHI_INT $dst, $src0, $src1", + [] >{ + let AMDILOp = AMDILInst.SMULHI_i32; +} + class MULHI_UINT_Common <bits<32> inst> : R600_2OP < inst, "MULHI $dst, $src0, $src1", [] @@ -606,7 +612,9 @@ let Gen = AMDGPUGen.R600 in { def INT_TO_FLT_r600 : INT_TO_FLT_Common<0x6c>; def SIN_r600 : SIN_Common<0x6E>; def COS_r600 : COS_Common<0x6F>; + def LSHR_r600 : LSHR_Common<0x71>; def MULLO_INT_r600 : MULLO_INT_Common<0x73>; + def MULHI_INT_r600 : MULHI_INT_Common<0x74>; def MULLO_UINT_r600 : MULLO_UINT_Common<0x75>; def MULHI_UINT_r600 : MULHI_UINT_Common<0x76>; def RECIP_UINT_r600 : RECIP_UINT_Common <0x77>; @@ -789,6 +797,7 @@ let Gen = AMDGPUGen.EG_CAYMAN in { def SIN_eg : SIN_Common<0x8D>; def COS_eg : COS_Common<0x8E>; def MULLO_INT_eg : MULLO_INT_Common<0x8F>; + def MULHI_INT_eg : MULHI_INT_Common<0x90>; def MULLO_UINT_eg : MULLO_UINT_Common<0x91>; def MULHI_UINT_eg : MULHI_UINT_Common<0x92>; def RECIP_UINT_eg : RECIP_UINT_Common<0x94>; |