diff options
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.td | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/bmi.ll | 12 |
2 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index e3e8d2d613c..75638f24bfe 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -2361,6 +2361,10 @@ let Predicates = [HasBMI2] in { (BZHI64rr GR64:$src, (INSERT_SUBREG (i64 (IMPLICIT_DEF)), (MOV8ri (CountTrailingOnes imm:$mask)), sub_8bit))>; + def : Pat<(and (loadi64 addr:$src), BZHIMask:$mask), + (BZHI64rm addr:$src, + (INSERT_SUBREG (i64 (IMPLICIT_DEF)), + (MOV8ri (CountTrailingOnes imm:$mask)), sub_8bit))>; def : Pat<(and GR32:$src, (add (shl 1, GR8:$lz), -1)), (BZHI32rr GR32:$src, diff --git a/llvm/test/CodeGen/X86/bmi.ll b/llvm/test/CodeGen/X86/bmi.ll index 94e2ee7a0aa..730635f7f9f 100644 --- a/llvm/test/CodeGen/X86/bmi.ll +++ b/llvm/test/CodeGen/X86/bmi.ll @@ -555,6 +555,18 @@ entry: ret i64 %and } +define i64 @bzhi64_constant_mask_load(i64* %x) { +; CHECK-LABEL: bzhi64_constant_mask_load: +; CHECK: # BB#0: # %entry +; CHECK-NEXT: movb $62, %al +; CHECK-NEXT: bzhiq %rax, (%rdi), %rax +; CHECK-NEXT: retq +entry: + %x1 = load i64, i64* %x + %and = and i64 %x1, 4611686018427387903 + ret i64 %and +} + define i64 @bzhi64_small_constant_mask(i64 %x) { ; CHECK-LABEL: bzhi64_small_constant_mask: ; CHECK: # BB#0: # %entry |

