mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
[X86] Don't use BZHI for short masks (>=32 bits). Thanks to Ben Kramer for the
review. llvm-svn: 206869
This commit is contained in:
parent
eb8b511a12
commit
c6b233b58f
@ -18507,13 +18507,15 @@ static SDValue PerformAndCombine(SDNode *N, SelectionDAG &DAG,
|
||||
// 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 (VT == MVT::i64 && 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));
|
||||
// Only use BZHI for immediates that are too large for an AND:
|
||||
if (LZ > 32)
|
||||
return DAG.getNode(X86ISD::BZHI, DL, VT, N0,
|
||||
DAG.getConstant(LZ, MVT::i8));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -216,22 +216,21 @@ entry:
|
||||
; CHECK: bzhiq
|
||||
}
|
||||
|
||||
define i32 @bzhi32_constant_mask(i32 %x) #0 {
|
||||
entry:
|
||||
%and = and i32 %x, 1073741823
|
||||
ret i32 %and
|
||||
; CHECK-LABEL: bzhi32_constant_mask:
|
||||
; CHECK: movb $30, %al
|
||||
; CHECK: bzhil %eax, %e[[ARG1:di|cx]], %eax
|
||||
}
|
||||
|
||||
define i64 @bzhi64_constant_mask(i64 %x) #0 {
|
||||
entry:
|
||||
%and = and i64 %x, 4611686018427387903
|
||||
ret i64 %and
|
||||
; CHECK-LABEL: bzhi64_constant_mask:
|
||||
; CHECK: movb $62, %al
|
||||
; CHECK: bzhiq %rax, %r[[ARG1]], %rax
|
||||
; CHECK: bzhiq %rax, %r[[ARG1:di|cx]], %rax
|
||||
}
|
||||
|
||||
define i64 @bzhi64_small_constant_mask(i64 %x) #0 {
|
||||
entry:
|
||||
%and = and i64 %x, 2147483647
|
||||
ret i64 %and
|
||||
; CHECK-LABEL: bzhi64_small_constant_mask:
|
||||
; CHECK: andq $2147483647, %r[[ARG1]]
|
||||
}
|
||||
|
||||
define i32 @blsi32(i32 %x) nounwind readnone {
|
||||
|
Loading…
Reference in New Issue
Block a user