diff options
author | Tom Stellard <[email protected]> | 2012-06-20 16:28:01 -0400 |
---|---|---|
committer | Tom Stellard <[email protected]> | 2012-06-21 20:42:06 +0000 |
commit | c53c8d05551083437eb991e79002c0a272541a79 (patch) | |
tree | 667ab99b9bce570cafb0f70e5ff681e5d97f937b /src/gallium/drivers/radeon/R600ISelLowering.cpp | |
parent | cd287301ec598d2811f3f85c03d23bae01be2359 (diff) |
radeon/llvm: Lower ROTL to BIT_ALIGN
Diffstat (limited to 'src/gallium/drivers/radeon/R600ISelLowering.cpp')
-rw-r--r-- | src/gallium/drivers/radeon/R600ISelLowering.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeon/R600ISelLowering.cpp b/src/gallium/drivers/radeon/R600ISelLowering.cpp index 3e021a23dbb..5694c0bc9a2 100644 --- a/src/gallium/drivers/radeon/R600ISelLowering.cpp +++ b/src/gallium/drivers/radeon/R600ISelLowering.cpp @@ -33,6 +33,8 @@ R600TargetLowering::R600TargetLowering(TargetMachine &TM) : setOperationAction(ISD::FSUB, MVT::f32, Expand); + setOperationAction(ISD::ROTL, MVT::i32, Custom); + setSchedulingPreference(Sched::VLIW); } @@ -256,3 +258,29 @@ void R600TargetLowering::lowerImplicitParameter(MachineInstr *MI, MachineBasicBl .addReg(PtrReg) .addImm(0); } + +//===----------------------------------------------------------------------===// +// Custom DAG Lowering Operations +//===----------------------------------------------------------------------===// + + +SDValue R600TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const +{ + switch (Op.getOpcode()) { + default: return AMDGPUTargetLowering::LowerOperation(Op, DAG); + case ISD::ROTL: return LowerROTL(Op, DAG); + } +} + +SDValue R600TargetLowering::LowerROTL(SDValue Op, SelectionDAG &DAG) const +{ + DebugLoc DL = Op.getDebugLoc(); + EVT VT = Op.getValueType(); + + return DAG.getNode(AMDGPUISD::BITALIGN, DL, VT, + Op.getOperand(0), + Op.getOperand(0), + DAG.getNode(ISD::SUB, DL, VT, + DAG.getConstant(32, MVT::i32), + Op.getOperand(1))); +} |