mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[MSP430] Optimize 'shl x, 8[+ N] -> swpb(zext(x)) [<< N]' for i16
Perform additional simplification to reduce shift amount. Patch by Kristina Bessonova! Differential Revision: https://reviews.llvm.org/D56016 llvm-svn: 350712
This commit is contained in:
parent
8e2314675c
commit
bb91cffa5a
@ -954,15 +954,26 @@ SDValue MSP430TargetLowering::LowerShifts(SDValue Op,
|
||||
// Expand the stuff into sequence of shifts.
|
||||
SDValue Victim = N->getOperand(0);
|
||||
|
||||
if ((Opc == ISD::SRA || Opc == ISD::SRL) && ShiftAmount >= 8) {
|
||||
// foo >> (8 + N) => sxt(swpb(foo)) >> N
|
||||
if (ShiftAmount >= 8) {
|
||||
assert(VT == MVT::i16 && "Can not shift i8 by 8 and more");
|
||||
Victim = DAG.getNode(ISD::BSWAP, dl, VT, Victim);
|
||||
if (Opc == ISD::SRA)
|
||||
Victim = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, VT, Victim,
|
||||
DAG.getValueType(MVT::i8));
|
||||
else
|
||||
switch(Opc) {
|
||||
default:
|
||||
llvm_unreachable("Unknown shift");
|
||||
case ISD::SHL:
|
||||
// foo << (8 + N) => swpb(zext(foo)) << N
|
||||
Victim = DAG.getZeroExtendInReg(Victim, dl, MVT::i8);
|
||||
Victim = DAG.getNode(ISD::BSWAP, dl, VT, Victim);
|
||||
break;
|
||||
case ISD::SRA:
|
||||
case ISD::SRL:
|
||||
// foo >> (8 + N) => sxt(swpb(foo)) >> N
|
||||
Victim = DAG.getNode(ISD::BSWAP, dl, VT, Victim);
|
||||
Victim = (Opc == ISD::SRA)
|
||||
? DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, VT, Victim,
|
||||
DAG.getValueType(MVT::i8))
|
||||
: DAG.getZeroExtendInReg(Victim, dl, MVT::i8);
|
||||
break;
|
||||
}
|
||||
ShiftAmount -= 8;
|
||||
}
|
||||
|
||||
|
@ -74,3 +74,14 @@ entry:
|
||||
%shr = lshr i16 %a, 10
|
||||
ret i16 %shr
|
||||
}
|
||||
|
||||
define i16 @lshl10_i16(i16 %a) #0 {
|
||||
entry:
|
||||
; CHECK-LABEL: lshl10_i16:
|
||||
; CHECK: mov.b r12, r12
|
||||
; CHECK-NEXT: swpb r12
|
||||
; CHECK-NEXT: add r12, r12
|
||||
; CHECK-NEXT: add r12, r12
|
||||
%shl = shl i16 %a, 10
|
||||
ret i16 %shl
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user