Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / X86 / replace-load-and-with-bzhi.ll
blob65e679063ccb0932518da65964b95893f623b385
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi2 | FileCheck %s
3 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+bmi2 | FileCheck %s -check-prefix=CHECK32
5 @fill_table32 = internal unnamed_addr constant [32 x i32] [i32 0, i32 1, i32 3, i32 7, i32 15, i32 31, i32 63, i32 127, i32 255, i32 511, i32 1023, i32 2047, i32 4095, i32 8191, i32 16383, i32 32767, i32 65535, i32 131071, i32 262143, i32 524287, i32 1048575, i32 2097151, i32 4194303, i32 8388607, i32 16777215, i32 33554431, i32 67108863, i32 134217727, i32 268435455, i32 536870911, i32 1073741823, i32 2147483647], align 16
6 @fill_table32_partial = internal unnamed_addr constant [17 x i32] [i32 0, i32 1, i32 3, i32 7, i32 15, i32 31, i32 63, i32 127, i32 255, i32 511, i32 1023, i32 2047, i32 4095, i32 8191, i32 16383, i32 32767, i32 65535], align 16
7 @fill_table64 = internal unnamed_addr constant [64 x i64] [i64 0, i64 1, i64 3, i64 7, i64 15, i64 31, i64 63, i64 127, i64 255, i64 511, i64 1023, i64 2047, i64 4095, i64 8191, i64 16383, i64 32767, i64 65535, i64 131071, i64 262143, i64 524287, i64 1048575, i64 2097151, i64 4194303, i64 8388607, i64 16777215, i64 33554431, i64 67108863, i64 134217727, i64 268435455, i64 536870911, i64 1073741823, i64 2147483647, i64 4294967295, i64 8589934591, i64 17179869183, i64 34359738367, i64 68719476735, i64 137438953471, i64 274877906943, i64 549755813887, i64 1099511627775, i64 2199023255551, i64 4398046511103, i64 8796093022207, i64 17592186044415, i64 35184372088831, i64 70368744177663, i64 140737488355327, i64 281474976710655, i64 562949953421311, i64 1125899906842623, i64 2251799813685247, i64 4503599627370495, i64 9007199254740991, i64 18014398509481983, i64 36028797018963967, i64 72057594037927935, i64 144115188075855871, i64 288230376151711743, i64 576460752303423487, i64 1152921504606846975, i64 2305843009213693951, i64 4611686018427387903, i64 9223372036854775807], align 16
8 @fill_table64_partial = internal unnamed_addr constant [51 x i64] [i64 0, i64 1, i64 3, i64 7, i64 15, i64 31, i64 63, i64 127, i64 255, i64 511, i64 1023, i64 2047, i64 4095, i64 8191, i64 16383, i64 32767, i64 65535, i64 131071, i64 262143, i64 524287, i64 1048575, i64 2097151, i64 4194303, i64 8388607, i64 16777215, i64 33554431, i64 67108863, i64 134217727, i64 268435455, i64 536870911, i64 1073741823, i64 2147483647, i64 4294967295, i64 8589934591, i64 17179869183, i64 34359738367, i64 68719476735, i64 137438953471, i64 274877906943, i64 549755813887, i64 1099511627775, i64 2199023255551, i64 4398046511103, i64 8796093022207, i64 17592186044415, i64 35184372088831, i64 70368744177663, i64 140737488355327, i64 281474976710655, i64 562949953421311, i64 1125899906842623], align 16
10 define i32 @f32_bzhi(i32 %x, i32 %y) local_unnamed_addr {
11 ; CHECK-LABEL: f32_bzhi:
12 ; CHECK:       # %bb.0: # %entry
13 ; CHECK-NEXT:    bzhil %esi, %edi, %eax
14 ; CHECK-NEXT:    retq
16 ; CHECK32-LABEL: f32_bzhi:
17 ; CHECK32:       # %bb.0: # %entry
18 ; CHECK32-NEXT:    movl {{[0-9]+}}(%esp), %eax
19 ; CHECK32-NEXT:    bzhil %eax, {{[0-9]+}}(%esp), %eax
20 ; CHECK32-NEXT:    retl
21 entry:
22   %idxprom = sext i32 %y to i64
23   %arrayidx = getelementptr inbounds [32 x i32], ptr @fill_table32, i64 0, i64 %idxprom
24   %0 = load i32, ptr %arrayidx, align 4
25   %and = and i32 %0, %x
26   ret i32 %and
29 define i32 @f32_bzhi_partial(i32 %x, i32 %y) local_unnamed_addr {
30 ; CHECK-LABEL: f32_bzhi_partial:
31 ; CHECK:       # %bb.0: # %entry
32 ; CHECK-NEXT:    bzhil %esi, %edi, %eax
33 ; CHECK-NEXT:    retq
35 ; CHECK32-LABEL: f32_bzhi_partial:
36 ; CHECK32:       # %bb.0: # %entry
37 ; CHECK32-NEXT:    movl {{[0-9]+}}(%esp), %eax
38 ; CHECK32-NEXT:    bzhil %eax, {{[0-9]+}}(%esp), %eax
39 ; CHECK32-NEXT:    retl
40 entry:
41   %idxprom = sext i32 %y to i64
42   %arrayidx = getelementptr inbounds [17 x i32], ptr @fill_table32_partial, i64 0, i64 %idxprom
43   %0 = load i32, ptr %arrayidx, align 4
44   %and = and i32 %0, %x
45   ret i32 %and
48 define i64 @f64_bzhi(i64 %x, i64 %y) local_unnamed_addr {
49 ; CHECK-LABEL: f64_bzhi:
50 ; CHECK:       # %bb.0: # %entry
51 ; CHECK-NEXT:    bzhiq %rsi, %rdi, %rax
52 ; CHECK-NEXT:    retq
54 ; CHECK32-LABEL: f64_bzhi:
55 ; CHECK32:       # %bb.0: # %entry
56 ; CHECK32-NEXT:    movl {{[0-9]+}}(%esp), %eax
57 ; CHECK32-NEXT:    movl fill_table64+4(,%eax,8), %edx
58 ; CHECK32-NEXT:    movl fill_table64(,%eax,8), %eax
59 ; CHECK32-NEXT:    andl {{[0-9]+}}(%esp), %eax
60 ; CHECK32-NEXT:    andl {{[0-9]+}}(%esp), %edx
61 ; CHECK32-NEXT:    retl
62 entry:
63   %arrayidx = getelementptr inbounds [64 x i64], ptr @fill_table64, i64 0, i64 %y
64   %0 = load i64, ptr %arrayidx, align 8
65   %and = and i64 %0, %x
66   ret i64 %and
69 define i64 @f64_bzhi_partial(i64 %x, i64 %y) local_unnamed_addr {
70 ; CHECK-LABEL: f64_bzhi_partial:
71 ; CHECK:       # %bb.0: # %entry
72 ; CHECK-NEXT:    bzhiq %rsi, %rdi, %rax
73 ; CHECK-NEXT:    retq
75 ; CHECK32-LABEL: f64_bzhi_partial:
76 ; CHECK32:       # %bb.0: # %entry
77 ; CHECK32-NEXT:    movl {{[0-9]+}}(%esp), %eax
78 ; CHECK32-NEXT:    movl fill_table64_partial+4(,%eax,8), %edx
79 ; CHECK32-NEXT:    movl fill_table64_partial(,%eax,8), %eax
80 ; CHECK32-NEXT:    andl {{[0-9]+}}(%esp), %eax
81 ; CHECK32-NEXT:    andl {{[0-9]+}}(%esp), %edx
82 ; CHECK32-NEXT:    retl
83 entry:
84   %arrayidx = getelementptr inbounds [51 x i64], ptr @fill_table64_partial, i64 0, i64 %y
85   %0 = load i64, ptr %arrayidx, align 8
86   %and = and i64 %0, %x
87   ret i64 %and