diff options
| author | Jim Grosbach <grosbach@apple.com> | 2009-10-31 21:42:19 +0000 | 
|---|---|---|
| committer | Jim Grosbach <grosbach@apple.com> | 2009-10-31 21:42:19 +0000 | 
| commit | 8fe6fd702d633d3b70d5aed411c78e2be16d206d (patch) | |
| tree | a089d1cddddb6176b503494ce23974457c38aab7 | |
| parent | 73ee64d6a28546188884e750c89e8d0eebbba7f2 (diff) | |
| download | bcm5719-llvm-8fe6fd702d633d3b70d5aed411c78e2be16d206d.tar.gz bcm5719-llvm-8fe6fd702d633d3b70d5aed411c78e2be16d206d.zip  | |
Expand 64-bit logical shift right inline
llvm-svn: 85687
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 11 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/long_shift.ll | 2 | 
2 files changed, 8 insertions, 5 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 25fc86fd0f6..88649ab2bed 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -332,7 +332,7 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)    }    setOperationAction(ISD::SHL_PARTS, MVT::i32, Custom);    setOperationAction(ISD::SRA_PARTS, MVT::i32, Custom); -  setOperationAction(ISD::SRL_PARTS, MVT::i32, Expand); +  setOperationAction(ISD::SRL_PARTS, MVT::i32, Custom);    setOperationAction(ISD::SRL,       MVT::i64, Custom);    setOperationAction(ISD::SRA,       MVT::i64, Custom); @@ -2108,8 +2108,10 @@ static SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG,    SDValue ShOpHi = Op.getOperand(1);    SDValue ShAmt  = Op.getOperand(2);    SDValue ARMCC; +  unsigned Opc = (Op.getOpcode() == ISD::SRA_PARTS) ? ISD::SRA : ISD::SRL; + +  assert(Op.getOpcode() == ISD::SRA_PARTS || Op.getOpcode() == ISD::SRL_PARTS); -  assert(Op.getOpcode() == ISD::SRA_PARTS);    SDValue RevShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32,                                   DAG.getConstant(VTBits, MVT::i32), ShAmt);    SDValue Tmp1 = DAG.getNode(ISD::SRL, dl, VT, ShOpLo, ShAmt); @@ -2117,12 +2119,12 @@ static SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG,                                     DAG.getConstant(VTBits, MVT::i32));    SDValue Tmp2 = DAG.getNode(ISD::SHL, dl, VT, ShOpHi, RevShAmt);    SDValue FalseVal = DAG.getNode(ISD::OR, dl, VT, Tmp1, Tmp2); -  SDValue TrueVal = DAG.getNode(ISD::SRA, dl, VT, ShOpHi, ExtraShAmt); +  SDValue TrueVal = DAG.getNode(Opc, dl, VT, ShOpHi, ExtraShAmt);    SDValue CCR = DAG.getRegister(ARM::CPSR, MVT::i32);    SDValue Cmp = getARMCmp(ExtraShAmt, DAG.getConstant(0, MVT::i32), ISD::SETGE,                            ARMCC, DAG, ST->isThumb1Only(), dl); -  SDValue Hi = DAG.getNode(ISD::SRA, dl, VT, ShOpHi, ShAmt); +  SDValue Hi = DAG.getNode(Opc, dl, VT, ShOpHi, ShAmt);    SDValue Lo = DAG.getNode(ARMISD::CMOV, dl, VT, FalseVal, TrueVal, ARMCC,                             CCR, Cmp); @@ -2857,6 +2859,7 @@ SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) {    case ISD::SRL:    case ISD::SRA:           return LowerShift(Op.getNode(), DAG, Subtarget);    case ISD::SHL_PARTS:     return LowerShiftLeftParts(Op, DAG, Subtarget); +  case ISD::SRL_PARTS:    case ISD::SRA_PARTS:     return LowerShiftRightParts(Op, DAG, Subtarget);    case ISD::VSETCC:        return LowerVSETCC(Op, DAG);    case ISD::BUILD_VECTOR:  return LowerBUILD_VECTOR(Op, DAG); diff --git a/llvm/test/CodeGen/ARM/long_shift.ll b/llvm/test/CodeGen/ARM/long_shift.ll index 0de66542fcf..253fbab7641 100644 --- a/llvm/test/CodeGen/ARM/long_shift.ll +++ b/llvm/test/CodeGen/ARM/long_shift.ll @@ -27,7 +27,7 @@ define i32 @f2(i64 %x, i64 %y) {  define i32 @f3(i64 %x, i64 %y) {  ; CHECK: f3 -; CHECK: __lshrdi3 +; CHECK: movge r0, r1, lsr r2  	%a = lshr i64 %x, %y  	%b = trunc i64 %a to i32  	ret i32 %b  | 

