xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/shift-bmi2.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=i386-unknown-unknown -mcpu=core-avx2 < %s | FileCheck --check-prefix=BMI2 %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=core-avx2 < %s | FileCheck --check-prefix=BMI264 %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine i32 @shl32(i32 %x, i32 %shamt) nounwind uwtable readnone {
5*9880d681SAndroid Build Coastguard Workerentry:
6*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %x, %shamt
7*9880d681SAndroid Build Coastguard Worker; BMI2: shl32
8*9880d681SAndroid Build Coastguard Worker; BMI2: shlxl
9*9880d681SAndroid Build Coastguard Worker; BMI2: ret
10*9880d681SAndroid Build Coastguard Worker; BMI264: shl32
11*9880d681SAndroid Build Coastguard Worker; BMI264: shlxl
12*9880d681SAndroid Build Coastguard Worker; BMI264: ret
13*9880d681SAndroid Build Coastguard Worker  ret i32 %shl
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine i32 @shl32i(i32 %x) nounwind uwtable readnone {
17*9880d681SAndroid Build Coastguard Workerentry:
18*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %x, 5
19*9880d681SAndroid Build Coastguard Worker; BMI2: shl32i
20*9880d681SAndroid Build Coastguard Worker; BMI2-NOT: shlxl
21*9880d681SAndroid Build Coastguard Worker; BMI2: ret
22*9880d681SAndroid Build Coastguard Worker; BMI264: shl32i
23*9880d681SAndroid Build Coastguard Worker; BMI264-NOT: shlxl
24*9880d681SAndroid Build Coastguard Worker; BMI264: ret
25*9880d681SAndroid Build Coastguard Worker  ret i32 %shl
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine i32 @shl32p(i32* %p, i32 %shamt) nounwind uwtable readnone {
29*9880d681SAndroid Build Coastguard Workerentry:
30*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32* %p
31*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %x, %shamt
32*9880d681SAndroid Build Coastguard Worker; BMI2: shl32p
33*9880d681SAndroid Build Coastguard Worker; BMI2: shlxl %{{.+}}, ({{.+}}), %{{.+}}
34*9880d681SAndroid Build Coastguard Worker; BMI2: ret
35*9880d681SAndroid Build Coastguard Worker; BMI264: shl32p
36*9880d681SAndroid Build Coastguard Worker; BMI264: shlxl %{{.+}}, ({{.+}}), %{{.+}}
37*9880d681SAndroid Build Coastguard Worker; BMI264: ret
38*9880d681SAndroid Build Coastguard Worker  ret i32 %shl
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerdefine i32 @shl32pi(i32* %p) nounwind uwtable readnone {
42*9880d681SAndroid Build Coastguard Workerentry:
43*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32* %p
44*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %x, 5
45*9880d681SAndroid Build Coastguard Worker; BMI2: shl32pi
46*9880d681SAndroid Build Coastguard Worker; BMI2-NOT: shlxl
47*9880d681SAndroid Build Coastguard Worker; BMI2: ret
48*9880d681SAndroid Build Coastguard Worker; BMI264: shl32pi
49*9880d681SAndroid Build Coastguard Worker; BMI264-NOT: shlxl
50*9880d681SAndroid Build Coastguard Worker; BMI264: ret
51*9880d681SAndroid Build Coastguard Worker  ret i32 %shl
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine i64 @shl64(i64 %x, i64 %shamt) nounwind uwtable readnone {
55*9880d681SAndroid Build Coastguard Workerentry:
56*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 %x, %shamt
57*9880d681SAndroid Build Coastguard Worker; BMI264: shl64
58*9880d681SAndroid Build Coastguard Worker; BMI264: shlxq
59*9880d681SAndroid Build Coastguard Worker; BMI264: ret
60*9880d681SAndroid Build Coastguard Worker  ret i64 %shl
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine i64 @shl64i(i64 %x) nounwind uwtable readnone {
64*9880d681SAndroid Build Coastguard Workerentry:
65*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 %x, 7
66*9880d681SAndroid Build Coastguard Worker; BMI264: shl64i
67*9880d681SAndroid Build Coastguard Worker; BMI264-NOT: shlxq
68*9880d681SAndroid Build Coastguard Worker; BMI264: ret
69*9880d681SAndroid Build Coastguard Worker  ret i64 %shl
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine i64 @shl64p(i64* %p, i64 %shamt) nounwind uwtable readnone {
73*9880d681SAndroid Build Coastguard Workerentry:
74*9880d681SAndroid Build Coastguard Worker  %x = load i64, i64* %p
75*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 %x, %shamt
76*9880d681SAndroid Build Coastguard Worker; BMI264: shl64p
77*9880d681SAndroid Build Coastguard Worker; BMI264: shlxq %{{.+}}, ({{.+}}), %{{.+}}
78*9880d681SAndroid Build Coastguard Worker; BMI264: ret
79*9880d681SAndroid Build Coastguard Worker  ret i64 %shl
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdefine i64 @shl64pi(i64* %p) nounwind uwtable readnone {
83*9880d681SAndroid Build Coastguard Workerentry:
84*9880d681SAndroid Build Coastguard Worker  %x = load i64, i64* %p
85*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 %x, 7
86*9880d681SAndroid Build Coastguard Worker; BMI264: shl64pi
87*9880d681SAndroid Build Coastguard Worker; BMI264-NOT: shlxq
88*9880d681SAndroid Build Coastguard Worker; BMI264: ret
89*9880d681SAndroid Build Coastguard Worker  ret i64 %shl
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerdefine i32 @lshr32(i32 %x, i32 %shamt) nounwind uwtable readnone {
93*9880d681SAndroid Build Coastguard Workerentry:
94*9880d681SAndroid Build Coastguard Worker  %shl = lshr i32 %x, %shamt
95*9880d681SAndroid Build Coastguard Worker; BMI2: lshr32
96*9880d681SAndroid Build Coastguard Worker; BMI2: shrxl
97*9880d681SAndroid Build Coastguard Worker; BMI2: ret
98*9880d681SAndroid Build Coastguard Worker; BMI264: lshr32
99*9880d681SAndroid Build Coastguard Worker; BMI264: shrxl
100*9880d681SAndroid Build Coastguard Worker; BMI264: ret
101*9880d681SAndroid Build Coastguard Worker  ret i32 %shl
102*9880d681SAndroid Build Coastguard Worker}
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerdefine i32 @lshr32p(i32* %p, i32 %shamt) nounwind uwtable readnone {
105*9880d681SAndroid Build Coastguard Workerentry:
106*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32* %p
107*9880d681SAndroid Build Coastguard Worker  %shl = lshr i32 %x, %shamt
108*9880d681SAndroid Build Coastguard Worker; BMI2: lshr32p
109*9880d681SAndroid Build Coastguard Worker; BMI2: shrxl %{{.+}}, ({{.+}}), %{{.+}}
110*9880d681SAndroid Build Coastguard Worker; BMI2: ret
111*9880d681SAndroid Build Coastguard Worker; BMI264: lshr32p
112*9880d681SAndroid Build Coastguard Worker; BMI264: shrxl %{{.+}}, ({{.+}}), %{{.+}}
113*9880d681SAndroid Build Coastguard Worker; BMI264: ret
114*9880d681SAndroid Build Coastguard Worker  ret i32 %shl
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdefine i64 @lshr64(i64 %x, i64 %shamt) nounwind uwtable readnone {
118*9880d681SAndroid Build Coastguard Workerentry:
119*9880d681SAndroid Build Coastguard Worker  %shl = lshr i64 %x, %shamt
120*9880d681SAndroid Build Coastguard Worker; BMI264: lshr64
121*9880d681SAndroid Build Coastguard Worker; BMI264: shrxq
122*9880d681SAndroid Build Coastguard Worker; BMI264: ret
123*9880d681SAndroid Build Coastguard Worker  ret i64 %shl
124*9880d681SAndroid Build Coastguard Worker}
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerdefine i64 @lshr64p(i64* %p, i64 %shamt) nounwind uwtable readnone {
127*9880d681SAndroid Build Coastguard Workerentry:
128*9880d681SAndroid Build Coastguard Worker  %x = load i64, i64* %p
129*9880d681SAndroid Build Coastguard Worker  %shl = lshr i64 %x, %shamt
130*9880d681SAndroid Build Coastguard Worker; BMI264: lshr64p
131*9880d681SAndroid Build Coastguard Worker; BMI264: shrxq %{{.+}}, ({{.+}}), %{{.+}}
132*9880d681SAndroid Build Coastguard Worker; BMI264: ret
133*9880d681SAndroid Build Coastguard Worker  ret i64 %shl
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerdefine i32 @ashr32(i32 %x, i32 %shamt) nounwind uwtable readnone {
137*9880d681SAndroid Build Coastguard Workerentry:
138*9880d681SAndroid Build Coastguard Worker  %shl = ashr i32 %x, %shamt
139*9880d681SAndroid Build Coastguard Worker; BMI2: ashr32
140*9880d681SAndroid Build Coastguard Worker; BMI2: sarxl
141*9880d681SAndroid Build Coastguard Worker; BMI2: ret
142*9880d681SAndroid Build Coastguard Worker; BMI264: ashr32
143*9880d681SAndroid Build Coastguard Worker; BMI264: sarxl
144*9880d681SAndroid Build Coastguard Worker; BMI264: ret
145*9880d681SAndroid Build Coastguard Worker  ret i32 %shl
146*9880d681SAndroid Build Coastguard Worker}
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerdefine i32 @ashr32p(i32* %p, i32 %shamt) nounwind uwtable readnone {
149*9880d681SAndroid Build Coastguard Workerentry:
150*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32* %p
151*9880d681SAndroid Build Coastguard Worker  %shl = ashr i32 %x, %shamt
152*9880d681SAndroid Build Coastguard Worker; BMI2: ashr32p
153*9880d681SAndroid Build Coastguard Worker; Source order scheduling prevents folding, rdar:14208996.
154*9880d681SAndroid Build Coastguard Worker; BMI2: sarxl %{{.+}}, ({{.+}}), %{{.+}}
155*9880d681SAndroid Build Coastguard Worker; BMI2: ret
156*9880d681SAndroid Build Coastguard Worker; BMI264: ashr32p
157*9880d681SAndroid Build Coastguard Worker; BMI264: sarxl %{{.+}}, ({{.+}}), %{{.+}}
158*9880d681SAndroid Build Coastguard Worker; BMI264: ret
159*9880d681SAndroid Build Coastguard Worker  ret i32 %shl
160*9880d681SAndroid Build Coastguard Worker}
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerdefine i64 @ashr64(i64 %x, i64 %shamt) nounwind uwtable readnone {
163*9880d681SAndroid Build Coastguard Workerentry:
164*9880d681SAndroid Build Coastguard Worker  %shl = ashr i64 %x, %shamt
165*9880d681SAndroid Build Coastguard Worker; BMI264: ashr64
166*9880d681SAndroid Build Coastguard Worker; BMI264: sarxq
167*9880d681SAndroid Build Coastguard Worker; BMI264: ret
168*9880d681SAndroid Build Coastguard Worker  ret i64 %shl
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdefine i64 @ashr64p(i64* %p, i64 %shamt) nounwind uwtable readnone {
172*9880d681SAndroid Build Coastguard Workerentry:
173*9880d681SAndroid Build Coastguard Worker  %x = load i64, i64* %p
174*9880d681SAndroid Build Coastguard Worker  %shl = ashr i64 %x, %shamt
175*9880d681SAndroid Build Coastguard Worker; BMI264: ashr64p
176*9880d681SAndroid Build Coastguard Worker; BMI264: sarxq %{{.+}}, ({{.+}}), %{{.+}}
177*9880d681SAndroid Build Coastguard Worker; BMI264: ret
178*9880d681SAndroid Build Coastguard Worker  ret i64 %shl
179*9880d681SAndroid Build Coastguard Worker}
180