xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/fast-isel-cmp-imm.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O0 -fast-isel-abort=1 -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=ARM
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O0 -fast-isel-abort=1 -relocation-model=dynamic-no-pic -mtriple=armv7-linux-gnueabi -verify-machineinstrs | FileCheck %s --check-prefix=ARM
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O0 -fast-isel-abort=1 -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=THUMB
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine void @t1a(float %a) uwtable ssp {
6*9880d681SAndroid Build Coastguard Workerentry:
7*9880d681SAndroid Build Coastguard Worker; ARM: t1a
8*9880d681SAndroid Build Coastguard Worker; THUMB: t1a
9*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %a, 0.000000e+00
10*9880d681SAndroid Build Coastguard Worker; ARM: vcmpe.f32 s{{[0-9]+}}, #0
11*9880d681SAndroid Build Coastguard Worker; THUMB: vcmpe.f32 s{{[0-9]+}}, #0
12*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
15*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
16*9880d681SAndroid Build Coastguard Worker  br label %if.end
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
19*9880d681SAndroid Build Coastguard Worker  ret void
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerdeclare void @foo()
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; Shouldn't be able to encode -0.0 imm.
25*9880d681SAndroid Build Coastguard Workerdefine void @t1b(float %a) uwtable ssp {
26*9880d681SAndroid Build Coastguard Workerentry:
27*9880d681SAndroid Build Coastguard Worker; ARM: t1b
28*9880d681SAndroid Build Coastguard Worker; THUMB: t1b
29*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %a, -0.000000e+00
30*9880d681SAndroid Build Coastguard Worker; ARM: vldr
31*9880d681SAndroid Build Coastguard Worker; ARM: vcmpe.f32 s{{[0-9]+}}, s{{[0-9]+}}
32*9880d681SAndroid Build Coastguard Worker; THUMB: vldr
33*9880d681SAndroid Build Coastguard Worker; THUMB: vcmpe.f32 s{{[0-9]+}}, s{{[0-9]+}}
34*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
37*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
38*9880d681SAndroid Build Coastguard Worker  br label %if.end
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
41*9880d681SAndroid Build Coastguard Worker  ret void
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine void @t2a(double %a) uwtable ssp {
45*9880d681SAndroid Build Coastguard Workerentry:
46*9880d681SAndroid Build Coastguard Worker; ARM: t2a
47*9880d681SAndroid Build Coastguard Worker; THUMB: t2a
48*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq double %a, 0.000000e+00
49*9880d681SAndroid Build Coastguard Worker; ARM: vcmpe.f64 d{{[0-9]+}}, #0
50*9880d681SAndroid Build Coastguard Worker; THUMB: vcmpe.f64 d{{[0-9]+}}, #0
51*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
54*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
55*9880d681SAndroid Build Coastguard Worker  br label %if.end
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
58*9880d681SAndroid Build Coastguard Worker  ret void
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker; Shouldn't be able to encode -0.0 imm.
62*9880d681SAndroid Build Coastguard Workerdefine void @t2b(double %a) uwtable ssp {
63*9880d681SAndroid Build Coastguard Workerentry:
64*9880d681SAndroid Build Coastguard Worker; ARM: t2b
65*9880d681SAndroid Build Coastguard Worker; THUMB: t2b
66*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq double %a, -0.000000e+00
67*9880d681SAndroid Build Coastguard Worker; ARM: vldr
68*9880d681SAndroid Build Coastguard Worker; ARM: vcmpe.f64 d{{[0-9]+}}, d{{[0-9]+}}
69*9880d681SAndroid Build Coastguard Worker; THUMB: vldr
70*9880d681SAndroid Build Coastguard Worker; THUMB: vcmpe.f64 d{{[0-9]+}}, d{{[0-9]+}}
71*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
74*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
75*9880d681SAndroid Build Coastguard Worker  br label %if.end
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
78*9880d681SAndroid Build Coastguard Worker  ret void
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine void @t4(i8 signext %a) uwtable ssp {
82*9880d681SAndroid Build Coastguard Workerentry:
83*9880d681SAndroid Build Coastguard Worker; ARM: t4
84*9880d681SAndroid Build Coastguard Worker; THUMB: t4
85*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %a, -1
86*9880d681SAndroid Build Coastguard Worker; ARM: cmn r{{[0-9]}}, #1
87*9880d681SAndroid Build Coastguard Worker; THUMB: cmn.w r{{[0-9]}}, #1
88*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
91*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
92*9880d681SAndroid Build Coastguard Worker  br label %if.end
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
95*9880d681SAndroid Build Coastguard Worker  ret void
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdefine void @t5(i8 zeroext %a) uwtable ssp {
99*9880d681SAndroid Build Coastguard Workerentry:
100*9880d681SAndroid Build Coastguard Worker; ARM: t5
101*9880d681SAndroid Build Coastguard Worker; THUMB: t5
102*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %a, 1
103*9880d681SAndroid Build Coastguard Worker; ARM: cmp r{{[0-9]}}, #1
104*9880d681SAndroid Build Coastguard Worker; THUMB: cmp r{{[0-9]}}, #1
105*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
108*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
109*9880d681SAndroid Build Coastguard Worker  br label %if.end
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
112*9880d681SAndroid Build Coastguard Worker  ret void
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine void @t6(i16 signext %a) uwtable ssp {
116*9880d681SAndroid Build Coastguard Workerentry:
117*9880d681SAndroid Build Coastguard Worker; ARM: t6
118*9880d681SAndroid Build Coastguard Worker; THUMB: t6
119*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i16 %a, -1
120*9880d681SAndroid Build Coastguard Worker; ARM: cmn r{{[0-9]}}, #1
121*9880d681SAndroid Build Coastguard Worker; THUMB: cmn.w r{{[0-9]}}, #1
122*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
125*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
126*9880d681SAndroid Build Coastguard Worker  br label %if.end
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
129*9880d681SAndroid Build Coastguard Worker  ret void
130*9880d681SAndroid Build Coastguard Worker}
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerdefine void @t7(i16 zeroext %a) uwtable ssp {
133*9880d681SAndroid Build Coastguard Workerentry:
134*9880d681SAndroid Build Coastguard Worker; ARM: t7
135*9880d681SAndroid Build Coastguard Worker; THUMB: t7
136*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i16 %a, 1
137*9880d681SAndroid Build Coastguard Worker; ARM: cmp r{{[0-9]}}, #1
138*9880d681SAndroid Build Coastguard Worker; THUMB: cmp r{{[0-9]}}, #1
139*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
142*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
143*9880d681SAndroid Build Coastguard Worker  br label %if.end
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
146*9880d681SAndroid Build Coastguard Worker  ret void
147*9880d681SAndroid Build Coastguard Worker}
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine void @t8(i32 %a) uwtable ssp {
150*9880d681SAndroid Build Coastguard Workerentry:
151*9880d681SAndroid Build Coastguard Worker; ARM: t8
152*9880d681SAndroid Build Coastguard Worker; THUMB: t8
153*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %a, -1
154*9880d681SAndroid Build Coastguard Worker; ARM: cmn r{{[0-9]}}, #1
155*9880d681SAndroid Build Coastguard Worker; THUMB: cmn.w r{{[0-9]}}, #1
156*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
159*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
160*9880d681SAndroid Build Coastguard Worker  br label %if.end
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
163*9880d681SAndroid Build Coastguard Worker  ret void
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerdefine void @t9(i32 %a) uwtable ssp {
167*9880d681SAndroid Build Coastguard Workerentry:
168*9880d681SAndroid Build Coastguard Worker; ARM: t9
169*9880d681SAndroid Build Coastguard Worker; THUMB: t9
170*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %a, 1
171*9880d681SAndroid Build Coastguard Worker; ARM: cmp r{{[0-9]}}, #1
172*9880d681SAndroid Build Coastguard Worker; THUMB: cmp r{{[0-9]}}, #1
173*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
176*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
177*9880d681SAndroid Build Coastguard Worker  br label %if.end
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
180*9880d681SAndroid Build Coastguard Worker  ret void
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Workerdefine void @t10(i32 %a) uwtable ssp {
184*9880d681SAndroid Build Coastguard Workerentry:
185*9880d681SAndroid Build Coastguard Worker; ARM: t10
186*9880d681SAndroid Build Coastguard Worker; THUMB: t10
187*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %a, 384
188*9880d681SAndroid Build Coastguard Worker; ARM: cmp r{{[0-9]}}, #384
189*9880d681SAndroid Build Coastguard Worker; THUMB: cmp.w r{{[0-9]}}, #384
190*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
193*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
194*9880d681SAndroid Build Coastguard Worker  br label %if.end
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
197*9880d681SAndroid Build Coastguard Worker  ret void
198*9880d681SAndroid Build Coastguard Worker}
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Workerdefine void @t11(i32 %a) uwtable ssp {
201*9880d681SAndroid Build Coastguard Workerentry:
202*9880d681SAndroid Build Coastguard Worker; ARM: t11
203*9880d681SAndroid Build Coastguard Worker; THUMB: t11
204*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %a, 4096
205*9880d681SAndroid Build Coastguard Worker; ARM: cmp r{{[0-9]}}, #4096
206*9880d681SAndroid Build Coastguard Worker; THUMB: cmp.w r{{[0-9]}}, #4096
207*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
210*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
211*9880d681SAndroid Build Coastguard Worker  br label %if.end
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
214*9880d681SAndroid Build Coastguard Worker  ret void
215*9880d681SAndroid Build Coastguard Worker}
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Workerdefine void @t12(i8 %a) uwtable ssp {
218*9880d681SAndroid Build Coastguard Workerentry:
219*9880d681SAndroid Build Coastguard Worker; ARM: t12
220*9880d681SAndroid Build Coastguard Worker; THUMB: t12
221*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i8 %a, -113
222*9880d681SAndroid Build Coastguard Worker; ARM: cmp r{{[0-9]}}, #143
223*9880d681SAndroid Build Coastguard Worker; THUMB: cmp r{{[0-9]}}, #143
224*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
227*9880d681SAndroid Build Coastguard Worker  tail call void @foo()
228*9880d681SAndroid Build Coastguard Worker  br label %if.end
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %if.then, %entry
231*9880d681SAndroid Build Coastguard Worker  ret void
232*9880d681SAndroid Build Coastguard Worker}
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Worker; rdar://11038907
235*9880d681SAndroid Build Coastguard Worker; When comparing LONG_MIN/INT_MIN use a cmp instruction.
236*9880d681SAndroid Build Coastguard Workerdefine void @t13() nounwind ssp {
237*9880d681SAndroid Build Coastguard Workerentry:
238*9880d681SAndroid Build Coastguard Worker; ARM: t13
239*9880d681SAndroid Build Coastguard Worker; THUMB: t13
240*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 -123, -2147483648
241*9880d681SAndroid Build Coastguard Worker; ARM: cmp r{{[0-9]}}, #-2147483648
242*9880d681SAndroid Build Coastguard Worker; THUMB: cmp.w r{{[0-9]}}, #-2147483648
243*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
246*9880d681SAndroid Build Coastguard Worker  ret void
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %entry
249*9880d681SAndroid Build Coastguard Worker  ret void
250*9880d681SAndroid Build Coastguard Worker}
251*9880d681SAndroid Build Coastguard Worker
252