xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/peep-test-4.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+bmi,+bmi2,+popcnt,+lzcnt | FileCheck %s
2*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i32)
3*9880d681SAndroid Build Coastguard Workerdeclare void @foo32(i32)
4*9880d681SAndroid Build Coastguard Workerdeclare void @foo64(i64)
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: neg:
7*9880d681SAndroid Build Coastguard Worker; CHECK: negl %edi
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
9*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo
10*9880d681SAndroid Build Coastguard Worker; CHECK: ret
11*9880d681SAndroid Build Coastguard Workerdefine void @neg(i32 %x) nounwind {
12*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 0, %x
13*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %sub, 0
14*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %bb
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerbb:
17*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %sub)
18*9880d681SAndroid Build Coastguard Worker  br label %return
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerreturn:
21*9880d681SAndroid Build Coastguard Worker  ret void
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sar:
25*9880d681SAndroid Build Coastguard Worker; CHECK: sarl %edi
26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
27*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo
28*9880d681SAndroid Build Coastguard Worker; CHECK: ret
29*9880d681SAndroid Build Coastguard Workerdefine void @sar(i32 %x) nounwind {
30*9880d681SAndroid Build Coastguard Worker  %ashr = ashr i32 %x, 1
31*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %ashr, 0
32*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %bb
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerbb:
35*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %ashr)
36*9880d681SAndroid Build Coastguard Worker  br label %return
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerreturn:
39*9880d681SAndroid Build Coastguard Worker  ret void
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shr:
43*9880d681SAndroid Build Coastguard Worker; CHECK: shrl %edi
44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
45*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo
46*9880d681SAndroid Build Coastguard Worker; CHECK: ret
47*9880d681SAndroid Build Coastguard Workerdefine void @shr(i32 %x) nounwind {
48*9880d681SAndroid Build Coastguard Worker  %ashr = lshr i32 %x, 1
49*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %ashr, 0
50*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %bb
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Workerbb:
53*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %ashr)
54*9880d681SAndroid Build Coastguard Worker  br label %return
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerreturn:
57*9880d681SAndroid Build Coastguard Worker  ret void
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shri:
61*9880d681SAndroid Build Coastguard Worker; CHECK: shrl $3, %edi
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
63*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo
64*9880d681SAndroid Build Coastguard Worker; CHECK: ret
65*9880d681SAndroid Build Coastguard Workerdefine void @shri(i32 %x) nounwind {
66*9880d681SAndroid Build Coastguard Worker  %ashr = lshr i32 %x, 3
67*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %ashr, 0
68*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %bb
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerbb:
71*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %ashr)
72*9880d681SAndroid Build Coastguard Worker  br label %return
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerreturn:
75*9880d681SAndroid Build Coastguard Worker  ret void
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shl:
79*9880d681SAndroid Build Coastguard Worker; CHECK: addl %edi, %edi
80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
81*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo
82*9880d681SAndroid Build Coastguard Worker; CHECK: ret
83*9880d681SAndroid Build Coastguard Workerdefine void @shl(i32 %x) nounwind {
84*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %x, 1
85*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %shl, 0
86*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %bb
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerbb:
89*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %shl)
90*9880d681SAndroid Build Coastguard Worker  br label %return
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerreturn:
93*9880d681SAndroid Build Coastguard Worker  ret void
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shli:
97*9880d681SAndroid Build Coastguard Worker; CHECK: shll $4, %edi
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
99*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo
100*9880d681SAndroid Build Coastguard Worker; CHECK: ret
101*9880d681SAndroid Build Coastguard Workerdefine void @shli(i32 %x) nounwind {
102*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %x, 4
103*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %shl, 0
104*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %bb
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerbb:
107*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %shl)
108*9880d681SAndroid Build Coastguard Worker  br label %return
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerreturn:
111*9880d681SAndroid Build Coastguard Worker  ret void
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: adc:
115*9880d681SAndroid Build Coastguard Worker; CHECK: movabsq $-9223372036854775808, %rax
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addq  %rdi, %rax
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adcq  $0, %rsi
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sete  %al
119*9880d681SAndroid Build Coastguard Worker; CHECK: ret
120*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @adc(i128 %x) nounwind {
121*9880d681SAndroid Build Coastguard Worker  %add = add i128 %x, 9223372036854775808
122*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i128 %add, 18446744073709551616
123*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
124*9880d681SAndroid Build Coastguard Worker}
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sbb:
127*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq  %rdx, %rdi
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sbbq  %rcx, %rsi
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: setns %al
130*9880d681SAndroid Build Coastguard Worker; CHECK: ret
131*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @sbb(i128 %x, i128 %y) nounwind {
132*9880d681SAndroid Build Coastguard Worker  %sub = sub i128 %x, %y
133*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i128 %sub, 0
134*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: andn:
138*9880d681SAndroid Build Coastguard Worker; CHECK: andnl   %esi, %edi, %edi
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
140*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo
141*9880d681SAndroid Build Coastguard Worker; CHECK: ret
142*9880d681SAndroid Build Coastguard Workerdefine void @andn(i32 %x, i32 %y) nounwind {
143*9880d681SAndroid Build Coastguard Worker  %not = xor i32 %x, -1
144*9880d681SAndroid Build Coastguard Worker  %andn = and i32 %y, %not
145*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %andn, 0
146*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %bb
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerbb:
149*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %andn)
150*9880d681SAndroid Build Coastguard Worker  br label %return
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerreturn:
153*9880d681SAndroid Build Coastguard Worker  ret void
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bextr:
157*9880d681SAndroid Build Coastguard Worker; CHECK: bextrl   %esi, %edi, %edi
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
159*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo
160*9880d681SAndroid Build Coastguard Worker; CHECK: ret
161*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.bmi.bextr.32(i32, i32) nounwind readnone
162*9880d681SAndroid Build Coastguard Workerdefine void @bextr(i32 %x, i32 %y) nounwind {
163*9880d681SAndroid Build Coastguard Worker  %bextr = tail call i32 @llvm.x86.bmi.bextr.32(i32 %x, i32 %y)
164*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %bextr, 0
165*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %bb
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerbb:
168*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %bextr)
169*9880d681SAndroid Build Coastguard Worker  br label %return
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerreturn:
172*9880d681SAndroid Build Coastguard Worker  ret void
173*9880d681SAndroid Build Coastguard Worker}
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: popcnt:
176*9880d681SAndroid Build Coastguard Worker; CHECK: popcntl
177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
178*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo
179*9880d681SAndroid Build Coastguard Worker; CHECK: ret
180*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.ctpop.i32(i32) nounwind readnone
181*9880d681SAndroid Build Coastguard Workerdefine void @popcnt(i32 %x) nounwind {
182*9880d681SAndroid Build Coastguard Worker  %popcnt = tail call i32 @llvm.ctpop.i32(i32 %x)
183*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %popcnt, 0
184*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %bb
185*9880d681SAndroid Build Coastguard Worker;
186*9880d681SAndroid Build Coastguard Workerbb:
187*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %popcnt)
188*9880d681SAndroid Build Coastguard Worker  br label %return
189*9880d681SAndroid Build Coastguard Worker;
190*9880d681SAndroid Build Coastguard Workerreturn:
191*9880d681SAndroid Build Coastguard Worker  ret void
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testCTZ
195*9880d681SAndroid Build Coastguard Worker; CHECK: tzcntq
196*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test
197*9880d681SAndroid Build Coastguard Worker; CHECK: cmovaeq
198*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.cttz.i64(i64, i1)
199*9880d681SAndroid Build Coastguard Workerdefine i64 @testCTZ(i64 %v) nounwind {
200*9880d681SAndroid Build Coastguard Worker  %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true)
201*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i64 %v, 0
202*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %tobool, i64 255, i64 %cnt
203*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
204*9880d681SAndroid Build Coastguard Worker}
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testCTZ2
207*9880d681SAndroid Build Coastguard Worker; CHECK: tzcntl
208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jb
209*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo
210*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.cttz.i32(i32, i1)
211*9880d681SAndroid Build Coastguard Workerdefine void @testCTZ2(i32 %v) nounwind {
212*9880d681SAndroid Build Coastguard Worker  %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
213*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %v, 0
214*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %bb
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Workerbb:
217*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %cnt)
218*9880d681SAndroid Build Coastguard Worker  br label %return
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Workerreturn:
221*9880d681SAndroid Build Coastguard Worker  tail call void @foo32(i32 %cnt)
222*9880d681SAndroid Build Coastguard Worker  ret void
223*9880d681SAndroid Build Coastguard Worker}
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testCTZ3
226*9880d681SAndroid Build Coastguard Worker; CHECK: tzcntl
227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jae
228*9880d681SAndroid Build Coastguard Worker; CHECK: jmp foo
229*9880d681SAndroid Build Coastguard Workerdefine void @testCTZ3(i32 %v) nounwind {
230*9880d681SAndroid Build Coastguard Worker  %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
231*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %v, 0
232*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %return, label %bb
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Workerbb:
235*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %cnt)
236*9880d681SAndroid Build Coastguard Worker  br label %return
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Workerreturn:
239*9880d681SAndroid Build Coastguard Worker  tail call void @foo32(i32 %cnt)
240*9880d681SAndroid Build Coastguard Worker  ret void
241*9880d681SAndroid Build Coastguard Worker}
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testCLZ
244*9880d681SAndroid Build Coastguard Worker; CHECK: lzcntq
245*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test
246*9880d681SAndroid Build Coastguard Worker; CHECK: cmovaeq
247*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctlz.i64(i64, i1)
248*9880d681SAndroid Build Coastguard Workerdefine i64 @testCLZ(i64 %v) nounwind {
249*9880d681SAndroid Build Coastguard Worker  %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true)
250*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i64 %v, 0
251*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %tobool, i64 %cnt, i64 255
252*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
253*9880d681SAndroid Build Coastguard Worker}
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testPOPCNT
256*9880d681SAndroid Build Coastguard Worker; CHECK: popcntq
257*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test
258*9880d681SAndroid Build Coastguard Worker; CHECK: cmovneq
259*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctpop.i64(i64)
260*9880d681SAndroid Build Coastguard Workerdefine i64 @testPOPCNT(i64 %v) nounwind {
261*9880d681SAndroid Build Coastguard Worker  %cnt = tail call i64 @llvm.ctpop.i64(i64 %v)
262*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i64 %v, 0
263*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %tobool, i64 %cnt, i64 255
264*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
265*9880d681SAndroid Build Coastguard Worker}
266