OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |