//
// This gets selected into a single UBFM:
//
- // UBFM Value, ShiftImm, BitWide + SrlImm -1
+ // UBFM Value, ShiftImm, findLastSet(MaskImm)
//
if (N->getOpcode() != ISD::SRL)
return false;
// Check whether we really have several bits extract here.
- unsigned BitWide = 64 - countLeadingOnes(~(AndMask >> SrlImm));
- if (BitWide && isMask_64(AndMask >> SrlImm)) {
- if (N->getValueType(0) == MVT::i32)
- Opc = AArch64::UBFMWri;
- else
- Opc = AArch64::UBFMXri;
-
- LSB = SrlImm;
- MSB = BitWide + SrlImm - 1;
- return true;
- }
+ if (!isMask_64(AndMask >> SrlImm))
+ return false;
- return false;
+ Opc = N->getValueType(0) == MVT::i32 ? AArch64::UBFMWri : AArch64::UBFMXri;
+ LSB = SrlImm;
+ MSB = findLastSet(AndMask, ZB_Undefined);
+ return true;
}
static bool isBitfieldExtractOpFromShr(SDNode *N, unsigned &Opc, SDValue &Opd0,