forked from OSchip/llvm-project
[GlobalISel] Factor narrowScalar for G_ASHR and G_LSHR. NFC
Main difference is in the way Hi for Long shift (HiL) is made. G_LSHR fills HiL with zeros, while G_ASHR fills HiL with sign bit value. Differential Revision: https://reviews.llvm.org/D66589 llvm-svn: 370064
This commit is contained in:
parent
d568ed40e0
commit
a393238422
|
@ -3010,41 +3010,25 @@ LegalizerHelper::narrowScalarShift(MachineInstr &MI, unsigned TypeIdx,
|
|||
ResultRegs[1] = Hi.getReg(0);
|
||||
break;
|
||||
}
|
||||
case TargetOpcode::G_LSHR: {
|
||||
// Short: ShAmt < NewBitSize
|
||||
auto HiS = MIRBuilder.buildLShr(HalfTy, InH, Amt);
|
||||
|
||||
auto LoOr = MIRBuilder.buildLShr(HalfTy, InL, Amt);
|
||||
auto HiOr = MIRBuilder.buildShl(HalfTy, InH, AmtLack);
|
||||
auto LoS = MIRBuilder.buildOr(HalfTy, LoOr, HiOr);
|
||||
|
||||
// Long: ShAmt >= NewBitSize
|
||||
auto HiL = MIRBuilder.buildConstant(HalfTy, 0); // Hi part is zero.
|
||||
auto LoL = MIRBuilder.buildLShr(HalfTy, InH, AmtExcess); // Lo from Hi part.
|
||||
|
||||
auto Lo = MIRBuilder.buildSelect(
|
||||
HalfTy, IsZero, InL, MIRBuilder.buildSelect(HalfTy, IsShort, LoS, LoL));
|
||||
auto Hi = MIRBuilder.buildSelect(HalfTy, IsShort, HiS, HiL);
|
||||
|
||||
ResultRegs[0] = Lo.getReg(0);
|
||||
ResultRegs[1] = Hi.getReg(0);
|
||||
break;
|
||||
}
|
||||
case TargetOpcode::G_LSHR:
|
||||
case TargetOpcode::G_ASHR: {
|
||||
// Short: ShAmt < NewBitSize
|
||||
auto HiS = MIRBuilder.buildAShr(HalfTy, InH, Amt);
|
||||
auto HiS = MIRBuilder.buildInstr(MI.getOpcode(), {HalfTy}, {InH, Amt});
|
||||
|
||||
auto LoOr = MIRBuilder.buildLShr(HalfTy, InL, Amt);
|
||||
auto HiOr = MIRBuilder.buildShl(HalfTy, InH, AmtLack);
|
||||
auto LoS = MIRBuilder.buildOr(HalfTy, LoOr, HiOr);
|
||||
|
||||
// Long: ShAmt >= NewBitSize
|
||||
|
||||
// Sign of Hi part.
|
||||
auto HiL = MIRBuilder.buildAShr(
|
||||
HalfTy, InH, MIRBuilder.buildConstant(ShiftAmtTy, NewBitSize - 1));
|
||||
|
||||
auto LoL = MIRBuilder.buildAShr(HalfTy, InH, AmtExcess); // Lo from Hi part.
|
||||
MachineInstrBuilder HiL;
|
||||
if (MI.getOpcode() == TargetOpcode::G_LSHR) {
|
||||
HiL = MIRBuilder.buildConstant(HalfTy, 0); // Hi part is zero.
|
||||
} else {
|
||||
auto ShiftAmt = MIRBuilder.buildConstant(ShiftAmtTy, NewBitSize - 1);
|
||||
HiL = MIRBuilder.buildAShr(HalfTy, InH, ShiftAmt); // Sign of Hi part.
|
||||
}
|
||||
auto LoL = MIRBuilder.buildInstr(MI.getOpcode(), {HalfTy},
|
||||
{InH, AmtExcess}); // Lo from Hi part.
|
||||
|
||||
auto Lo = MIRBuilder.buildSelect(
|
||||
HalfTy, IsZero, InL, MIRBuilder.buildSelect(HalfTy, IsShort, LoS, LoL));
|
||||
|
|
Loading…
Reference in New Issue