OLD | NEW |
1 ; This tries to be a comprehensive test of f32 and f64 operations. | 1 ; This tries to be a comprehensive test of f32 and f64 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 ; TODO(jvoung): fix extra "CALLTARGETS" run. The llvm-objdump symbolizer | 6 ; TODO(jvoung): fix extra "CALLTARGETS" run. The llvm-objdump symbolizer |
7 ; doesn't know how to symbolize non-section-local functions. | 7 ; doesn't know how to symbolize non-section-local functions. |
8 ; The newer LLVM 3.6 one does work, but watch out for other bugs. | 8 ; The newer LLVM 3.6 one does work, but watch out for other bugs. |
9 | 9 |
10 ; RUN: %p2i -i %s --args -O2 --verbose none \ | 10 ; RUN: %p2i -i %s --args -O2 --verbose none \ |
(...skipping 29 matching lines...) Expand all Loading... |
40 define internal i32 @passFpArgs(float %a, double %b, float %c, double %d, float
%e, double %f) { | 40 define internal i32 @passFpArgs(float %a, double %b, float %c, double %d, float
%e, double %f) { |
41 entry: | 41 entry: |
42 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double %b) | 42 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double %b) |
43 %call1 = call i32 @ignoreFpArgsNoInline(float %c, i32 123, double %d) | 43 %call1 = call i32 @ignoreFpArgsNoInline(float %c, i32 123, double %d) |
44 %call2 = call i32 @ignoreFpArgsNoInline(float %e, i32 123, double %f) | 44 %call2 = call i32 @ignoreFpArgsNoInline(float %e, i32 123, double %f) |
45 %add = add i32 %call1, %call | 45 %add = add i32 %call1, %call |
46 %add3 = add i32 %add, %call2 | 46 %add3 = add i32 %add, %call2 |
47 ret i32 %add3 | 47 ret i32 %add3 |
48 } | 48 } |
49 ; CHECK-LABEL: passFpArgs | 49 ; CHECK-LABEL: passFpArgs |
| 50 ; CALLTARGETS-LABEL: passFpArgs |
50 ; CHECK: mov dword ptr [esp + 4], 123 | 51 ; CHECK: mov dword ptr [esp + 4], 123 |
51 ; CHECK: call ignoreFpArgsNoInline | 52 ; CHECK: call -4 |
| 53 ; CALLTARGETS: .long ignoreFpArgsNoInline |
52 ; CHECK: mov dword ptr [esp + 4], 123 | 54 ; CHECK: mov dword ptr [esp + 4], 123 |
53 ; CHECK: call ignoreFpArgsNoInline | 55 ; CHECK: call -4 |
| 56 ; CALLTARGETS: .long ignoreFpArgsNoInline |
54 ; CHECK: mov dword ptr [esp + 4], 123 | 57 ; CHECK: mov dword ptr [esp + 4], 123 |
55 ; CHECK: call ignoreFpArgsNoInline | 58 ; CHECK: call -4 |
| 59 ; CALLTARGETS: .long ignoreFpArgsNoInline |
56 | 60 |
57 define i32 @ignoreFpArgsNoInline(float %x, i32 %y, double %z) { | 61 declare i32 @ignoreFpArgsNoInline(float %x, i32 %y, double %z) |
58 entry: | |
59 ret i32 %y | |
60 } | |
61 | 62 |
62 define internal i32 @passFpConstArg(float %a, double %b) { | 63 define internal i32 @passFpConstArg(float %a, double %b) { |
63 entry: | 64 entry: |
64 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double 2.340000e+00) | 65 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double 2.340000e+00) |
65 ret i32 %call | 66 ret i32 %call |
66 } | 67 } |
67 ; CHECK-LABEL: passFpConstArg | 68 ; CHECK-LABEL: passFpConstArg |
| 69 ; CALLTARGETS-LABEL: passFpConstArg |
68 ; CHECK: mov dword ptr [esp + 4], 123 | 70 ; CHECK: mov dword ptr [esp + 4], 123 |
69 ; CHECK: call ignoreFpArgsNoInline | 71 ; CHECK: call -4 |
| 72 ; CALLTARGETS: .long ignoreFpArgsNoInline |
70 | 73 |
71 define internal i32 @passFp32ConstArg(float %a) { | 74 define internal i32 @passFp32ConstArg(float %a) { |
72 entry: | 75 entry: |
73 %call = call i32 @ignoreFp32ArgsNoInline(float %a, i32 123, float 2.0) | 76 %call = call i32 @ignoreFp32ArgsNoInline(float %a, i32 123, float 2.0) |
74 ret i32 %call | 77 ret i32 %call |
75 } | 78 } |
76 ; CHECK-LABEL: passFp32ConstArg | 79 ; CHECK-LABEL: passFp32ConstArg |
77 ; CHECK: mov dword ptr [esp + 4], 123 | 80 ; CHECK: mov dword ptr [esp + 4], 123 |
78 ; CHECK: movss dword ptr [esp + 8] | 81 ; CHECK: movss dword ptr [esp + 8] |
79 ; CHECK: call ignoreFp32ArgsNoInline | 82 ; CHECK: call ignoreFp32ArgsNoInline |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 ; CHECK: fld | 187 ; CHECK: fld |
185 | 188 |
186 define internal float @remFloat(float %a, float %b) { | 189 define internal float @remFloat(float %a, float %b) { |
187 entry: | 190 entry: |
188 %div = frem float %a, %b | 191 %div = frem float %a, %b |
189 ret float %div | 192 ret float %div |
190 } | 193 } |
191 ; CHECK-LABEL: remFloat | 194 ; CHECK-LABEL: remFloat |
192 ; CALLTARGETS-LABEL: remFloat | 195 ; CALLTARGETS-LABEL: remFloat |
193 ; CHECK: call -4 | 196 ; CHECK: call -4 |
194 ; CALLTARGETS: call fmodf | 197 ; CALLTARGETS: .long fmodf |
195 | 198 |
196 define internal double @remDouble(double %a, double %b) { | 199 define internal double @remDouble(double %a, double %b) { |
197 entry: | 200 entry: |
198 %div = frem double %a, %b | 201 %div = frem double %a, %b |
199 ret double %div | 202 ret double %div |
200 } | 203 } |
201 ; CHECK-LABEL: remDouble | 204 ; CHECK-LABEL: remDouble |
202 ; CALLTARGETS-LABEL: remDouble | 205 ; CALLTARGETS-LABEL: remDouble |
203 ; CHECK: call -4 | 206 ; CHECK: call -4 |
204 ; CALLTARGETS: call fmod | 207 ; CALLTARGETS: .long fmod |
205 | 208 |
206 define internal float @fptrunc(double %a) { | 209 define internal float @fptrunc(double %a) { |
207 entry: | 210 entry: |
208 %conv = fptrunc double %a to float | 211 %conv = fptrunc double %a to float |
209 ret float %conv | 212 ret float %conv |
210 } | 213 } |
211 ; CHECK-LABEL: fptrunc | 214 ; CHECK-LABEL: fptrunc |
212 ; CHECK: cvtsd2ss | 215 ; CHECK: cvtsd2ss |
213 ; CHECK: fld | 216 ; CHECK: fld |
214 | 217 |
215 define internal double @fpext(float %a) { | 218 define internal double @fpext(float %a) { |
216 entry: | 219 entry: |
217 %conv = fpext float %a to double | 220 %conv = fpext float %a to double |
218 ret double %conv | 221 ret double %conv |
219 } | 222 } |
220 ; CHECK-LABEL: fpext | 223 ; CHECK-LABEL: fpext |
221 ; CHECK: cvtss2sd | 224 ; CHECK: cvtss2sd |
222 ; CHECK: fld | 225 ; CHECK: fld |
223 | 226 |
224 define internal i64 @doubleToSigned64(double %a) { | 227 define internal i64 @doubleToSigned64(double %a) { |
225 entry: | 228 entry: |
226 %conv = fptosi double %a to i64 | 229 %conv = fptosi double %a to i64 |
227 ret i64 %conv | 230 ret i64 %conv |
228 } | 231 } |
229 ; CHECK-LABEL: doubleToSigned64 | 232 ; CHECK-LABEL: doubleToSigned64 |
230 ; CALLTARGETS-LABEL: doubleToSigned64 | 233 ; CALLTARGETS-LABEL: doubleToSigned64 |
231 ; CHECK: call -4 | 234 ; CHECK: call -4 |
232 ; CALLTARGETS: call cvtdtosi64 | 235 ; CALLTARGETS: .long cvtdtosi64 |
233 | 236 |
234 define internal i64 @floatToSigned64(float %a) { | 237 define internal i64 @floatToSigned64(float %a) { |
235 entry: | 238 entry: |
236 %conv = fptosi float %a to i64 | 239 %conv = fptosi float %a to i64 |
237 ret i64 %conv | 240 ret i64 %conv |
238 } | 241 } |
239 ; CHECK-LABEL: floatToSigned64 | 242 ; CHECK-LABEL: floatToSigned64 |
240 ; CALLTARGETS-LABEL: floatToSigned64 | 243 ; CALLTARGETS-LABEL: floatToSigned64 |
241 ; CHECK: call -4 | 244 ; CHECK: call -4 |
242 ; CALLTARGETS: call cvtftosi64 | 245 ; CALLTARGETS: .long cvtftosi64 |
243 | 246 |
244 define internal i64 @doubleToUnsigned64(double %a) { | 247 define internal i64 @doubleToUnsigned64(double %a) { |
245 entry: | 248 entry: |
246 %conv = fptoui double %a to i64 | 249 %conv = fptoui double %a to i64 |
247 ret i64 %conv | 250 ret i64 %conv |
248 } | 251 } |
249 ; CHECK-LABEL: doubleToUnsigned64 | 252 ; CHECK-LABEL: doubleToUnsigned64 |
250 ; CALLTARGETS-LABEL: doubleToUnsigned64 | 253 ; CALLTARGETS-LABEL: doubleToUnsigned64 |
251 ; CHECK: call -4 | 254 ; CHECK: call -4 |
252 ; CALLTARGETS: call cvtdtoui64 | 255 ; CALLTARGETS: .long cvtdtoui64 |
253 | 256 |
254 define internal i64 @floatToUnsigned64(float %a) { | 257 define internal i64 @floatToUnsigned64(float %a) { |
255 entry: | 258 entry: |
256 %conv = fptoui float %a to i64 | 259 %conv = fptoui float %a to i64 |
257 ret i64 %conv | 260 ret i64 %conv |
258 } | 261 } |
259 ; CHECK-LABEL: floatToUnsigned64 | 262 ; CHECK-LABEL: floatToUnsigned64 |
260 ; CALLTARGETS-LABEL: floatToUnsigned64 | 263 ; CALLTARGETS-LABEL: floatToUnsigned64 |
261 ; CHECK: call -4 | 264 ; CHECK: call -4 |
262 ; CALLTARGETS: call cvtftoui64 | 265 ; CALLTARGETS: .long cvtftoui64 |
263 | 266 |
264 define internal i32 @doubleToSigned32(double %a) { | 267 define internal i32 @doubleToSigned32(double %a) { |
265 entry: | 268 entry: |
266 %conv = fptosi double %a to i32 | 269 %conv = fptosi double %a to i32 |
267 ret i32 %conv | 270 ret i32 %conv |
268 } | 271 } |
269 ; CHECK-LABEL: doubleToSigned32 | 272 ; CHECK-LABEL: doubleToSigned32 |
270 ; CHECK: cvttsd2si | 273 ; CHECK: cvttsd2si |
271 | 274 |
272 define internal i32 @doubleToSigned32Const() { | 275 define internal i32 @doubleToSigned32Const() { |
(...skipping 13 matching lines...) Expand all Loading... |
286 ; CHECK: cvttss2si | 289 ; CHECK: cvttss2si |
287 | 290 |
288 define internal i32 @doubleToUnsigned32(double %a) { | 291 define internal i32 @doubleToUnsigned32(double %a) { |
289 entry: | 292 entry: |
290 %conv = fptoui double %a to i32 | 293 %conv = fptoui double %a to i32 |
291 ret i32 %conv | 294 ret i32 %conv |
292 } | 295 } |
293 ; CHECK-LABEL: doubleToUnsigned32 | 296 ; CHECK-LABEL: doubleToUnsigned32 |
294 ; CALLTARGETS-LABEL: doubleToUnsigned32 | 297 ; CALLTARGETS-LABEL: doubleToUnsigned32 |
295 ; CHECK: call -4 | 298 ; CHECK: call -4 |
296 ; CALLTARGETS: call cvtdtoui32 | 299 ; CALLTARGETS: .long cvtdtoui32 |
297 | 300 |
298 define internal i32 @floatToUnsigned32(float %a) { | 301 define internal i32 @floatToUnsigned32(float %a) { |
299 entry: | 302 entry: |
300 %conv = fptoui float %a to i32 | 303 %conv = fptoui float %a to i32 |
301 ret i32 %conv | 304 ret i32 %conv |
302 } | 305 } |
303 ; CHECK-LABEL: floatToUnsigned32 | 306 ; CHECK-LABEL: floatToUnsigned32 |
304 ; CALLTARGETS-LABEL: floatToUnsigned32 | 307 ; CALLTARGETS-LABEL: floatToUnsigned32 |
305 ; CHECK: call -4 | 308 ; CHECK: call -4 |
306 ; CALLTARGETS: call cvtftoui32 | 309 ; CALLTARGETS: .long cvtftoui32 |
307 | 310 |
308 | 311 |
309 define internal i32 @doubleToSigned16(double %a) { | 312 define internal i32 @doubleToSigned16(double %a) { |
310 entry: | 313 entry: |
311 %conv = fptosi double %a to i16 | 314 %conv = fptosi double %a to i16 |
312 %conv.ret_ext = sext i16 %conv to i32 | 315 %conv.ret_ext = sext i16 %conv to i32 |
313 ret i32 %conv.ret_ext | 316 ret i32 %conv.ret_ext |
314 } | 317 } |
315 ; CHECK-LABEL: doubleToSigned16 | 318 ; CHECK-LABEL: doubleToSigned16 |
316 ; CHECK: cvttsd2si | 319 ; CHECK: cvttsd2si |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 ; CHECK: and eax, 1 | 410 ; CHECK: and eax, 1 |
408 | 411 |
409 define internal double @signed64ToDouble(i64 %a) { | 412 define internal double @signed64ToDouble(i64 %a) { |
410 entry: | 413 entry: |
411 %conv = sitofp i64 %a to double | 414 %conv = sitofp i64 %a to double |
412 ret double %conv | 415 ret double %conv |
413 } | 416 } |
414 ; CHECK-LABEL: signed64ToDouble | 417 ; CHECK-LABEL: signed64ToDouble |
415 ; CALLTARGETS-LABEL: signed64ToDouble | 418 ; CALLTARGETS-LABEL: signed64ToDouble |
416 ; CHECK: call -4 | 419 ; CHECK: call -4 |
417 ; CALLTARGETS: call cvtsi64tod | 420 ; CALLTARGETS: .long cvtsi64tod |
418 ; CHECK: fstp qword | 421 ; CHECK: fstp qword |
419 | 422 |
420 define internal float @signed64ToFloat(i64 %a) { | 423 define internal float @signed64ToFloat(i64 %a) { |
421 entry: | 424 entry: |
422 %conv = sitofp i64 %a to float | 425 %conv = sitofp i64 %a to float |
423 ret float %conv | 426 ret float %conv |
424 } | 427 } |
425 ; CHECK-LABEL: signed64ToFloat | 428 ; CHECK-LABEL: signed64ToFloat |
426 ; CALLTARGETS-LABEL: signed64ToFloat | 429 ; CALLTARGETS-LABEL: signed64ToFloat |
427 ; CHECK: call -4 | 430 ; CHECK: call -4 |
428 ; CALLTARGETS: call cvtsi64tof | 431 ; CALLTARGETS: .long cvtsi64tof |
429 ; CHECK: fstp dword | 432 ; CHECK: fstp dword |
430 | 433 |
431 define internal double @unsigned64ToDouble(i64 %a) { | 434 define internal double @unsigned64ToDouble(i64 %a) { |
432 entry: | 435 entry: |
433 %conv = uitofp i64 %a to double | 436 %conv = uitofp i64 %a to double |
434 ret double %conv | 437 ret double %conv |
435 } | 438 } |
436 ; CHECK-LABEL: unsigned64ToDouble | 439 ; CHECK-LABEL: unsigned64ToDouble |
437 ; CALLTARGETS-LABEL: unsigned64ToDouble | 440 ; CALLTARGETS-LABEL: unsigned64ToDouble |
438 ; CHECK: call -4 | 441 ; CHECK: call -4 |
439 ; CALLTARGETS: call cvtui64tod | 442 ; CALLTARGETS: .long cvtui64tod |
440 ; CHECK: fstp | 443 ; CHECK: fstp |
441 | 444 |
442 define internal float @unsigned64ToFloat(i64 %a) { | 445 define internal float @unsigned64ToFloat(i64 %a) { |
443 entry: | 446 entry: |
444 %conv = uitofp i64 %a to float | 447 %conv = uitofp i64 %a to float |
445 ret float %conv | 448 ret float %conv |
446 } | 449 } |
447 ; CHECK-LABEL: unsigned64ToFloat | 450 ; CHECK-LABEL: unsigned64ToFloat |
448 ; CALLTARGETS-LABEL: unsigned64ToFloat | 451 ; CALLTARGETS-LABEL: unsigned64ToFloat |
449 ; CHECK: call -4 | 452 ; CHECK: call -4 |
450 ; CALLTARGETS: call cvtui64tof | 453 ; CALLTARGETS: .long cvtui64tof |
451 ; CHECK: fstp | 454 ; CHECK: fstp |
452 | 455 |
453 define internal double @unsigned64ToDoubleConst() { | 456 define internal double @unsigned64ToDoubleConst() { |
454 entry: | 457 entry: |
455 %conv = uitofp i64 12345678901234 to double | 458 %conv = uitofp i64 12345678901234 to double |
456 ret double %conv | 459 ret double %conv |
457 } | 460 } |
458 ; CHECK-LABEL: unsigned64ToDouble | 461 ; CHECK-LABEL: unsigned64ToDouble |
459 ; CALLTARGETS-LABEL: unsigned64ToDouble | 462 ; CALLTARGETS-LABEL: unsigned64ToDouble |
460 ; CHECK: mov dword ptr [esp + 4], 2874 | 463 ; CHECK: mov dword ptr [esp + 4], 2874 |
461 ; CHECK: mov dword ptr [esp], 1942892530 | 464 ; CHECK: mov dword ptr [esp], 1942892530 |
462 ; CHECK: call -4 | 465 ; CHECK: call -4 |
463 ; CALLTARGETS: call cvtui64tod | 466 ; CALLTARGETS: .long cvtui64tod |
464 ; CHECK: fstp | 467 ; CHECK: fstp |
465 | 468 |
466 define internal double @signed32ToDouble(i32 %a) { | 469 define internal double @signed32ToDouble(i32 %a) { |
467 entry: | 470 entry: |
468 %conv = sitofp i32 %a to double | 471 %conv = sitofp i32 %a to double |
469 ret double %conv | 472 ret double %conv |
470 } | 473 } |
471 ; CHECK-LABEL: signed32ToDouble | 474 ; CHECK-LABEL: signed32ToDouble |
472 ; CHECK: cvtsi2sd | 475 ; CHECK: cvtsi2sd |
473 ; CHECK: fld | 476 ; CHECK: fld |
(...skipping 17 matching lines...) Expand all Loading... |
491 ; CHECK: fld | 494 ; CHECK: fld |
492 | 495 |
493 define internal double @unsigned32ToDouble(i32 %a) { | 496 define internal double @unsigned32ToDouble(i32 %a) { |
494 entry: | 497 entry: |
495 %conv = uitofp i32 %a to double | 498 %conv = uitofp i32 %a to double |
496 ret double %conv | 499 ret double %conv |
497 } | 500 } |
498 ; CHECK-LABEL: unsigned32ToDouble | 501 ; CHECK-LABEL: unsigned32ToDouble |
499 ; CALLTARGETS-LABEL: unsigned32ToDouble | 502 ; CALLTARGETS-LABEL: unsigned32ToDouble |
500 ; CHECK: call -4 | 503 ; CHECK: call -4 |
501 ; CALLTARGETS: call cvtui32tod | 504 ; CALLTARGETS: .long cvtui32tod |
502 ; CHECK: fstp qword | 505 ; CHECK: fstp qword |
503 | 506 |
504 define internal float @unsigned32ToFloat(i32 %a) { | 507 define internal float @unsigned32ToFloat(i32 %a) { |
505 entry: | 508 entry: |
506 %conv = uitofp i32 %a to float | 509 %conv = uitofp i32 %a to float |
507 ret float %conv | 510 ret float %conv |
508 } | 511 } |
509 ; CHECK-LABEL: unsigned32ToFloat | 512 ; CHECK-LABEL: unsigned32ToFloat |
510 ; CALLTARGETS-LABEL: unsigned32ToFloat | 513 ; CALLTARGETS-LABEL: unsigned32ToFloat |
511 ; CHECK: call -4 | 514 ; CHECK: call -4 |
512 ; CALLTARGETS: call cvtui32tof | 515 ; CALLTARGETS: .long cvtui32tof |
513 ; CHECK: fstp dword | 516 ; CHECK: fstp dword |
514 | 517 |
515 define internal double @signed16ToDouble(i32 %a) { | 518 define internal double @signed16ToDouble(i32 %a) { |
516 entry: | 519 entry: |
517 %a.arg_trunc = trunc i32 %a to i16 | 520 %a.arg_trunc = trunc i32 %a to i16 |
518 %conv = sitofp i16 %a.arg_trunc to double | 521 %conv = sitofp i16 %a.arg_trunc to double |
519 ret double %conv | 522 ret double %conv |
520 } | 523 } |
521 ; CHECK-LABEL: signed16ToDouble | 524 ; CHECK-LABEL: signed16ToDouble |
522 ; CHECK: cvtsi2sd | 525 ; CHECK: cvtsi2sd |
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1224 define internal double @selectDoubleVarVar(double %a, double %b) { | 1227 define internal double @selectDoubleVarVar(double %a, double %b) { |
1225 entry: | 1228 entry: |
1226 %cmp = fcmp olt double %a, %b | 1229 %cmp = fcmp olt double %a, %b |
1227 %cond = select i1 %cmp, double %a, double %b | 1230 %cond = select i1 %cmp, double %a, double %b |
1228 ret double %cond | 1231 ret double %cond |
1229 } | 1232 } |
1230 ; CHECK-LABEL: selectDoubleVarVar | 1233 ; CHECK-LABEL: selectDoubleVarVar |
1231 ; CHECK: ucomisd | 1234 ; CHECK: ucomisd |
1232 ; CHECK: ja {{[0-9]}} | 1235 ; CHECK: ja {{[0-9]}} |
1233 ; CHECK: fld | 1236 ; CHECK: fld |
OLD | NEW |