Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(556)

Side by Side Diff: tests_lit/llvm2ice_tests/fp.cmp.ll

Issue 1414883007: Subzero. ARM32. Implements bool folding. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addresses comments && pulls. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tests_lit/llvm2ice_tests/branch-opt.ll ('k') | tests_lit/llvm2ice_tests/select-opt.ll » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 ; This tries to be a comprehensive test of f32 and f64 compare operations. 1 ; This tries to be a comprehensive test of f32 and f64 compare operations.
2 ; The CHECK lines are only checking for basic instruction patterns 2 ; The CHECK lines are only checking for basic instruction patterns
3 ; that should be present regardless of the optimization level, so 3 ; that should be present regardless of the optimization level, so
4 ; there are no special OPTM1 match lines. 4 ; there are no special OPTM1 match lines.
5 5
6 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 \ 6 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 \
7 ; RUN: -allow-externally-defined-symbols | FileCheck %s 7 ; RUN: -allow-externally-defined-symbols | FileCheck %s
8 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \ 8 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \
9 ; RUN: -allow-externally-defined-symbols | FileCheck %s 9 ; RUN: -allow-externally-defined-symbols | FileCheck %s
10 10
11 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \ 11 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \
12 ; RUN: --target arm32 -i %s --args -O2 --skip-unimplemented \ 12 ; RUN: --target arm32 -i %s --args -O2 \
13 ; RUN: -allow-externally-defined-symbols \ 13 ; RUN: -allow-externally-defined-symbols \
14 ; RUN: | %if --need=allow_dump --need=target_ARM32 --command FileCheck %s \ 14 ; RUN: | %if --need=allow_dump --need=target_ARM32 --command FileCheck %s \
15 ; RUN: --check-prefix=ARM32 15 ; RUN: --check-prefix=ARM32 --check-prefix=ARM32-O2
16 16
17 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \ 17 ; RUN: %if --need=allow_dump --need=target_ARM32 --command %p2i --filetype=asm \
18 ; RUN: --target arm32 -i %s --args -Om1 --skip-unimplemented \ 18 ; RUN: --target arm32 -i %s --args -Om1 \
19 ; RUN: -allow-externally-defined-symbols \ 19 ; RUN: -allow-externally-defined-symbols \
20 ; RUN: | %if --need=allow_dump --need=target_ARM32 --command FileCheck %s \ 20 ; RUN: | %if --need=allow_dump --need=target_ARM32 --command FileCheck %s \
21 ; RUN: --check-prefix=ARM32 21 ; RUN: --check-prefix=ARM32 --check-prefix=ARM32-OM1
22 22
23 define internal void @fcmpEq(float %a, float %b, double %c, double %d) { 23 define internal void @fcmpEq(float %a, float %b, double %c, double %d) {
24 entry: 24 entry:
25 %cmp = fcmp oeq float %a, %b 25 %cmp = fcmp oeq float %a, %b
26 br i1 %cmp, label %if.then, label %if.end 26 br i1 %cmp, label %if.then, label %if.end
27 27
28 if.then: ; preds = %entry 28 if.then: ; preds = %entry
29 call void @func() 29 call void @func()
30 br label %if.end 30 br label %if.end
31 31
(...skipping 12 matching lines...) Expand all
44 ; CHECK: ucomiss 44 ; CHECK: ucomiss
45 ; CHECK: jne 45 ; CHECK: jne
46 ; CHECK-NEXT: jp 46 ; CHECK-NEXT: jp
47 ; CHECK: call {{.*}} R_{{.*}} func 47 ; CHECK: call {{.*}} R_{{.*}} func
48 ; CHECK: ucomisd 48 ; CHECK: ucomisd
49 ; CHECK: jne 49 ; CHECK: jne
50 ; CHECK-NEXT: jp 50 ; CHECK-NEXT: jp
51 ; CHECK: call {{.*}} R_{{.*}} func 51 ; CHECK: call {{.*}} R_{{.*}} func
52 ; ARM32-LABEL: fcmpEq 52 ; ARM32-LABEL: fcmpEq
53 ; ARM32: vcmp.f32 53 ; ARM32: vcmp.f32
54 ; ARM32: mov [[R0:r[0-9]+]], #0
55 ; ARM32: vmrs 54 ; ARM32: vmrs
56 ; ARM32: moveq [[R0]], #1 55 ; ARM32-OM1: movne [[R0:r[0-9]+]], #0
56 ; ARM32-OM1: moveq [[R0]], #1
57 ; ARM32-O2: bne
58 ; ARM32: bl func
57 ; ARM32: vcmp.f64 59 ; ARM32: vcmp.f64
58 ; ARM32: mov [[R1:r[0-9]+]], #0
59 ; ARM32: vmrs 60 ; ARM32: vmrs
60 ; ARM32: moveq [[R1]], #1 61 ; ARM32-OM1: movne [[R1:r[0-9]+]], #0
62 ; ARM32-OM1: moveq [[R1]], #1
63 ; ARM32-O2: bne
61 64
62 declare void @func() 65 declare void @func()
63 66
64 define internal void @fcmpNe(float %a, float %b, double %c, double %d) { 67 define internal void @fcmpNe(float %a, float %b, double %c, double %d) {
65 entry: 68 entry:
66 %cmp = fcmp une float %a, %b 69 %cmp = fcmp une float %a, %b
67 br i1 %cmp, label %if.then, label %if.end 70 br i1 %cmp, label %if.then, label %if.end
68 71
69 if.then: ; preds = %entry 72 if.then: ; preds = %entry
70 call void @func() 73 call void @func()
(...skipping 14 matching lines...) Expand all
85 ; CHECK: ucomiss 88 ; CHECK: ucomiss
86 ; CHECK: jne 89 ; CHECK: jne
87 ; CHECK-NEXT: jp 90 ; CHECK-NEXT: jp
88 ; CHECK: call {{.*}} R_{{.*}} func 91 ; CHECK: call {{.*}} R_{{.*}} func
89 ; CHECK: ucomisd 92 ; CHECK: ucomisd
90 ; CHECK: jne 93 ; CHECK: jne
91 ; CHECK-NEXT: jp 94 ; CHECK-NEXT: jp
92 ; CHECK: call {{.*}} R_{{.*}} func 95 ; CHECK: call {{.*}} R_{{.*}} func
93 ; ARM32-LABEL: fcmpNe 96 ; ARM32-LABEL: fcmpNe
94 ; ARM32: vcmp.f32 97 ; ARM32: vcmp.f32
95 ; ARM32: mov [[R0:r[0-9]+]], #0
96 ; ARM32: vmrs 98 ; ARM32: vmrs
97 ; ARM32: movne [[R0]], #1 99 ; ARM32-OM1: moveq [[R0:r[0-9]+]], #0
100 ; ARM32-OM1: movne [[R0]], #1
101 ; ARM32-O2: beq
98 ; ARM32: vcmp.f64 102 ; ARM32: vcmp.f64
99 ; ARM32: mov [[R1:r[0-9]+]], #0
100 ; ARM32: vmrs 103 ; ARM32: vmrs
101 ; ARM32: movne [[R1]], #1 104 ; ARM32-OM1: moveq [[R1:r[0-9]+]], #0
105 ; ARM32-OM1: movne [[R1]], #1
106 ; ARM32-O2: beq
102 107
103 define internal void @fcmpGt(float %a, float %b, double %c, double %d) { 108 define internal void @fcmpGt(float %a, float %b, double %c, double %d) {
104 entry: 109 entry:
105 %cmp = fcmp ogt float %a, %b 110 %cmp = fcmp ogt float %a, %b
106 br i1 %cmp, label %if.then, label %if.end 111 br i1 %cmp, label %if.then, label %if.end
107 112
108 if.then: ; preds = %entry 113 if.then: ; preds = %entry
109 call void @func() 114 call void @func()
110 br label %if.end 115 br label %if.end
111 116
(...skipping 10 matching lines...) Expand all
122 } 127 }
123 ; CHECK-LABEL: fcmpGt 128 ; CHECK-LABEL: fcmpGt
124 ; CHECK: ucomiss 129 ; CHECK: ucomiss
125 ; CHECK: seta 130 ; CHECK: seta
126 ; CHECK: call {{.*}} R_{{.*}} func 131 ; CHECK: call {{.*}} R_{{.*}} func
127 ; CHECK: ucomisd 132 ; CHECK: ucomisd
128 ; CHECK: seta 133 ; CHECK: seta
129 ; CHECK: call {{.*}} R_{{.*}} func 134 ; CHECK: call {{.*}} R_{{.*}} func
130 ; ARM32-LABEL: fcmpGt 135 ; ARM32-LABEL: fcmpGt
131 ; ARM32: vcmp.f32 136 ; ARM32: vcmp.f32
132 ; ARM32: mov [[R0:r[0-9]+]], #0
133 ; ARM32: vmrs 137 ; ARM32: vmrs
134 ; ARM32: movgt [[R0]], #1 138 ; ARM32-OM1: movle [[R0:r[0-9]+]], #0
139 ; ARM32-OM1: movgt [[R0]], #1
140 ; ARM32-O2: ble
135 ; ARM32: vcmp.f64 141 ; ARM32: vcmp.f64
136 ; ARM32: mov [[R1:r[0-9]+]], #0
137 ; ARM32: vmrs 142 ; ARM32: vmrs
138 ; ARM32: movgt [[R1]], #1 143 ; ARM32-OM1: movle [[R1:r[0-9]+]], #0
144 ; ARM32-OM1: movgt [[R1]], #1
145 ; ARM32-O2: ble
139 146
140 define internal void @fcmpGe(float %a, float %b, double %c, double %d) { 147 define internal void @fcmpGe(float %a, float %b, double %c, double %d) {
141 entry: 148 entry:
142 %cmp = fcmp ult float %a, %b 149 %cmp = fcmp ult float %a, %b
143 br i1 %cmp, label %if.end, label %if.then 150 br i1 %cmp, label %if.end, label %if.then
144 151
145 if.then: ; preds = %entry 152 if.then: ; preds = %entry
146 call void @func() 153 call void @func()
147 br label %if.end 154 br label %if.end
148 155
(...skipping 10 matching lines...) Expand all
159 } 166 }
160 ; CHECK-LABEL: fcmpGe 167 ; CHECK-LABEL: fcmpGe
161 ; CHECK: ucomiss 168 ; CHECK: ucomiss
162 ; CHECK: setb 169 ; CHECK: setb
163 ; CHECK: call {{.*}} R_{{.*}} func 170 ; CHECK: call {{.*}} R_{{.*}} func
164 ; CHECK: ucomisd 171 ; CHECK: ucomisd
165 ; CHECK: setb 172 ; CHECK: setb
166 ; CHECK: call {{.*}} R_{{.*}} func 173 ; CHECK: call {{.*}} R_{{.*}} func
167 ; ARM32-LABEL: fcmpGe 174 ; ARM32-LABEL: fcmpGe
168 ; ARM32: vcmp.f32 175 ; ARM32: vcmp.f32
169 ; ARM32: mov [[R0:r[0-9]+]], #0
170 ; ARM32: vmrs 176 ; ARM32: vmrs
171 ; ARM32: movlt [[R0]], #1 177 ; ARM32-OM1: movge [[R0:r[0-9]+]], #0
178 ; ARM32-OM1: movlt [[R0]], #1
179 ; ARM32-O2: blt
172 ; ARM32: vcmp.f64 180 ; ARM32: vcmp.f64
173 ; ARM32: mov [[R1:r[0-9]+]], #0
174 ; ARM32: vmrs 181 ; ARM32: vmrs
175 ; ARM32: movlt [[R1]], #1 182 ; ARM32-OM1: movge [[R1:r[0-9]+]], #0
183 ; ARM32-OM1: movlt [[R1]], #1
184 ; ARM32-O2: blt
176 185
177 define internal void @fcmpLt(float %a, float %b, double %c, double %d) { 186 define internal void @fcmpLt(float %a, float %b, double %c, double %d) {
178 entry: 187 entry:
179 %cmp = fcmp olt float %a, %b 188 %cmp = fcmp olt float %a, %b
180 br i1 %cmp, label %if.then, label %if.end 189 br i1 %cmp, label %if.then, label %if.end
181 190
182 if.then: ; preds = %entry 191 if.then: ; preds = %entry
183 call void @func() 192 call void @func()
184 br label %if.end 193 br label %if.end
185 194
(...skipping 10 matching lines...) Expand all
196 } 205 }
197 ; CHECK-LABEL: fcmpLt 206 ; CHECK-LABEL: fcmpLt
198 ; CHECK: ucomiss 207 ; CHECK: ucomiss
199 ; CHECK: seta 208 ; CHECK: seta
200 ; CHECK: call {{.*}} R_{{.*}} func 209 ; CHECK: call {{.*}} R_{{.*}} func
201 ; CHECK: ucomisd 210 ; CHECK: ucomisd
202 ; CHECK: seta 211 ; CHECK: seta
203 ; CHECK: call {{.*}} R_{{.*}} func 212 ; CHECK: call {{.*}} R_{{.*}} func
204 ; ARM32-LABEL: fcmpLt 213 ; ARM32-LABEL: fcmpLt
205 ; ARM32: vcmp.f32 214 ; ARM32: vcmp.f32
206 ; ARM32: mov [[R0:r[0-9]+]], #0
207 ; ARM32: vmrs 215 ; ARM32: vmrs
208 ; ARM32: movmi [[R0]], #1 216 ; ARM32-OM1: movpl [[R0:r[0-9]+]], #0
217 ; ARM32-OM1: movmi [[R0]], #1
218 ; ARM32-O2: bpl
209 ; ARM32: vcmp.f64 219 ; ARM32: vcmp.f64
210 ; ARM32: mov [[R1:r[0-9]+]], #0
211 ; ARM32: vmrs 220 ; ARM32: vmrs
212 ; ARM32: movmi [[R1]], #1 221 ; ARM32-OM1: movpl [[R1:r[0-9]+]], #0
222 ; ARM32-OM1: movmi [[R1]], #1
223 ; ARM32-O2: bpl
213 224
214 define internal void @fcmpLe(float %a, float %b, double %c, double %d) { 225 define internal void @fcmpLe(float %a, float %b, double %c, double %d) {
215 entry: 226 entry:
216 %cmp = fcmp ugt float %a, %b 227 %cmp = fcmp ugt float %a, %b
217 br i1 %cmp, label %if.end, label %if.then 228 br i1 %cmp, label %if.end, label %if.then
218 229
219 if.then: ; preds = %entry 230 if.then: ; preds = %entry
220 call void @func() 231 call void @func()
221 br label %if.end 232 br label %if.end
222 233
(...skipping 10 matching lines...) Expand all
233 } 244 }
234 ; CHECK-LABEL: fcmpLe 245 ; CHECK-LABEL: fcmpLe
235 ; CHECK: ucomiss 246 ; CHECK: ucomiss
236 ; CHECK: setb 247 ; CHECK: setb
237 ; CHECK: call {{.*}} R_{{.*}} func 248 ; CHECK: call {{.*}} R_{{.*}} func
238 ; CHECK: ucomisd 249 ; CHECK: ucomisd
239 ; CHECK: setb 250 ; CHECK: setb
240 ; CHECK: call {{.*}} R_{{.*}} func 251 ; CHECK: call {{.*}} R_{{.*}} func
241 ; ARM32-LABEL: fcmpLe 252 ; ARM32-LABEL: fcmpLe
242 ; ARM32: vcmp.f32 253 ; ARM32: vcmp.f32
243 ; ARM32: mov [[R0:r[0-9]+]], #0
244 ; ARM32: vmrs 254 ; ARM32: vmrs
245 ; ARM32: movhi [[R0]], #1 255 ; ARM32-OM1: movls [[R0:r[0-9]+]], #0
256 ; ARM32-OM1: movhi [[R0]], #1
257 ; ARM32-O2: bhi
246 ; ARM32: vcmp.f64 258 ; ARM32: vcmp.f64
247 ; ARM32: mov [[R1:r[0-9]+]], #0
248 ; ARM32: vmrs 259 ; ARM32: vmrs
249 ; ARM32: movhi [[R1]], #1 260 ; ARM32-OM1: movls [[R1:r[0-9]+]], #0
261 ; ARM32-OM1: movhi [[R1]], #1
262 ; ARM32-O2: bhi
250 263
251 define internal i32 @fcmpFalseFloat(float %a, float %b) { 264 define internal i32 @fcmpFalseFloat(float %a, float %b) {
252 entry: 265 entry:
253 %cmp = fcmp false float %a, %b 266 %cmp = fcmp false float %a, %b
254 %cmp.ret_ext = zext i1 %cmp to i32 267 %cmp.ret_ext = zext i1 %cmp to i32
255 ret i32 %cmp.ret_ext 268 ret i32 %cmp.ret_ext
256 } 269 }
257 ; CHECK-LABEL: fcmpFalseFloat 270 ; CHECK-LABEL: fcmpFalseFloat
258 ; CHECK: mov {{.*}},0x0 271 ; CHECK: mov {{.*}},0x0
259 ; ARM32-LABEL: fcmpFalseFloat 272 ; ARM32-LABEL: fcmpFalseFloat
260 ; ARM32: vcmp.f32
261 ; ARM32: mov [[R:r[0-9]+]], #0 273 ; ARM32: mov [[R:r[0-9]+]], #0
262 274
263 define internal i32 @fcmpFalseDouble(double %a, double %b) { 275 define internal i32 @fcmpFalseDouble(double %a, double %b) {
264 entry: 276 entry:
265 %cmp = fcmp false double %a, %b 277 %cmp = fcmp false double %a, %b
266 %cmp.ret_ext = zext i1 %cmp to i32 278 %cmp.ret_ext = zext i1 %cmp to i32
267 ret i32 %cmp.ret_ext 279 ret i32 %cmp.ret_ext
268 } 280 }
269 ; CHECK-LABEL: fcmpFalseDouble 281 ; CHECK-LABEL: fcmpFalseDouble
270 ; CHECK: mov {{.*}},0x0 282 ; CHECK: mov {{.*}},0x0
271 ; ARM32-LABEL: fcmpFalseDouble 283 ; ARM32-LABEL: fcmpFalseDouble
272 ; ARM32: vcmp.f64
273 ; ARM32: mov [[R:r[0-9]+]], #0 284 ; ARM32: mov [[R:r[0-9]+]], #0
274 285
275 define internal i32 @fcmpOeqFloat(float %a, float %b) { 286 define internal i32 @fcmpOeqFloat(float %a, float %b) {
276 entry: 287 entry:
277 %cmp = fcmp oeq float %a, %b 288 %cmp = fcmp oeq float %a, %b
278 %cmp.ret_ext = zext i1 %cmp to i32 289 %cmp.ret_ext = zext i1 %cmp to i32
279 ret i32 %cmp.ret_ext 290 ret i32 %cmp.ret_ext
280 } 291 }
281 ; CHECK-LABEL: fcmpOeqFloat 292 ; CHECK-LABEL: fcmpOeqFloat
282 ; CHECK: ucomiss 293 ; CHECK: ucomiss
283 ; CHECK: jne 294 ; CHECK: jne
284 ; CHECK: jp 295 ; CHECK: jp
285 ; ARM32-LABEL: fcmpOeqFloat 296 ; ARM32-LABEL: fcmpOeqFloat
286 ; ARM32: vcmp.f32 297 ; ARM32: vcmp.f32
287 ; ARM32: mov [[R:r[0-9]+]], #0
288 ; ARM32: vmrs 298 ; ARM32: vmrs
299 ; ARM32: movne [[R:r[0-9]+]], #0
289 ; ARM32: moveq [[R]], #1 300 ; ARM32: moveq [[R]], #1
290 301
291 define internal i32 @fcmpOeqDouble(double %a, double %b) { 302 define internal i32 @fcmpOeqDouble(double %a, double %b) {
292 entry: 303 entry:
293 %cmp = fcmp oeq double %a, %b 304 %cmp = fcmp oeq double %a, %b
294 %cmp.ret_ext = zext i1 %cmp to i32 305 %cmp.ret_ext = zext i1 %cmp to i32
295 ret i32 %cmp.ret_ext 306 ret i32 %cmp.ret_ext
296 } 307 }
297 ; CHECK-LABEL: fcmpOeqDouble 308 ; CHECK-LABEL: fcmpOeqDouble
298 ; CHECK: ucomisd 309 ; CHECK: ucomisd
299 ; CHECK: jne 310 ; CHECK: jne
300 ; CHECK: jp 311 ; CHECK: jp
301 ; ARM32-LABEL: fcmpOeqDouble 312 ; ARM32-LABEL: fcmpOeqDouble
302 ; ARM32: vcmp.f64 313 ; ARM32: vcmp.f64
303 ; ARM32: mov [[R:r[0-9]+]], #0
304 ; ARM32: vmrs 314 ; ARM32: vmrs
315 ; ARM32: movne [[R:r[0-9]+]], #0
305 ; ARM32: moveq [[R]], #1 316 ; ARM32: moveq [[R]], #1
306 317
307 define internal i32 @fcmpOgtFloat(float %a, float %b) { 318 define internal i32 @fcmpOgtFloat(float %a, float %b) {
308 entry: 319 entry:
309 %cmp = fcmp ogt float %a, %b 320 %cmp = fcmp ogt float %a, %b
310 %cmp.ret_ext = zext i1 %cmp to i32 321 %cmp.ret_ext = zext i1 %cmp to i32
311 ret i32 %cmp.ret_ext 322 ret i32 %cmp.ret_ext
312 } 323 }
313 ; CHECK-LABEL: fcmpOgtFloat 324 ; CHECK-LABEL: fcmpOgtFloat
314 ; CHECK: ucomiss 325 ; CHECK: ucomiss
315 ; CHECK: seta 326 ; CHECK: seta
316 ; ARM32-LABEL: fcmpOgtFloat 327 ; ARM32-LABEL: fcmpOgtFloat
317 ; ARM32: vcmp.f32 328 ; ARM32: vcmp.f32
318 ; ARM32: mov [[R:r[0-9]+]], #0
319 ; ARM32: vmrs 329 ; ARM32: vmrs
330 ; ARM32: movle [[R:r[0-9]+]], #0
320 ; ARM32: movgt [[R]], #1 331 ; ARM32: movgt [[R]], #1
321 332
322 define internal i32 @fcmpOgtDouble(double %a, double %b) { 333 define internal i32 @fcmpOgtDouble(double %a, double %b) {
323 entry: 334 entry:
324 %cmp = fcmp ogt double %a, %b 335 %cmp = fcmp ogt double %a, %b
325 %cmp.ret_ext = zext i1 %cmp to i32 336 %cmp.ret_ext = zext i1 %cmp to i32
326 ret i32 %cmp.ret_ext 337 ret i32 %cmp.ret_ext
327 } 338 }
328 ; CHECK-LABEL: fcmpOgtDouble 339 ; CHECK-LABEL: fcmpOgtDouble
329 ; CHECK: ucomisd 340 ; CHECK: ucomisd
330 ; CHECK: seta 341 ; CHECK: seta
331 ; ARM32-LABEL: fcmpOgtDouble 342 ; ARM32-LABEL: fcmpOgtDouble
332 ; ARM32: vcmp.f64 343 ; ARM32: vcmp.f64
333 ; ARM32: mov [[R:r[0-9]+]], #0
334 ; ARM32: vmrs 344 ; ARM32: vmrs
345 ; ARM32: movle [[R:r[0-9]+]], #0
335 ; ARM32: movgt [[R]], #1 346 ; ARM32: movgt [[R]], #1
336 347
337 define internal i32 @fcmpOgeFloat(float %a, float %b) { 348 define internal i32 @fcmpOgeFloat(float %a, float %b) {
338 entry: 349 entry:
339 %cmp = fcmp oge float %a, %b 350 %cmp = fcmp oge float %a, %b
340 %cmp.ret_ext = zext i1 %cmp to i32 351 %cmp.ret_ext = zext i1 %cmp to i32
341 ret i32 %cmp.ret_ext 352 ret i32 %cmp.ret_ext
342 } 353 }
343 ; CHECK-LABEL: fcmpOgeFloat 354 ; CHECK-LABEL: fcmpOgeFloat
344 ; CHECK: ucomiss 355 ; CHECK: ucomiss
345 ; CHECK: setae 356 ; CHECK: setae
346 ; ARM32-LABEL: fcmpOgeFloat 357 ; ARM32-LABEL: fcmpOgeFloat
347 ; ARM32: vcmp.f32 358 ; ARM32: vcmp.f32
348 ; ARM32: mov [[R:r[0-9]+]], #0
349 ; ARM32: vmrs 359 ; ARM32: vmrs
360 ; ARM32: movlt [[R:r[0-9]+]], #0
350 ; ARM32: movge [[R]], #1 361 ; ARM32: movge [[R]], #1
351 362
352 define internal i32 @fcmpOgeDouble(double %a, double %b) { 363 define internal i32 @fcmpOgeDouble(double %a, double %b) {
353 entry: 364 entry:
354 %cmp = fcmp oge double %a, %b 365 %cmp = fcmp oge double %a, %b
355 %cmp.ret_ext = zext i1 %cmp to i32 366 %cmp.ret_ext = zext i1 %cmp to i32
356 ret i32 %cmp.ret_ext 367 ret i32 %cmp.ret_ext
357 } 368 }
358 ; CHECK-LABEL: fcmpOgeDouble 369 ; CHECK-LABEL: fcmpOgeDouble
359 ; CHECK: ucomisd 370 ; CHECK: ucomisd
360 ; CHECK: setae 371 ; CHECK: setae
361 ; ARM32-LABEL: fcmpOgeDouble 372 ; ARM32-LABEL: fcmpOgeDouble
362 ; ARM32: vcmp.f64 373 ; ARM32: vcmp.f64
363 ; ARM32: mov [[R:r[0-9]+]], #0
364 ; ARM32: vmrs 374 ; ARM32: vmrs
375 ; ARM32: movlt [[R:r[0-9]+]], #0
365 ; ARM32: movge [[R]], #1 376 ; ARM32: movge [[R]], #1
366 377
367 define internal i32 @fcmpOltFloat(float %a, float %b) { 378 define internal i32 @fcmpOltFloat(float %a, float %b) {
368 entry: 379 entry:
369 %cmp = fcmp olt float %a, %b 380 %cmp = fcmp olt float %a, %b
370 %cmp.ret_ext = zext i1 %cmp to i32 381 %cmp.ret_ext = zext i1 %cmp to i32
371 ret i32 %cmp.ret_ext 382 ret i32 %cmp.ret_ext
372 } 383 }
373 ; CHECK-LABEL: fcmpOltFloat 384 ; CHECK-LABEL: fcmpOltFloat
374 ; CHECK: ucomiss 385 ; CHECK: ucomiss
375 ; CHECK: seta 386 ; CHECK: seta
376 ; ARM32-LABEL: fcmpOltFloat 387 ; ARM32-LABEL: fcmpOltFloat
377 ; ARM32: vcmp.f32 388 ; ARM32: vcmp.f32
378 ; ARM32: mov [[R:r[0-9]+]], #0
379 ; ARM32: vmrs 389 ; ARM32: vmrs
390 ; ARM32: movpl [[R:r[0-9]+]], #0
380 ; ARM32: movmi [[R]], #1 391 ; ARM32: movmi [[R]], #1
381 392
382 define internal i32 @fcmpOltDouble(double %a, double %b) { 393 define internal i32 @fcmpOltDouble(double %a, double %b) {
383 entry: 394 entry:
384 %cmp = fcmp olt double %a, %b 395 %cmp = fcmp olt double %a, %b
385 %cmp.ret_ext = zext i1 %cmp to i32 396 %cmp.ret_ext = zext i1 %cmp to i32
386 ret i32 %cmp.ret_ext 397 ret i32 %cmp.ret_ext
387 } 398 }
388 ; CHECK-LABEL: fcmpOltDouble 399 ; CHECK-LABEL: fcmpOltDouble
389 ; CHECK: ucomisd 400 ; CHECK: ucomisd
390 ; CHECK: seta 401 ; CHECK: seta
391 ; ARM32-LABEL: fcmpOltDouble 402 ; ARM32-LABEL: fcmpOltDouble
392 ; ARM32: vcmp.f64 403 ; ARM32: vcmp.f64
393 ; ARM32: mov [[R:r[0-9]+]], #0
394 ; ARM32: vmrs 404 ; ARM32: vmrs
405 ; ARM32: movpl [[R:r[0-9]+]], #0
395 ; ARM32: movmi [[R]], #1 406 ; ARM32: movmi [[R]], #1
396 407
397 define internal i32 @fcmpOleFloat(float %a, float %b) { 408 define internal i32 @fcmpOleFloat(float %a, float %b) {
398 entry: 409 entry:
399 %cmp = fcmp ole float %a, %b 410 %cmp = fcmp ole float %a, %b
400 %cmp.ret_ext = zext i1 %cmp to i32 411 %cmp.ret_ext = zext i1 %cmp to i32
401 ret i32 %cmp.ret_ext 412 ret i32 %cmp.ret_ext
402 } 413 }
403 ; CHECK-LABEL: fcmpOleFloat 414 ; CHECK-LABEL: fcmpOleFloat
404 ; CHECK: ucomiss 415 ; CHECK: ucomiss
405 ; CHECK: setae 416 ; CHECK: setae
406 ; ARM32-LABEL: fcmpOleFloat 417 ; ARM32-LABEL: fcmpOleFloat
407 ; ARM32: vcmp.f32 418 ; ARM32: vcmp.f32
408 ; ARM32: mov [[R:r[0-9]+]], #0
409 ; ARM32: vmrs 419 ; ARM32: vmrs
420 ; ARM32: movhi [[R:r[0-9]+]], #0
410 ; ARM32: movls [[R]], #1 421 ; ARM32: movls [[R]], #1
411 422
412 define internal i32 @fcmpOleDouble(double %a, double %b) { 423 define internal i32 @fcmpOleDouble(double %a, double %b) {
413 entry: 424 entry:
414 %cmp = fcmp ole double %a, %b 425 %cmp = fcmp ole double %a, %b
415 %cmp.ret_ext = zext i1 %cmp to i32 426 %cmp.ret_ext = zext i1 %cmp to i32
416 ret i32 %cmp.ret_ext 427 ret i32 %cmp.ret_ext
417 } 428 }
418 ; CHECK-LABEL: fcmpOleDouble 429 ; CHECK-LABEL: fcmpOleDouble
419 ; CHECK: ucomisd 430 ; CHECK: ucomisd
420 ; CHECK: setae 431 ; CHECK: setae
421 ; ARM32-LABEL: fcmpOleDouble 432 ; ARM32-LABEL: fcmpOleDouble
422 ; ARM32: vcmp.f64 433 ; ARM32: vcmp.f64
423 ; ARM32: mov [[R:r[0-9]+]], #0
424 ; ARM32: vmrs 434 ; ARM32: vmrs
435 ; ARM32: movhi [[R:r[0-9]+]], #0
425 ; ARM32: movls [[R]], #1 436 ; ARM32: movls [[R]], #1
426 437
427 define internal i32 @fcmpOneFloat(float %a, float %b) { 438 define internal i32 @fcmpOneFloat(float %a, float %b) {
428 entry: 439 entry:
429 %cmp = fcmp one float %a, %b 440 %cmp = fcmp one float %a, %b
430 %cmp.ret_ext = zext i1 %cmp to i32 441 %cmp.ret_ext = zext i1 %cmp to i32
431 ret i32 %cmp.ret_ext 442 ret i32 %cmp.ret_ext
432 } 443 }
433 ; CHECK-LABEL: fcmpOneFloat 444 ; CHECK-LABEL: fcmpOneFloat
434 ; CHECK: ucomiss 445 ; CHECK: ucomiss
435 ; CHECK: setne 446 ; CHECK: setne
436 ; ARM32-LABEL: fcmpOneFloat 447 ; ARM32-LABEL: fcmpOneFloat
437 ; ARM32: vcmp.f32 448 ; ARM32: vcmp.f32
449 ; ARM32: vmrs
438 ; ARM32: mov [[R:r[0-9]+]], #0 450 ; ARM32: mov [[R:r[0-9]+]], #0
439 ; ARM32: vmrs
440 ; ARM32: movmi [[R]], #1 451 ; ARM32: movmi [[R]], #1
441 ; ARM32: movgt [[R]], #1 452 ; ARM32: movgt [[R]], #1
442 453
443 define internal i32 @fcmpOneDouble(double %a, double %b) { 454 define internal i32 @fcmpOneDouble(double %a, double %b) {
444 entry: 455 entry:
445 %cmp = fcmp one double %a, %b 456 %cmp = fcmp one double %a, %b
446 %cmp.ret_ext = zext i1 %cmp to i32 457 %cmp.ret_ext = zext i1 %cmp to i32
447 ret i32 %cmp.ret_ext 458 ret i32 %cmp.ret_ext
448 } 459 }
449 ; CHECK-LABEL: fcmpOneDouble 460 ; CHECK-LABEL: fcmpOneDouble
450 ; CHECK: ucomisd 461 ; CHECK: ucomisd
451 ; CHECK: setne 462 ; CHECK: setne
452 ; ARM32-LABEL: fcmpOneDouble 463 ; ARM32-LABEL: fcmpOneDouble
453 ; ARM32: vcmp.f64 464 ; ARM32: vcmp.f64
465 ; ARM32: vmrs
454 ; ARM32: mov [[R:r[0-9]+]], #0 466 ; ARM32: mov [[R:r[0-9]+]], #0
455 ; ARM32: vmrs
456 ; ARM32: movmi [[R]], #1 467 ; ARM32: movmi [[R]], #1
457 ; ARM32: movgt [[R]], #1 468 ; ARM32: movgt [[R]], #1
458 469
459 define internal i32 @fcmpOrdFloat(float %a, float %b) { 470 define internal i32 @fcmpOrdFloat(float %a, float %b) {
460 entry: 471 entry:
461 %cmp = fcmp ord float %a, %b 472 %cmp = fcmp ord float %a, %b
462 %cmp.ret_ext = zext i1 %cmp to i32 473 %cmp.ret_ext = zext i1 %cmp to i32
463 ret i32 %cmp.ret_ext 474 ret i32 %cmp.ret_ext
464 } 475 }
465 ; CHECK-LABEL: fcmpOrdFloat 476 ; CHECK-LABEL: fcmpOrdFloat
466 ; CHECK: ucomiss 477 ; CHECK: ucomiss
467 ; CHECK: setnp 478 ; CHECK: setnp
468 ; ARM32-LABEL: fcmpOrdFloat 479 ; ARM32-LABEL: fcmpOrdFloat
469 ; ARM32: vcmp.f32 480 ; ARM32: vcmp.f32
470 ; ARM32: mov [[R:r[0-9]+]], #0
471 ; ARM32: vmrs 481 ; ARM32: vmrs
482 ; ARM32: movvs [[R:r[0-9]+]], #0
472 ; ARM32: movvc [[R]], #1 483 ; ARM32: movvc [[R]], #1
473 484
474 define internal i32 @fcmpOrdDouble(double %a, double %b) { 485 define internal i32 @fcmpOrdDouble(double %a, double %b) {
475 entry: 486 entry:
476 %cmp = fcmp ord double %a, %b 487 %cmp = fcmp ord double %a, %b
477 %cmp.ret_ext = zext i1 %cmp to i32 488 %cmp.ret_ext = zext i1 %cmp to i32
478 ret i32 %cmp.ret_ext 489 ret i32 %cmp.ret_ext
479 } 490 }
480 ; CHECK-LABEL: fcmpOrdDouble 491 ; CHECK-LABEL: fcmpOrdDouble
481 ; CHECK: ucomisd 492 ; CHECK: ucomisd
482 ; CHECK: setnp 493 ; CHECK: setnp
483 ; ARM32-LABEL: fcmpOrdDouble 494 ; ARM32-LABEL: fcmpOrdDouble
484 ; ARM32: vcmp.f64 495 ; ARM32: vcmp.f64
485 ; ARM32: mov [[R:r[0-9]+]], #0
486 ; ARM32: vmrs 496 ; ARM32: vmrs
497 ; ARM32: movvs [[R:r[0-9]+]], #0
487 ; ARM32: movvc [[R]], #1 498 ; ARM32: movvc [[R]], #1
488 499
489 define internal i32 @fcmpUeqFloat(float %a, float %b) { 500 define internal i32 @fcmpUeqFloat(float %a, float %b) {
490 entry: 501 entry:
491 %cmp = fcmp ueq float %a, %b 502 %cmp = fcmp ueq float %a, %b
492 %cmp.ret_ext = zext i1 %cmp to i32 503 %cmp.ret_ext = zext i1 %cmp to i32
493 ret i32 %cmp.ret_ext 504 ret i32 %cmp.ret_ext
494 } 505 }
495 ; CHECK-LABEL: fcmpUeqFloat 506 ; CHECK-LABEL: fcmpUeqFloat
496 ; CHECK: ucomiss 507 ; CHECK: ucomiss
497 ; CHECK: sete 508 ; CHECK: sete
498 ; ARM32-LABEL: fcmpUeqFloat 509 ; ARM32-LABEL: fcmpUeqFloat
499 ; ARM32: vcmp.f32 510 ; ARM32: vcmp.f32
511 ; ARM32: vmrs
500 ; ARM32: mov [[R:r[0-9]+]], #0 512 ; ARM32: mov [[R:r[0-9]+]], #0
501 ; ARM32: vmrs
502 ; ARM32: moveq [[R]], #1 513 ; ARM32: moveq [[R]], #1
503 ; ARM32: movvs [[R]], #1 514 ; ARM32: movvs [[R]], #1
504 515
505 define internal i32 @fcmpUeqDouble(double %a, double %b) { 516 define internal i32 @fcmpUeqDouble(double %a, double %b) {
506 entry: 517 entry:
507 %cmp = fcmp ueq double %a, %b 518 %cmp = fcmp ueq double %a, %b
508 %cmp.ret_ext = zext i1 %cmp to i32 519 %cmp.ret_ext = zext i1 %cmp to i32
509 ret i32 %cmp.ret_ext 520 ret i32 %cmp.ret_ext
510 } 521 }
511 ; CHECK-LABEL: fcmpUeqDouble 522 ; CHECK-LABEL: fcmpUeqDouble
512 ; CHECK: ucomisd 523 ; CHECK: ucomisd
513 ; CHECK: sete 524 ; CHECK: sete
514 ; ARM32-LABEL: fcmpUeqDouble 525 ; ARM32-LABEL: fcmpUeqDouble
515 ; ARM32: vcmp.f64 526 ; ARM32: vcmp.f64
527 ; ARM32: vmrs
516 ; ARM32: mov [[R:r[0-9]+]], #0 528 ; ARM32: mov [[R:r[0-9]+]], #0
517 ; ARM32: vmrs
518 ; ARM32: moveq [[R]], #1 529 ; ARM32: moveq [[R]], #1
519 ; ARM32: movvs [[R]], #1 530 ; ARM32: movvs [[R]], #1
520 531
521 define internal i32 @fcmpUgtFloat(float %a, float %b) { 532 define internal i32 @fcmpUgtFloat(float %a, float %b) {
522 entry: 533 entry:
523 %cmp = fcmp ugt float %a, %b 534 %cmp = fcmp ugt float %a, %b
524 %cmp.ret_ext = zext i1 %cmp to i32 535 %cmp.ret_ext = zext i1 %cmp to i32
525 ret i32 %cmp.ret_ext 536 ret i32 %cmp.ret_ext
526 } 537 }
527 ; CHECK-LABEL: fcmpUgtFloat 538 ; CHECK-LABEL: fcmpUgtFloat
528 ; CHECK: ucomiss 539 ; CHECK: ucomiss
529 ; CHECK: setb 540 ; CHECK: setb
530 ; ARM32-LABEL: fcmpUgtFloat 541 ; ARM32-LABEL: fcmpUgtFloat
531 ; ARM32: vcmp.f32 542 ; ARM32: vcmp.f32
532 ; ARM32: mov [[R:r[0-9]+]], #0
533 ; ARM32: vmrs 543 ; ARM32: vmrs
544 ; ARM32: movls [[R:r[0-9]+]], #0
534 ; ARM32: movhi [[R]], #1 545 ; ARM32: movhi [[R]], #1
535 546
536 define internal i32 @fcmpUgtDouble(double %a, double %b) { 547 define internal i32 @fcmpUgtDouble(double %a, double %b) {
537 entry: 548 entry:
538 %cmp = fcmp ugt double %a, %b 549 %cmp = fcmp ugt double %a, %b
539 %cmp.ret_ext = zext i1 %cmp to i32 550 %cmp.ret_ext = zext i1 %cmp to i32
540 ret i32 %cmp.ret_ext 551 ret i32 %cmp.ret_ext
541 } 552 }
542 ; CHECK-LABEL: fcmpUgtDouble 553 ; CHECK-LABEL: fcmpUgtDouble
543 ; CHECK: ucomisd 554 ; CHECK: ucomisd
544 ; CHECK: setb 555 ; CHECK: setb
545 ; ARM32-LABEL: fcmpUgtDouble 556 ; ARM32-LABEL: fcmpUgtDouble
546 ; ARM32: vcmp.f64 557 ; ARM32: vcmp.f64
547 ; ARM32: mov [[R:r[0-9]+]], #0
548 ; ARM32: vmrs 558 ; ARM32: vmrs
559 ; ARM32: movls [[R:r[0-9]+]], #0
549 ; ARM32: movhi [[R]], #1 560 ; ARM32: movhi [[R]], #1
550 561
551 define internal i32 @fcmpUgeFloat(float %a, float %b) { 562 define internal i32 @fcmpUgeFloat(float %a, float %b) {
552 entry: 563 entry:
553 %cmp = fcmp uge float %a, %b 564 %cmp = fcmp uge float %a, %b
554 %cmp.ret_ext = zext i1 %cmp to i32 565 %cmp.ret_ext = zext i1 %cmp to i32
555 ret i32 %cmp.ret_ext 566 ret i32 %cmp.ret_ext
556 } 567 }
557 ; CHECK-LABEL: fcmpUgeFloat 568 ; CHECK-LABEL: fcmpUgeFloat
558 ; CHECK: ucomiss 569 ; CHECK: ucomiss
559 ; CHECK: setbe 570 ; CHECK: setbe
560 ; ARM32-LABEL: fcmpUgeFloat 571 ; ARM32-LABEL: fcmpUgeFloat
561 ; ARM32: vcmp.f32 572 ; ARM32: vcmp.f32
562 ; ARM32: mov [[R:r[0-9]+]], #0
563 ; ARM32: vmrs 573 ; ARM32: vmrs
574 ; ARM32: movmi [[R:r[0-9]+]], #0
564 ; ARM32: movpl [[R]], #1 575 ; ARM32: movpl [[R]], #1
565 576
566 define internal i32 @fcmpUgeDouble(double %a, double %b) { 577 define internal i32 @fcmpUgeDouble(double %a, double %b) {
567 entry: 578 entry:
568 %cmp = fcmp uge double %a, %b 579 %cmp = fcmp uge double %a, %b
569 %cmp.ret_ext = zext i1 %cmp to i32 580 %cmp.ret_ext = zext i1 %cmp to i32
570 ret i32 %cmp.ret_ext 581 ret i32 %cmp.ret_ext
571 } 582 }
572 ; CHECK-LABEL: fcmpUgeDouble 583 ; CHECK-LABEL: fcmpUgeDouble
573 ; CHECK: ucomisd 584 ; CHECK: ucomisd
574 ; CHECK: setbe 585 ; CHECK: setbe
575 ; ARM32-LABEL: fcmpUgeDouble 586 ; ARM32-LABEL: fcmpUgeDouble
576 ; ARM32: vcmp.f64 587 ; ARM32: vcmp.f64
577 ; ARM32: mov [[R:r[0-9]+]], #0
578 ; ARM32: vmrs 588 ; ARM32: vmrs
589 ; ARM32: movmi [[R:r[0-9]+]], #0
579 ; ARM32: movpl [[R]], #1 590 ; ARM32: movpl [[R]], #1
580 591
581 define internal i32 @fcmpUltFloat(float %a, float %b) { 592 define internal i32 @fcmpUltFloat(float %a, float %b) {
582 entry: 593 entry:
583 %cmp = fcmp ult float %a, %b 594 %cmp = fcmp ult float %a, %b
584 %cmp.ret_ext = zext i1 %cmp to i32 595 %cmp.ret_ext = zext i1 %cmp to i32
585 ret i32 %cmp.ret_ext 596 ret i32 %cmp.ret_ext
586 } 597 }
587 ; CHECK-LABEL: fcmpUltFloat 598 ; CHECK-LABEL: fcmpUltFloat
588 ; CHECK: ucomiss 599 ; CHECK: ucomiss
589 ; CHECK: setb 600 ; CHECK: setb
590 ; ARM32-LABEL: fcmpUltFloat 601 ; ARM32-LABEL: fcmpUltFloat
591 ; ARM32: vcmp.f32 602 ; ARM32: vcmp.f32
592 ; ARM32: mov [[R:r[0-9]+]], #0
593 ; ARM32: vmrs 603 ; ARM32: vmrs
604 ; ARM32: movge [[R:r[0-9]+]], #0
594 ; ARM32: movlt [[R]], #1 605 ; ARM32: movlt [[R]], #1
595 606
596 define internal i32 @fcmpUltDouble(double %a, double %b) { 607 define internal i32 @fcmpUltDouble(double %a, double %b) {
597 entry: 608 entry:
598 %cmp = fcmp ult double %a, %b 609 %cmp = fcmp ult double %a, %b
599 %cmp.ret_ext = zext i1 %cmp to i32 610 %cmp.ret_ext = zext i1 %cmp to i32
600 ret i32 %cmp.ret_ext 611 ret i32 %cmp.ret_ext
601 } 612 }
602 ; CHECK-LABEL: fcmpUltDouble 613 ; CHECK-LABEL: fcmpUltDouble
603 ; CHECK: ucomisd 614 ; CHECK: ucomisd
604 ; CHECK: setb 615 ; CHECK: setb
605 ; ARM32-LABEL: fcmpUltDouble 616 ; ARM32-LABEL: fcmpUltDouble
606 ; ARM32: vcmp.f64 617 ; ARM32: vcmp.f64
607 ; ARM32: mov [[R:r[0-9]+]], #0
608 ; ARM32: vmrs 618 ; ARM32: vmrs
619 ; ARM32: movge [[R:r[0-9]+]], #0
609 ; ARM32: movlt [[R]], #1 620 ; ARM32: movlt [[R]], #1
610 621
611 define internal i32 @fcmpUleFloat(float %a, float %b) { 622 define internal i32 @fcmpUleFloat(float %a, float %b) {
612 entry: 623 entry:
613 %cmp = fcmp ule float %a, %b 624 %cmp = fcmp ule float %a, %b
614 %cmp.ret_ext = zext i1 %cmp to i32 625 %cmp.ret_ext = zext i1 %cmp to i32
615 ret i32 %cmp.ret_ext 626 ret i32 %cmp.ret_ext
616 } 627 }
617 ; CHECK-LABEL: fcmpUleFloat 628 ; CHECK-LABEL: fcmpUleFloat
618 ; CHECK: ucomiss 629 ; CHECK: ucomiss
619 ; CHECK: setbe 630 ; CHECK: setbe
620 ; ARM32-LABEL: fcmpUleFloat 631 ; ARM32-LABEL: fcmpUleFloat
621 ; ARM32: vcmp.f32 632 ; ARM32: vcmp.f32
622 ; ARM32: mov [[R:r[0-9]+]], #0
623 ; ARM32: vmrs 633 ; ARM32: vmrs
634 ; ARM32: movgt [[R:r[0-9]+]], #0
624 ; ARM32: movle [[R]], #1 635 ; ARM32: movle [[R]], #1
625 636
626 define internal i32 @fcmpUleDouble(double %a, double %b) { 637 define internal i32 @fcmpUleDouble(double %a, double %b) {
627 entry: 638 entry:
628 %cmp = fcmp ule double %a, %b 639 %cmp = fcmp ule double %a, %b
629 %cmp.ret_ext = zext i1 %cmp to i32 640 %cmp.ret_ext = zext i1 %cmp to i32
630 ret i32 %cmp.ret_ext 641 ret i32 %cmp.ret_ext
631 } 642 }
632 ; CHECK-LABEL: fcmpUleDouble 643 ; CHECK-LABEL: fcmpUleDouble
633 ; CHECK: ucomisd 644 ; CHECK: ucomisd
634 ; CHECK: setbe 645 ; CHECK: setbe
635 ; ARM32-LABEL: fcmpUleDouble 646 ; ARM32-LABEL: fcmpUleDouble
636 ; ARM32: vcmp.f64 647 ; ARM32: vcmp.f64
637 ; ARM32: mov [[R:r[0-9]+]], #0
638 ; ARM32: vmrs 648 ; ARM32: vmrs
649 ; ARM32: movgt [[R:r[0-9]+]], #0
639 ; ARM32: movle [[R]], #1 650 ; ARM32: movle [[R]], #1
640 651
641 define internal i32 @fcmpUneFloat(float %a, float %b) { 652 define internal i32 @fcmpUneFloat(float %a, float %b) {
642 entry: 653 entry:
643 %cmp = fcmp une float %a, %b 654 %cmp = fcmp une float %a, %b
644 %cmp.ret_ext = zext i1 %cmp to i32 655 %cmp.ret_ext = zext i1 %cmp to i32
645 ret i32 %cmp.ret_ext 656 ret i32 %cmp.ret_ext
646 } 657 }
647 ; CHECK-LABEL: fcmpUneFloat 658 ; CHECK-LABEL: fcmpUneFloat
648 ; CHECK: ucomiss 659 ; CHECK: ucomiss
649 ; CHECK: jne 660 ; CHECK: jne
650 ; CHECK: jp 661 ; CHECK: jp
651 ; ARM32-LABEL: fcmpUneFloat 662 ; ARM32-LABEL: fcmpUneFloat
652 ; ARM32: vcmp.f32 663 ; ARM32: vcmp.f32
653 ; ARM32: mov [[R:r[0-9]+]], #0
654 ; ARM32: vmrs 664 ; ARM32: vmrs
665 ; ARM32: moveq [[R:r[0-9]+]], #0
655 ; ARM32: movne [[R]], #1 666 ; ARM32: movne [[R]], #1
656 667
657 define internal i32 @fcmpUneDouble(double %a, double %b) { 668 define internal i32 @fcmpUneDouble(double %a, double %b) {
658 entry: 669 entry:
659 %cmp = fcmp une double %a, %b 670 %cmp = fcmp une double %a, %b
660 %cmp.ret_ext = zext i1 %cmp to i32 671 %cmp.ret_ext = zext i1 %cmp to i32
661 ret i32 %cmp.ret_ext 672 ret i32 %cmp.ret_ext
662 } 673 }
663 ; CHECK-LABEL: fcmpUneDouble 674 ; CHECK-LABEL: fcmpUneDouble
664 ; CHECK: ucomisd 675 ; CHECK: ucomisd
665 ; CHECK: jne 676 ; CHECK: jne
666 ; CHECK: jp 677 ; CHECK: jp
667 ; ARM32-LABEL: fcmpUneDouble 678 ; ARM32-LABEL: fcmpUneDouble
668 ; ARM32: vcmp.f64 679 ; ARM32: vcmp.f64
669 ; ARM32: mov [[R:r[0-9]+]], #0
670 ; ARM32: vmrs 680 ; ARM32: vmrs
681 ; ARM32: moveq [[R:r[0-9]+]], #0
671 ; ARM32: movne [[R]], #1 682 ; ARM32: movne [[R]], #1
672 683
673 define internal i32 @fcmpUnoFloat(float %a, float %b) { 684 define internal i32 @fcmpUnoFloat(float %a, float %b) {
674 entry: 685 entry:
675 %cmp = fcmp uno float %a, %b 686 %cmp = fcmp uno float %a, %b
676 %cmp.ret_ext = zext i1 %cmp to i32 687 %cmp.ret_ext = zext i1 %cmp to i32
677 ret i32 %cmp.ret_ext 688 ret i32 %cmp.ret_ext
678 } 689 }
679 ; CHECK-LABEL: fcmpUnoFloat 690 ; CHECK-LABEL: fcmpUnoFloat
680 ; CHECK: ucomiss 691 ; CHECK: ucomiss
681 ; CHECK: setp 692 ; CHECK: setp
682 ; ARM32-LABEL: fcmpUnoFloat 693 ; ARM32-LABEL: fcmpUnoFloat
683 ; ARM32: vcmp.f32 694 ; ARM32: vcmp.f32
684 ; ARM32: mov [[R:r[0-9]+]], #0
685 ; ARM32: vmrs 695 ; ARM32: vmrs
696 ; ARM32: movvc [[R:r[0-9]+]], #0
686 ; ARM32: movvs [[R]], #1 697 ; ARM32: movvs [[R]], #1
687 698
688 define internal i32 @fcmpUnoDouble(double %a, double %b) { 699 define internal i32 @fcmpUnoDouble(double %a, double %b) {
689 entry: 700 entry:
690 %cmp = fcmp uno double %a, %b 701 %cmp = fcmp uno double %a, %b
691 %cmp.ret_ext = zext i1 %cmp to i32 702 %cmp.ret_ext = zext i1 %cmp to i32
692 ret i32 %cmp.ret_ext 703 ret i32 %cmp.ret_ext
693 } 704 }
694 ; CHECK-LABEL: fcmpUnoDouble 705 ; CHECK-LABEL: fcmpUnoDouble
695 ; CHECK: ucomisd 706 ; CHECK: ucomisd
696 ; CHECK: setp 707 ; CHECK: setp
697 ; ARM32-LABEL: fcmpUnoDouble 708 ; ARM32-LABEL: fcmpUnoDouble
698 ; ARM32: vcmp.f64 709 ; ARM32: vcmp.f64
699 ; ARM32: mov [[R:r[0-9]+]], #0
700 ; ARM32: vmrs 710 ; ARM32: vmrs
711 ; ARM32: movvc [[R:r[0-9]+]], #0
701 ; ARM32: movvs [[R]], #1 712 ; ARM32: movvs [[R]], #1
702 713
703 define internal i32 @fcmpTrueFloat(float %a, float %b) { 714 define internal i32 @fcmpTrueFloat(float %a, float %b) {
704 entry: 715 entry:
705 %cmp = fcmp true float %a, %b 716 %cmp = fcmp true float %a, %b
706 %cmp.ret_ext = zext i1 %cmp to i32 717 %cmp.ret_ext = zext i1 %cmp to i32
707 ret i32 %cmp.ret_ext 718 ret i32 %cmp.ret_ext
708 } 719 }
709 ; CHECK-LABEL: fcmpTrueFloat 720 ; CHECK-LABEL: fcmpTrueFloat
710 ; CHECK: mov {{.*}},0x1 721 ; CHECK: mov {{.*}},0x1
711 ; ARM32-LABEL: fcmpTrueFloat 722 ; ARM32-LABEL: fcmpTrueFloat
712 ; ARM32: vcmp.f32 723 ; ARM32: mov {{r[0-9]+}}, #1
713 ; ARM32: mov [[R]], #1
714 724
715 define internal i32 @fcmpTrueDouble(double %a, double %b) { 725 define internal i32 @fcmpTrueDouble(double %a, double %b) {
716 entry: 726 entry:
717 %cmp = fcmp true double %a, %b 727 %cmp = fcmp true double %a, %b
718 %cmp.ret_ext = zext i1 %cmp to i32 728 %cmp.ret_ext = zext i1 %cmp to i32
719 ret i32 %cmp.ret_ext 729 ret i32 %cmp.ret_ext
720 } 730 }
721 ; CHECK-LABEL: fcmpTrueDouble 731 ; CHECK-LABEL: fcmpTrueDouble
722 ; CHECK: mov {{.*}},0x1 732 ; CHECK: mov {{.*}},0x1
723 ; ARM32-LABEL: fcmpTrueDouble 733 ; ARM32-LABEL: fcmpTrueDouble
724 ; ARM32: vcmp.f64 734 ; ARM32: mov {{r[0-9]+}}, #1
725 ; ARM32: mov [[R]], #1
726 735
727 define internal float @selectFloatVarVar(float %a, float %b) { 736 define internal float @selectFloatVarVar(float %a, float %b) {
728 entry: 737 entry:
729 %cmp = fcmp olt float %a, %b 738 %cmp = fcmp olt float %a, %b
730 %cond = select i1 %cmp, float %a, float %b 739 %cond = select i1 %cmp, float %a, float %b
731 ret float %cond 740 ret float %cond
732 } 741 }
733 ; CHECK-LABEL: selectFloatVarVar 742 ; CHECK-LABEL: selectFloatVarVar
734 ; CHECK: ucomiss 743 ; CHECK: ucomiss
735 ; CHECK: seta 744 ; CHECK: seta
736 ; CHECK: fld 745 ; CHECK: fld
737 ; ARM32-LABEL: selectFloatVarVar 746 ; ARM32-LABEL: selectFloatVarVar
738 ; ARM32: vcmp.f32 747 ; ARM32: vcmp.f32
739 ; ARM32: vmovne.f32 s{{[0-9]+}} 748 ; ARM32-OM1: vmovne.f32 s{{[0-9]+}}
749 ; ARM32-O2: vmovmi.f32 s{{[0-9]+}}
740 ; ARM32: bx 750 ; ARM32: bx
741 751
742 define internal double @selectDoubleVarVar(double %a, double %b) { 752 define internal double @selectDoubleVarVar(double %a, double %b) {
743 entry: 753 entry:
744 %cmp = fcmp olt double %a, %b 754 %cmp = fcmp olt double %a, %b
745 %cond = select i1 %cmp, double %a, double %b 755 %cond = select i1 %cmp, double %a, double %b
746 ret double %cond 756 ret double %cond
747 } 757 }
748 ; CHECK-LABEL: selectDoubleVarVar 758 ; CHECK-LABEL: selectDoubleVarVar
749 ; CHECK: ucomisd 759 ; CHECK: ucomisd
750 ; CHECK: seta 760 ; CHECK: seta
751 ; CHECK: fld 761 ; CHECK: fld
752 ; ARM32-LABEL: selectDoubleVarVar 762 ; ARM32-LABEL: selectDoubleVarVar
753 ; ARM32: vcmp.f64 763 ; ARM32: vcmp.f64
754 ; ARM32: vmovne.f64 d{{[0-9]+}} 764 ; ARM32-OM1: vmovne.f64 d{{[0-9]+}}
765 ; ARM32-O2: vmovmi.f64 d{{[0-9]+}}
755 ; ARM32: bx 766 ; ARM32: bx
OLDNEW
« no previous file with comments | « tests_lit/llvm2ice_tests/branch-opt.ll ('k') | tests_lit/llvm2ice_tests/select-opt.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698