mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
[X86] ISEL (and X, <constant mask>) to BZHI when BMI2 is available.
Generating BZHI in the variable mask case, i.e. (and X, (sub (shl 1, N), 1)), was already supported, but we were missing the constant-mask case. This patch fixes that. <rdar://problem/15480077> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206738 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -18503,6 +18503,20 @@ static SDValue PerformAndCombine(SDNode *N, SelectionDAG &DAG,
|
||||
}
|
||||
} // BEXTR
|
||||
|
||||
// Check for BZHI with contiguous mask: (and X, 0x0..0f..f)
|
||||
// This should be checked after BEXTR - when X is a shift, a BEXTR is
|
||||
// preferrable.
|
||||
if (Subtarget->hasBMI2()) {
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N1)) {
|
||||
uint64_t Mask = C->getZExtValue();
|
||||
if (isMask_64(Mask)) {
|
||||
unsigned LZ = CountTrailingOnes_64(Mask);
|
||||
return DAG.getNode(X86ISD::BZHI, DL, VT, N0,
|
||||
DAG.getConstant(LZ, MVT::i8));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user