OLD | NEW |
1 ; This tries to be a comprehensive test of i64 operations, in | 1 ; This tries to be a comprehensive test of i64 operations, in |
2 ; particular the patterns for lowering i64 operations into constituent | 2 ; particular the patterns for lowering i64 operations into constituent |
3 ; i32 operations on x86-32. | 3 ; i32 operations on x86-32. |
4 | 4 |
5 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ | 5 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
6 ; RUN: --target x8632 -i %s --args -O2 \ | 6 ; RUN: --target x8632 -i %s --args -O2 \ |
7 ; RUN: | %if --need=target_X8632 --command FileCheck %s | 7 ; RUN: | %if --need=target_X8632 --command FileCheck %s |
8 | 8 |
9 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ | 9 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
10 ; RUN: --target x8632 -i %s --args -Om1 \ | 10 ; RUN: --target x8632 -i %s --args -Om1 \ |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 ; CHECK: shl e | 333 ; CHECK: shl e |
334 ; CHECK: test {{.*}},0x20 | 334 ; CHECK: test {{.*}},0x20 |
335 ; CHECK: je | 335 ; CHECK: je |
336 ; | 336 ; |
337 ; OPTM1-LABEL: shl64BitSigned | 337 ; OPTM1-LABEL: shl64BitSigned |
338 ; OPTM1: shld | 338 ; OPTM1: shld |
339 ; OPTM1: shl e | 339 ; OPTM1: shl e |
340 ; OPTM1: test {{.*}},0x20 | 340 ; OPTM1: test {{.*}},0x20 |
341 ; OPTM1: je | 341 ; OPTM1: je |
342 | 342 |
| 343 ; ARM32-LABEL: shl64BitSigned |
| 344 ; ARM32: sub [[REG3:r.*]], [[REG2:r.*]], #32 |
| 345 ; ARM32: lsl [[REG1:r.*]], {{r.*}}, [[REG2]] |
| 346 ; ARM32: orr [[REG1]], [[REG1]], [[REG0:r.*]], lsl [[REG3]] |
| 347 ; ARM32: rsb [[REG4:r.*]], [[REG2]], #32 |
| 348 ; ARM32: orr [[REG1]], [[REG1]], [[REG0]], lsr [[REG4]] |
| 349 ; ARM32: lsl {{.*}}, [[REG0]], [[REG2]] |
| 350 |
343 define internal i32 @shl64BitSignedTrunc(i64 %a, i64 %b) { | 351 define internal i32 @shl64BitSignedTrunc(i64 %a, i64 %b) { |
344 entry: | 352 entry: |
345 %shl = shl i64 %a, %b | 353 %shl = shl i64 %a, %b |
346 %result = trunc i64 %shl to i32 | 354 %result = trunc i64 %shl to i32 |
347 ret i32 %result | 355 ret i32 %result |
348 } | 356 } |
349 ; CHECK-LABEL: shl64BitSignedTrunc | 357 ; CHECK-LABEL: shl64BitSignedTrunc |
350 ; CHECK: mov | 358 ; CHECK: mov |
351 ; CHECK: shl e | 359 ; CHECK: shl e |
352 ; CHECK: test {{.*}},0x20 | 360 ; CHECK: test {{.*}},0x20 |
353 ; CHECK: je | 361 ; CHECK: je |
354 ; | 362 ; |
355 ; OPTM1-LABEL: shl64BitSignedTrunc | 363 ; OPTM1-LABEL: shl64BitSignedTrunc |
356 ; OPTM1: shld | 364 ; OPTM1: shld |
357 ; OPTM1: shl e | 365 ; OPTM1: shl e |
358 ; OPTM1: test {{.*}},0x20 | 366 ; OPTM1: test {{.*}},0x20 |
359 ; OPTM1: je | 367 ; OPTM1: je |
360 | 368 |
| 369 ; ARM32-LABEL: shl64BitSignedTrunc |
| 370 ; ARM32: lsl r |
| 371 |
361 define internal i64 @shl64BitUnsigned(i64 %a, i64 %b) { | 372 define internal i64 @shl64BitUnsigned(i64 %a, i64 %b) { |
362 entry: | 373 entry: |
363 %shl = shl i64 %a, %b | 374 %shl = shl i64 %a, %b |
364 ret i64 %shl | 375 ret i64 %shl |
365 } | 376 } |
366 ; CHECK-LABEL: shl64BitUnsigned | 377 ; CHECK-LABEL: shl64BitUnsigned |
367 ; CHECK: shld | 378 ; CHECK: shld |
368 ; CHECK: shl e | 379 ; CHECK: shl e |
369 ; CHECK: test {{.*}},0x20 | 380 ; CHECK: test {{.*}},0x20 |
370 ; CHECK: je | 381 ; CHECK: je |
371 ; | 382 ; |
372 ; OPTM1-LABEL: shl64BitUnsigned | 383 ; OPTM1-LABEL: shl64BitUnsigned |
373 ; OPTM1: shld | 384 ; OPTM1: shld |
374 ; OPTM1: shl e | 385 ; OPTM1: shl e |
375 ; OPTM1: test {{.*}},0x20 | 386 ; OPTM1: test {{.*}},0x20 |
376 ; OPTM1: je | 387 ; OPTM1: je |
377 | 388 |
| 389 ; ARM32-LABEL: shl64BitUnsigned |
| 390 ; ARM32: sub |
| 391 ; ARM32: lsl |
| 392 ; ARM32: orr |
| 393 ; ARM32: rsb |
| 394 ; ARM32: orr |
| 395 ; ARM32: lsl |
| 396 |
378 define internal i64 @shr64BitSigned(i64 %a, i64 %b) { | 397 define internal i64 @shr64BitSigned(i64 %a, i64 %b) { |
379 entry: | 398 entry: |
380 %shr = ashr i64 %a, %b | 399 %shr = ashr i64 %a, %b |
381 ret i64 %shr | 400 ret i64 %shr |
382 } | 401 } |
383 ; CHECK-LABEL: shr64BitSigned | 402 ; CHECK-LABEL: shr64BitSigned |
384 ; CHECK: shrd | 403 ; CHECK: shrd |
385 ; CHECK: sar | 404 ; CHECK: sar |
386 ; CHECK: test {{.*}},0x20 | 405 ; CHECK: test {{.*}},0x20 |
387 ; CHECK: je | 406 ; CHECK: je |
388 ; CHECK: sar {{.*}},0x1f | 407 ; CHECK: sar {{.*}},0x1f |
389 ; | 408 ; |
390 ; OPTM1-LABEL: shr64BitSigned | 409 ; OPTM1-LABEL: shr64BitSigned |
391 ; OPTM1: shrd | 410 ; OPTM1: shrd |
392 ; OPTM1: sar | 411 ; OPTM1: sar |
393 ; OPTM1: test {{.*}},0x20 | 412 ; OPTM1: test {{.*}},0x20 |
394 ; OPTM1: je | 413 ; OPTM1: je |
395 ; OPTM1: sar {{.*}},0x1f | 414 ; OPTM1: sar {{.*}},0x1f |
396 | 415 |
| 416 ; ARM32-LABEL: shr64BitSigned |
| 417 ; ARM32: rsb |
| 418 ; ARM32: lsr |
| 419 ; ARM32: orr |
| 420 ; ARM32: subs |
| 421 ; ARM32: orrpl |
| 422 ; ARM32: asr |
| 423 |
397 define internal i32 @shr64BitSignedTrunc(i64 %a, i64 %b) { | 424 define internal i32 @shr64BitSignedTrunc(i64 %a, i64 %b) { |
398 entry: | 425 entry: |
399 %shr = ashr i64 %a, %b | 426 %shr = ashr i64 %a, %b |
400 %result = trunc i64 %shr to i32 | 427 %result = trunc i64 %shr to i32 |
401 ret i32 %result | 428 ret i32 %result |
402 } | 429 } |
403 ; CHECK-LABEL: shr64BitSignedTrunc | 430 ; CHECK-LABEL: shr64BitSignedTrunc |
404 ; CHECK: shrd | 431 ; CHECK: shrd |
405 ; CHECK: sar | 432 ; CHECK: sar |
406 ; CHECK: test {{.*}},0x20 | 433 ; CHECK: test {{.*}},0x20 |
407 ; CHECK: je | 434 ; CHECK: je |
408 ; | 435 ; |
409 ; OPTM1-LABEL: shr64BitSignedTrunc | 436 ; OPTM1-LABEL: shr64BitSignedTrunc |
410 ; OPTM1: shrd | 437 ; OPTM1: shrd |
411 ; OPTM1: sar | 438 ; OPTM1: sar |
412 ; OPTM1: test {{.*}},0x20 | 439 ; OPTM1: test {{.*}},0x20 |
413 ; OPTM1: je | 440 ; OPTM1: je |
414 ; OPTM1: sar {{.*}},0x1f | 441 ; OPTM1: sar {{.*}},0x1f |
415 | 442 |
| 443 ; ARM32-LABEL: shr64BitSignedTrunc |
| 444 ; ARM32: rsb |
| 445 ; ARM32: lsr |
| 446 ; ARM32: orr |
| 447 ; ARM32: subs |
| 448 ; ARM32: orrpl |
| 449 |
416 define internal i64 @shr64BitUnsigned(i64 %a, i64 %b) { | 450 define internal i64 @shr64BitUnsigned(i64 %a, i64 %b) { |
417 entry: | 451 entry: |
418 %shr = lshr i64 %a, %b | 452 %shr = lshr i64 %a, %b |
419 ret i64 %shr | 453 ret i64 %shr |
420 } | 454 } |
421 ; CHECK-LABEL: shr64BitUnsigned | 455 ; CHECK-LABEL: shr64BitUnsigned |
422 ; CHECK: shrd | 456 ; CHECK: shrd |
423 ; CHECK: shr | 457 ; CHECK: shr |
424 ; CHECK: test {{.*}},0x20 | 458 ; CHECK: test {{.*}},0x20 |
425 ; CHECK: je | 459 ; CHECK: je |
426 ; | 460 ; |
427 ; OPTM1-LABEL: shr64BitUnsigned | 461 ; OPTM1-LABEL: shr64BitUnsigned |
428 ; OPTM1: shrd | 462 ; OPTM1: shrd |
429 ; OPTM1: shr | 463 ; OPTM1: shr |
430 ; OPTM1: test {{.*}},0x20 | 464 ; OPTM1: test {{.*}},0x20 |
431 ; OPTM1: je | 465 ; OPTM1: je |
432 | 466 |
| 467 ; ARM32-LABEL: shr64BitUnsigned |
| 468 ; ARM32: rsb |
| 469 ; ARM32: lsr |
| 470 ; ARM32: orr |
| 471 ; ARM32: sub |
| 472 ; ARM32: orr |
| 473 ; ARM32: lsr |
| 474 |
433 define internal i32 @shr64BitUnsignedTrunc(i64 %a, i64 %b) { | 475 define internal i32 @shr64BitUnsignedTrunc(i64 %a, i64 %b) { |
434 entry: | 476 entry: |
435 %shr = lshr i64 %a, %b | 477 %shr = lshr i64 %a, %b |
436 %result = trunc i64 %shr to i32 | 478 %result = trunc i64 %shr to i32 |
437 ret i32 %result | 479 ret i32 %result |
438 } | 480 } |
439 ; CHECK-LABEL: shr64BitUnsignedTrunc | 481 ; CHECK-LABEL: shr64BitUnsignedTrunc |
440 ; CHECK: shrd | 482 ; CHECK: shrd |
441 ; CHECK: shr | 483 ; CHECK: shr |
442 ; CHECK: test {{.*}},0x20 | 484 ; CHECK: test {{.*}},0x20 |
443 ; CHECK: je | 485 ; CHECK: je |
444 ; | 486 ; |
445 ; OPTM1-LABEL: shr64BitUnsignedTrunc | 487 ; OPTM1-LABEL: shr64BitUnsignedTrunc |
446 ; OPTM1: shrd | 488 ; OPTM1: shrd |
447 ; OPTM1: shr | 489 ; OPTM1: shr |
448 ; OPTM1: test {{.*}},0x20 | 490 ; OPTM1: test {{.*}},0x20 |
449 ; OPTM1: je | 491 ; OPTM1: je |
450 | 492 |
| 493 ; ARM32-LABEL: shr64BitUnsignedTrunc |
| 494 ; ARM32: rsb |
| 495 ; ARM32: lsr |
| 496 ; ARM32: orr |
| 497 ; ARM32: sub |
| 498 ; ARM32: orr |
| 499 |
451 define internal i64 @and64BitSigned(i64 %a, i64 %b) { | 500 define internal i64 @and64BitSigned(i64 %a, i64 %b) { |
452 entry: | 501 entry: |
453 %and = and i64 %b, %a | 502 %and = and i64 %b, %a |
454 ret i64 %and | 503 ret i64 %and |
455 } | 504 } |
456 ; CHECK-LABEL: and64BitSigned | 505 ; CHECK-LABEL: and64BitSigned |
457 ; CHECK: and | 506 ; CHECK: and |
458 ; CHECK: and | 507 ; CHECK: and |
459 ; | 508 ; |
460 ; OPTM1-LABEL: and64BitSigned | 509 ; OPTM1-LABEL: and64BitSigned |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 ; CHECK: xor | 592 ; CHECK: xor |
544 ; | 593 ; |
545 ; OPTM1-LABEL: xor64BitUnsigned | 594 ; OPTM1-LABEL: xor64BitUnsigned |
546 ; OPTM1: xor | 595 ; OPTM1: xor |
547 ; OPTM1: xor | 596 ; OPTM1: xor |
548 | 597 |
549 ; ARM32-LABEL: xor64BitUnsigned | 598 ; ARM32-LABEL: xor64BitUnsigned |
550 ; ARM32: eor | 599 ; ARM32: eor |
551 ; ARM32: eor | 600 ; ARM32: eor |
552 | 601 |
553 define internal i32 @trunc64To32Signed(i64 %a) { | 602 define internal i32 @trunc64To32Signed(i64 %padding, i64 %a) { |
554 entry: | 603 entry: |
555 %conv = trunc i64 %a to i32 | 604 %conv = trunc i64 %a to i32 |
556 ret i32 %conv | 605 ret i32 %conv |
557 } | 606 } |
558 ; CHECK-LABEL: trunc64To32Signed | 607 ; CHECK-LABEL: trunc64To32Signed |
559 ; CHECK: mov eax,DWORD PTR [esp+0x4] | 608 ; CHECK: mov eax,DWORD PTR [esp+0xc] |
560 ; | 609 ; |
561 ; OPTM1-LABEL: trunc64To32Signed | 610 ; OPTM1-LABEL: trunc64To32Signed |
562 ; OPTM1: mov eax,DWORD PTR [esp+ | 611 ; OPTM1: mov eax,DWORD PTR [esp+ |
563 | 612 |
| 613 ; ARM32-LABEL: trunc64To32Signed |
| 614 ; ARM32: mov r0, r2 |
| 615 |
564 define internal i32 @trunc64To16Signed(i64 %a) { | 616 define internal i32 @trunc64To16Signed(i64 %a) { |
565 entry: | 617 entry: |
566 %conv = trunc i64 %a to i16 | 618 %conv = trunc i64 %a to i16 |
567 %conv.ret_ext = sext i16 %conv to i32 | 619 %conv.ret_ext = sext i16 %conv to i32 |
568 ret i32 %conv.ret_ext | 620 ret i32 %conv.ret_ext |
569 } | 621 } |
570 ; CHECK-LABEL: trunc64To16Signed | 622 ; CHECK-LABEL: trunc64To16Signed |
571 ; CHECK: mov eax,DWORD PTR [esp+0x4] | 623 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
572 ; CHECK-NEXT: movsx eax,ax | 624 ; CHECK-NEXT: movsx eax,ax |
573 ; | 625 ; |
574 ; OPTM1-LABEL: trunc64To16Signed | 626 ; OPTM1-LABEL: trunc64To16Signed |
575 ; OPTM1: mov eax,DWORD PTR [esp+ | 627 ; OPTM1: mov eax,DWORD PTR [esp+ |
576 ; OPTM1: movsx eax, | 628 ; OPTM1: movsx eax, |
577 | 629 |
| 630 ; ARM32-LABEL: trunc64To16Signed |
| 631 ; ARM32: sxth r0, r0 |
| 632 |
578 define internal i32 @trunc64To8Signed(i64 %a) { | 633 define internal i32 @trunc64To8Signed(i64 %a) { |
579 entry: | 634 entry: |
580 %conv = trunc i64 %a to i8 | 635 %conv = trunc i64 %a to i8 |
581 %conv.ret_ext = sext i8 %conv to i32 | 636 %conv.ret_ext = sext i8 %conv to i32 |
582 ret i32 %conv.ret_ext | 637 ret i32 %conv.ret_ext |
583 } | 638 } |
584 ; CHECK-LABEL: trunc64To8Signed | 639 ; CHECK-LABEL: trunc64To8Signed |
585 ; CHECK: mov eax,DWORD PTR [esp+0x4] | 640 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
586 ; CHECK-NEXT: movsx eax,al | 641 ; CHECK-NEXT: movsx eax,al |
587 ; | 642 ; |
588 ; OPTM1-LABEL: trunc64To8Signed | 643 ; OPTM1-LABEL: trunc64To8Signed |
589 ; OPTM1: mov eax,DWORD PTR [esp+ | 644 ; OPTM1: mov eax,DWORD PTR [esp+ |
590 ; OPTM1: movsx eax, | 645 ; OPTM1: movsx eax, |
591 | 646 |
| 647 ; ARM32-LABEL: trunc64To8Signed |
| 648 ; ARM32: sxtb r0, r0 |
| 649 |
592 define internal i32 @trunc64To32SignedConst() { | 650 define internal i32 @trunc64To32SignedConst() { |
593 entry: | 651 entry: |
594 %conv = trunc i64 12345678901234 to i32 | 652 %conv = trunc i64 12345678901234 to i32 |
595 ret i32 %conv | 653 ret i32 %conv |
596 } | 654 } |
597 ; CHECK-LABEL: trunc64To32SignedConst | 655 ; CHECK-LABEL: trunc64To32SignedConst |
598 ; CHECK: mov eax,0x73ce2ff2 | 656 ; CHECK: mov eax,0x73ce2ff2 |
599 ; | 657 ; |
600 ; OPTM1-LABEL: trunc64To32SignedConst | 658 ; OPTM1-LABEL: trunc64To32SignedConst |
601 ; OPTM1: mov eax,0x73ce2ff2 | 659 ; OPTM1: mov eax,0x73ce2ff2 |
602 | 660 |
| 661 ; ARM32-LABEL: trunc64To32SignedConst |
| 662 ; ARM32: movw r0, #12274 ; 0x2ff2 |
| 663 ; ARM32: movt r0, #29646 ; 0x73ce |
| 664 |
603 define internal i32 @trunc64To16SignedConst() { | 665 define internal i32 @trunc64To16SignedConst() { |
604 entry: | 666 entry: |
605 %conv = trunc i64 12345678901234 to i16 | 667 %conv = trunc i64 12345678901234 to i16 |
606 %conv.ret_ext = sext i16 %conv to i32 | 668 %conv.ret_ext = sext i16 %conv to i32 |
607 ret i32 %conv.ret_ext | 669 ret i32 %conv.ret_ext |
608 } | 670 } |
609 ; CHECK-LABEL: trunc64To16SignedConst | 671 ; CHECK-LABEL: trunc64To16SignedConst |
610 ; CHECK: mov eax,0x73ce2ff2 | 672 ; CHECK: mov eax,0x73ce2ff2 |
611 ; CHECK: movsx eax,ax | 673 ; CHECK: movsx eax,ax |
612 ; | 674 ; |
613 ; OPTM1-LABEL: trunc64To16SignedConst | 675 ; OPTM1-LABEL: trunc64To16SignedConst |
614 ; OPTM1: mov eax,0x73ce2ff2 | 676 ; OPTM1: mov eax,0x73ce2ff2 |
615 ; OPTM1: movsx eax, | 677 ; OPTM1: movsx eax, |
616 | 678 |
617 define internal i32 @trunc64To32Unsigned(i64 %a) { | 679 ; ARM32-LABEL: trunc64To16SignedConst |
| 680 ; ARM32: movw r0, #12274 ; 0x2ff2 |
| 681 ; ARM32: movt r0, #29646 ; 0x73ce |
| 682 ; ARM32: sxth r0, r0 |
| 683 |
| 684 define internal i32 @trunc64To32Unsigned(i64 %padding, i64 %a) { |
618 entry: | 685 entry: |
619 %conv = trunc i64 %a to i32 | 686 %conv = trunc i64 %a to i32 |
620 ret i32 %conv | 687 ret i32 %conv |
621 } | 688 } |
622 ; CHECK-LABEL: trunc64To32Unsigned | 689 ; CHECK-LABEL: trunc64To32Unsigned |
623 ; CHECK: mov eax,DWORD PTR [esp+0x4] | 690 ; CHECK: mov eax,DWORD PTR [esp+0xc] |
624 ; | 691 ; |
625 ; OPTM1-LABEL: trunc64To32Unsigned | 692 ; OPTM1-LABEL: trunc64To32Unsigned |
626 ; OPTM1: mov eax,DWORD PTR [esp+ | 693 ; OPTM1: mov eax,DWORD PTR [esp+ |
627 | 694 |
| 695 ; ARM32-LABEL: trunc64To32Unsigned |
| 696 ; ARM32: mov r0, r2 |
| 697 |
628 define internal i32 @trunc64To16Unsigned(i64 %a) { | 698 define internal i32 @trunc64To16Unsigned(i64 %a) { |
629 entry: | 699 entry: |
630 %conv = trunc i64 %a to i16 | 700 %conv = trunc i64 %a to i16 |
631 %conv.ret_ext = zext i16 %conv to i32 | 701 %conv.ret_ext = zext i16 %conv to i32 |
632 ret i32 %conv.ret_ext | 702 ret i32 %conv.ret_ext |
633 } | 703 } |
634 ; CHECK-LABEL: trunc64To16Unsigned | 704 ; CHECK-LABEL: trunc64To16Unsigned |
635 ; CHECK: mov eax,DWORD PTR [esp+0x4] | 705 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
636 ; CHECK-NEXT: movzx eax,ax | 706 ; CHECK-NEXT: movzx eax,ax |
637 ; | 707 ; |
638 ; OPTM1-LABEL: trunc64To16Unsigned | 708 ; OPTM1-LABEL: trunc64To16Unsigned |
639 ; OPTM1: mov eax,DWORD PTR [esp+ | 709 ; OPTM1: mov eax,DWORD PTR [esp+ |
640 ; OPTM1: movzx eax, | 710 ; OPTM1: movzx eax, |
641 | 711 |
| 712 ; ARM32-LABEL: trunc64To16Unsigned |
| 713 ; ARM32: uxth |
| 714 |
642 define internal i32 @trunc64To8Unsigned(i64 %a) { | 715 define internal i32 @trunc64To8Unsigned(i64 %a) { |
643 entry: | 716 entry: |
644 %conv = trunc i64 %a to i8 | 717 %conv = trunc i64 %a to i8 |
645 %conv.ret_ext = zext i8 %conv to i32 | 718 %conv.ret_ext = zext i8 %conv to i32 |
646 ret i32 %conv.ret_ext | 719 ret i32 %conv.ret_ext |
647 } | 720 } |
648 ; CHECK-LABEL: trunc64To8Unsigned | 721 ; CHECK-LABEL: trunc64To8Unsigned |
649 ; CHECK: mov eax,DWORD PTR [esp+0x4] | 722 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
650 ; CHECK-NEXT: movzx eax,al | 723 ; CHECK-NEXT: movzx eax,al |
651 ; | 724 ; |
652 ; OPTM1-LABEL: trunc64To8Unsigned | 725 ; OPTM1-LABEL: trunc64To8Unsigned |
653 ; OPTM1: mov eax,DWORD PTR [esp+ | 726 ; OPTM1: mov eax,DWORD PTR [esp+ |
654 ; OPTM1: movzx eax, | 727 ; OPTM1: movzx eax, |
655 | 728 |
| 729 ; ARM32-LABEL: trunc64To8Unsigned |
| 730 ; ARM32: uxtb |
| 731 |
656 define internal i32 @trunc64To1(i64 %a) { | 732 define internal i32 @trunc64To1(i64 %a) { |
657 entry: | 733 entry: |
658 ; %tobool = icmp ne i64 %a, 0 | 734 ; %tobool = icmp ne i64 %a, 0 |
659 %tobool = trunc i64 %a to i1 | 735 %tobool = trunc i64 %a to i1 |
660 %tobool.ret_ext = zext i1 %tobool to i32 | 736 %tobool.ret_ext = zext i1 %tobool to i32 |
661 ret i32 %tobool.ret_ext | 737 ret i32 %tobool.ret_ext |
662 } | 738 } |
663 ; CHECK-LABEL: trunc64To1 | 739 ; CHECK-LABEL: trunc64To1 |
664 ; CHECK: mov eax,DWORD PTR [esp+0x4] | 740 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
665 ; CHECK: and eax,0x1 | 741 ; CHECK: and eax,0x1 |
666 ; CHECK: and eax,0x1 | 742 ; CHECK: and eax,0x1 |
667 ; | 743 ; |
668 ; OPTM1-LABEL: trunc64To1 | 744 ; OPTM1-LABEL: trunc64To1 |
669 ; OPTM1: mov eax,DWORD PTR [esp+ | 745 ; OPTM1: mov eax,DWORD PTR [esp+ |
670 ; OPTM1: and eax,0x1 | 746 ; OPTM1: and eax,0x1 |
671 ; OPTM1: and eax,0x1 | 747 ; OPTM1: and eax,0x1 |
672 | 748 |
| 749 ; ARM32-LABEL: trunc64To1 |
| 750 ; ARM32: and r0, r0, #1 |
| 751 ; ARM32: and r0, r0, #1 |
| 752 |
673 define internal i64 @sext32To64(i32 %a) { | 753 define internal i64 @sext32To64(i32 %a) { |
674 entry: | 754 entry: |
675 %conv = sext i32 %a to i64 | 755 %conv = sext i32 %a to i64 |
676 ret i64 %conv | 756 ret i64 %conv |
677 } | 757 } |
678 ; CHECK-LABEL: sext32To64 | 758 ; CHECK-LABEL: sext32To64 |
679 ; CHECK: mov | 759 ; CHECK: mov |
680 ; CHECK: sar {{.*}},0x1f | 760 ; CHECK: sar {{.*}},0x1f |
681 ; | 761 ; |
682 ; OPTM1-LABEL: sext32To64 | 762 ; OPTM1-LABEL: sext32To64 |
683 ; OPTM1: mov | 763 ; OPTM1: mov |
684 ; OPTM1: sar {{.*}},0x1f | 764 ; OPTM1: sar {{.*}},0x1f |
685 | 765 |
| 766 ; ARM32-LABEL: sext32To64 |
| 767 ; ARM32: asr {{.*}}, #31 |
| 768 |
686 define internal i64 @sext16To64(i32 %a) { | 769 define internal i64 @sext16To64(i32 %a) { |
687 entry: | 770 entry: |
688 %a.arg_trunc = trunc i32 %a to i16 | 771 %a.arg_trunc = trunc i32 %a to i16 |
689 %conv = sext i16 %a.arg_trunc to i64 | 772 %conv = sext i16 %a.arg_trunc to i64 |
690 ret i64 %conv | 773 ret i64 %conv |
691 } | 774 } |
692 ; CHECK-LABEL: sext16To64 | 775 ; CHECK-LABEL: sext16To64 |
693 ; CHECK: movsx | 776 ; CHECK: movsx |
694 ; CHECK: sar {{.*}},0x1f | 777 ; CHECK: sar {{.*}},0x1f |
695 ; | 778 ; |
696 ; OPTM1-LABEL: sext16To64 | 779 ; OPTM1-LABEL: sext16To64 |
697 ; OPTM1: movsx | 780 ; OPTM1: movsx |
698 ; OPTM1: sar {{.*}},0x1f | 781 ; OPTM1: sar {{.*}},0x1f |
699 | 782 |
| 783 ; ARM32-LABEL: sext16To64 |
| 784 ; ARM32: sxth |
| 785 ; ARM32: asr {{.*}}, #31 |
| 786 |
700 define internal i64 @sext8To64(i32 %a) { | 787 define internal i64 @sext8To64(i32 %a) { |
701 entry: | 788 entry: |
702 %a.arg_trunc = trunc i32 %a to i8 | 789 %a.arg_trunc = trunc i32 %a to i8 |
703 %conv = sext i8 %a.arg_trunc to i64 | 790 %conv = sext i8 %a.arg_trunc to i64 |
704 ret i64 %conv | 791 ret i64 %conv |
705 } | 792 } |
706 ; CHECK-LABEL: sext8To64 | 793 ; CHECK-LABEL: sext8To64 |
707 ; CHECK: movsx | 794 ; CHECK: movsx |
708 ; CHECK: sar {{.*}},0x1f | 795 ; CHECK: sar {{.*}},0x1f |
709 ; | 796 ; |
710 ; OPTM1-LABEL: sext8To64 | 797 ; OPTM1-LABEL: sext8To64 |
711 ; OPTM1: movsx | 798 ; OPTM1: movsx |
712 ; OPTM1: sar {{.*}},0x1f | 799 ; OPTM1: sar {{.*}},0x1f |
713 | 800 |
| 801 ; ARM32-LABEL: sext8To64 |
| 802 ; ARM32: sxtb |
| 803 ; ARM32: asr {{.*}}, #31 |
| 804 |
714 define internal i64 @sext1To64(i32 %a) { | 805 define internal i64 @sext1To64(i32 %a) { |
715 entry: | 806 entry: |
716 %a.arg_trunc = trunc i32 %a to i1 | 807 %a.arg_trunc = trunc i32 %a to i1 |
717 %conv = sext i1 %a.arg_trunc to i64 | 808 %conv = sext i1 %a.arg_trunc to i64 |
718 ret i64 %conv | 809 ret i64 %conv |
719 } | 810 } |
720 ; CHECK-LABEL: sext1To64 | 811 ; CHECK-LABEL: sext1To64 |
721 ; CHECK: mov | 812 ; CHECK: mov |
722 ; CHECK: shl {{.*}},0x1f | 813 ; CHECK: shl {{.*}},0x1f |
723 ; CHECK: sar {{.*}},0x1f | 814 ; CHECK: sar {{.*}},0x1f |
724 ; | 815 ; |
725 ; OPTM1-LABEL: sext1To64 | 816 ; OPTM1-LABEL: sext1To64 |
726 ; OPTM1: mov | 817 ; OPTM1: mov |
727 ; OPTM1: shl {{.*}},0x1f | 818 ; OPTM1: shl {{.*}},0x1f |
728 ; OPTM1: sar {{.*}},0x1f | 819 ; OPTM1: sar {{.*}},0x1f |
729 | 820 |
| 821 ; ARM32-LABEL: sext1To64 |
| 822 ; ARM32: lsl {{.*}}, #31 |
| 823 ; ARM32: asr {{.*}}, #31 |
| 824 |
730 define internal i64 @zext32To64(i32 %a) { | 825 define internal i64 @zext32To64(i32 %a) { |
731 entry: | 826 entry: |
732 %conv = zext i32 %a to i64 | 827 %conv = zext i32 %a to i64 |
733 ret i64 %conv | 828 ret i64 %conv |
734 } | 829 } |
735 ; CHECK-LABEL: zext32To64 | 830 ; CHECK-LABEL: zext32To64 |
736 ; CHECK: mov | 831 ; CHECK: mov |
737 ; CHECK: mov {{.*}},0x0 | 832 ; CHECK: mov {{.*}},0x0 |
738 ; | 833 ; |
739 ; OPTM1-LABEL: zext32To64 | 834 ; OPTM1-LABEL: zext32To64 |
740 ; OPTM1: mov | 835 ; OPTM1: mov |
741 ; OPTM1: mov {{.*}},0x0 | 836 ; OPTM1: mov {{.*}},0x0 |
742 | 837 |
| 838 ; ARM32-LABEL: zext32To64 |
| 839 ; ARM32: mov {{.*}}, #0 |
| 840 |
743 define internal i64 @zext16To64(i32 %a) { | 841 define internal i64 @zext16To64(i32 %a) { |
744 entry: | 842 entry: |
745 %a.arg_trunc = trunc i32 %a to i16 | 843 %a.arg_trunc = trunc i32 %a to i16 |
746 %conv = zext i16 %a.arg_trunc to i64 | 844 %conv = zext i16 %a.arg_trunc to i64 |
747 ret i64 %conv | 845 ret i64 %conv |
748 } | 846 } |
749 ; CHECK-LABEL: zext16To64 | 847 ; CHECK-LABEL: zext16To64 |
750 ; CHECK: movzx | 848 ; CHECK: movzx |
751 ; CHECK: mov {{.*}},0x0 | 849 ; CHECK: mov {{.*}},0x0 |
752 ; | 850 ; |
753 ; OPTM1-LABEL: zext16To64 | 851 ; OPTM1-LABEL: zext16To64 |
754 ; OPTM1: movzx | 852 ; OPTM1: movzx |
755 ; OPTM1: mov {{.*}},0x0 | 853 ; OPTM1: mov {{.*}},0x0 |
756 | 854 |
| 855 ; ARM32-LABEL: zext16To64 |
| 856 ; ARM32: uxth |
| 857 ; ARM32: mov {{.*}}, #0 |
| 858 |
757 define internal i64 @zext8To64(i32 %a) { | 859 define internal i64 @zext8To64(i32 %a) { |
758 entry: | 860 entry: |
759 %a.arg_trunc = trunc i32 %a to i8 | 861 %a.arg_trunc = trunc i32 %a to i8 |
760 %conv = zext i8 %a.arg_trunc to i64 | 862 %conv = zext i8 %a.arg_trunc to i64 |
761 ret i64 %conv | 863 ret i64 %conv |
762 } | 864 } |
763 ; CHECK-LABEL: zext8To64 | 865 ; CHECK-LABEL: zext8To64 |
764 ; CHECK: movzx | 866 ; CHECK: movzx |
765 ; CHECK: mov {{.*}},0x0 | 867 ; CHECK: mov {{.*}},0x0 |
766 ; | 868 ; |
767 ; OPTM1-LABEL: zext8To64 | 869 ; OPTM1-LABEL: zext8To64 |
768 ; OPTM1: movzx | 870 ; OPTM1: movzx |
769 ; OPTM1: mov {{.*}},0x0 | 871 ; OPTM1: mov {{.*}},0x0 |
770 | 872 |
| 873 ; ARM32-LABEL: zext8To64 |
| 874 ; ARM32: uxtb |
| 875 ; ARM32: mov {{.*}}, #0 |
| 876 |
771 define internal i64 @zext1To64(i32 %a) { | 877 define internal i64 @zext1To64(i32 %a) { |
772 entry: | 878 entry: |
773 %a.arg_trunc = trunc i32 %a to i1 | 879 %a.arg_trunc = trunc i32 %a to i1 |
774 %conv = zext i1 %a.arg_trunc to i64 | 880 %conv = zext i1 %a.arg_trunc to i64 |
775 ret i64 %conv | 881 ret i64 %conv |
776 } | 882 } |
777 ; CHECK-LABEL: zext1To64 | 883 ; CHECK-LABEL: zext1To64 |
778 ; CHECK: and {{.*}},0x1 | 884 ; CHECK: and {{.*}},0x1 |
779 ; CHECK: mov {{.*}},0x0 | 885 ; CHECK: mov {{.*}},0x0 |
780 ; | 886 ; |
781 ; OPTM1-LABEL: zext1To64 | 887 ; OPTM1-LABEL: zext1To64 |
782 ; OPTM1: and {{.*}},0x1 | 888 ; OPTM1: and {{.*}},0x1 |
783 ; OPTM1: mov {{.*}},0x0 | 889 ; OPTM1: mov {{.*}},0x0 |
784 | 890 |
| 891 ; ARM32-LABEL: zext1To64 |
| 892 ; ARM32: and {{.*}}, #1 |
| 893 ; ARM32: mov {{.*}}, #0 |
| 894 |
785 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { | 895 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { |
786 entry: | 896 entry: |
787 %cmp = icmp eq i64 %a, %b | 897 %cmp = icmp eq i64 %a, %b |
788 br i1 %cmp, label %if.then, label %if.end | 898 br i1 %cmp, label %if.then, label %if.end |
789 | 899 |
790 if.then: ; preds = %entry | 900 if.then: ; preds = %entry |
791 call void @func() | 901 call void @func() |
792 br label %if.end | 902 br label %if.end |
793 | 903 |
794 if.end: ; preds = %if.then, %entry | 904 if.end: ; preds = %if.then, %entry |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1107 ret i32 %cmp.ret_ext | 1217 ret i32 %cmp.ret_ext |
1108 } | 1218 } |
1109 ; CHECK-LABEL: icmpEq64Bool | 1219 ; CHECK-LABEL: icmpEq64Bool |
1110 ; CHECK: jne | 1220 ; CHECK: jne |
1111 ; CHECK: je | 1221 ; CHECK: je |
1112 ; | 1222 ; |
1113 ; OPTM1-LABEL: icmpEq64Bool | 1223 ; OPTM1-LABEL: icmpEq64Bool |
1114 ; OPTM1: jne | 1224 ; OPTM1: jne |
1115 ; OPTM1: je | 1225 ; OPTM1: je |
1116 | 1226 |
| 1227 ; ARM32-LABEL: icmpEq64Bool |
| 1228 ; ARM32: moveq |
| 1229 ; ARM32: movne |
| 1230 |
1117 define internal i32 @icmpNe64Bool(i64 %a, i64 %b) { | 1231 define internal i32 @icmpNe64Bool(i64 %a, i64 %b) { |
1118 entry: | 1232 entry: |
1119 %cmp = icmp ne i64 %a, %b | 1233 %cmp = icmp ne i64 %a, %b |
1120 %cmp.ret_ext = zext i1 %cmp to i32 | 1234 %cmp.ret_ext = zext i1 %cmp to i32 |
1121 ret i32 %cmp.ret_ext | 1235 ret i32 %cmp.ret_ext |
1122 } | 1236 } |
1123 ; CHECK-LABEL: icmpNe64Bool | 1237 ; CHECK-LABEL: icmpNe64Bool |
1124 ; CHECK: jne | 1238 ; CHECK: jne |
1125 ; CHECK: jne | 1239 ; CHECK: jne |
1126 ; | 1240 ; |
1127 ; OPTM1-LABEL: icmpNe64Bool | 1241 ; OPTM1-LABEL: icmpNe64Bool |
1128 ; OPTM1: jne | 1242 ; OPTM1: jne |
1129 ; OPTM1: jne | 1243 ; OPTM1: jne |
1130 | 1244 |
| 1245 ; ARM32-LABEL: icmpNe64Bool |
| 1246 ; ARM32: movne |
| 1247 ; ARM32: moveq |
| 1248 |
1131 define internal i32 @icmpSgt64Bool(i64 %a, i64 %b) { | 1249 define internal i32 @icmpSgt64Bool(i64 %a, i64 %b) { |
1132 entry: | 1250 entry: |
1133 %cmp = icmp sgt i64 %a, %b | 1251 %cmp = icmp sgt i64 %a, %b |
1134 %cmp.ret_ext = zext i1 %cmp to i32 | 1252 %cmp.ret_ext = zext i1 %cmp to i32 |
1135 ret i32 %cmp.ret_ext | 1253 ret i32 %cmp.ret_ext |
1136 } | 1254 } |
1137 ; CHECK-LABEL: icmpSgt64Bool | 1255 ; CHECK-LABEL: icmpSgt64Bool |
1138 ; CHECK: cmp | 1256 ; CHECK: cmp |
1139 ; CHECK: jg | 1257 ; CHECK: jg |
1140 ; CHECK: jl | 1258 ; CHECK: jl |
1141 ; CHECK: cmp | 1259 ; CHECK: cmp |
1142 ; CHECK: ja | 1260 ; CHECK: ja |
1143 ; | 1261 ; |
1144 ; OPTM1-LABEL: icmpSgt64Bool | 1262 ; OPTM1-LABEL: icmpSgt64Bool |
1145 ; OPTM1: cmp | 1263 ; OPTM1: cmp |
1146 ; OPTM1: jg | 1264 ; OPTM1: jg |
1147 ; OPTM1: jl | 1265 ; OPTM1: jl |
1148 ; OPTM1: cmp | 1266 ; OPTM1: cmp |
1149 ; OPTM1: ja | 1267 ; OPTM1: ja |
1150 | 1268 |
| 1269 ; ARM32-LABEL: icmpSgt64Bool |
| 1270 ; ARM32: cmp |
| 1271 ; ARM32: sbcs |
| 1272 ; ARM32: movlt |
| 1273 ; ARM32: movge |
| 1274 |
1151 define internal i32 @icmpUgt64Bool(i64 %a, i64 %b) { | 1275 define internal i32 @icmpUgt64Bool(i64 %a, i64 %b) { |
1152 entry: | 1276 entry: |
1153 %cmp = icmp ugt i64 %a, %b | 1277 %cmp = icmp ugt i64 %a, %b |
1154 %cmp.ret_ext = zext i1 %cmp to i32 | 1278 %cmp.ret_ext = zext i1 %cmp to i32 |
1155 ret i32 %cmp.ret_ext | 1279 ret i32 %cmp.ret_ext |
1156 } | 1280 } |
1157 ; CHECK-LABEL: icmpUgt64Bool | 1281 ; CHECK-LABEL: icmpUgt64Bool |
1158 ; CHECK: cmp | 1282 ; CHECK: cmp |
1159 ; CHECK: ja | 1283 ; CHECK: ja |
1160 ; CHECK: jb | 1284 ; CHECK: jb |
1161 ; CHECK: cmp | 1285 ; CHECK: cmp |
1162 ; CHECK: ja | 1286 ; CHECK: ja |
1163 ; | 1287 ; |
1164 ; OPTM1-LABEL: icmpUgt64Bool | 1288 ; OPTM1-LABEL: icmpUgt64Bool |
1165 ; OPTM1: cmp | 1289 ; OPTM1: cmp |
1166 ; OPTM1: ja | 1290 ; OPTM1: ja |
1167 ; OPTM1: jb | 1291 ; OPTM1: jb |
1168 ; OPTM1: cmp | 1292 ; OPTM1: cmp |
1169 ; OPTM1: ja | 1293 ; OPTM1: ja |
1170 | 1294 |
| 1295 ; ARM32-LABEL: icmpUgt64Bool |
| 1296 ; ARM32: cmp |
| 1297 ; ARM32: cmpeq |
| 1298 ; ARM32: movhi |
| 1299 ; ARM32: movls |
| 1300 |
1171 define internal i32 @icmpSge64Bool(i64 %a, i64 %b) { | 1301 define internal i32 @icmpSge64Bool(i64 %a, i64 %b) { |
1172 entry: | 1302 entry: |
1173 %cmp = icmp sge i64 %a, %b | 1303 %cmp = icmp sge i64 %a, %b |
1174 %cmp.ret_ext = zext i1 %cmp to i32 | 1304 %cmp.ret_ext = zext i1 %cmp to i32 |
1175 ret i32 %cmp.ret_ext | 1305 ret i32 %cmp.ret_ext |
1176 } | 1306 } |
1177 ; CHECK-LABEL: icmpSge64Bool | 1307 ; CHECK-LABEL: icmpSge64Bool |
1178 ; CHECK: cmp | 1308 ; CHECK: cmp |
1179 ; CHECK: jg | 1309 ; CHECK: jg |
1180 ; CHECK: jl | 1310 ; CHECK: jl |
1181 ; CHECK: cmp | 1311 ; CHECK: cmp |
1182 ; CHECK: jae | 1312 ; CHECK: jae |
1183 ; | 1313 ; |
1184 ; OPTM1-LABEL: icmpSge64Bool | 1314 ; OPTM1-LABEL: icmpSge64Bool |
1185 ; OPTM1: cmp | 1315 ; OPTM1: cmp |
1186 ; OPTM1: jg | 1316 ; OPTM1: jg |
1187 ; OPTM1: jl | 1317 ; OPTM1: jl |
1188 ; OPTM1: cmp | 1318 ; OPTM1: cmp |
1189 ; OPTM1: jae | 1319 ; OPTM1: jae |
1190 | 1320 |
| 1321 ; ARM32-LABEL: icmpSge64Bool |
| 1322 ; ARM32: cmp |
| 1323 ; ARM32: sbcs |
| 1324 ; ARM32: movge |
| 1325 ; ARM32: movlt |
| 1326 |
1191 define internal i32 @icmpUge64Bool(i64 %a, i64 %b) { | 1327 define internal i32 @icmpUge64Bool(i64 %a, i64 %b) { |
1192 entry: | 1328 entry: |
1193 %cmp = icmp uge i64 %a, %b | 1329 %cmp = icmp uge i64 %a, %b |
1194 %cmp.ret_ext = zext i1 %cmp to i32 | 1330 %cmp.ret_ext = zext i1 %cmp to i32 |
1195 ret i32 %cmp.ret_ext | 1331 ret i32 %cmp.ret_ext |
1196 } | 1332 } |
1197 ; CHECK-LABEL: icmpUge64Bool | 1333 ; CHECK-LABEL: icmpUge64Bool |
1198 ; CHECK: cmp | 1334 ; CHECK: cmp |
1199 ; CHECK: ja | 1335 ; CHECK: ja |
1200 ; CHECK: jb | 1336 ; CHECK: jb |
1201 ; CHECK: cmp | 1337 ; CHECK: cmp |
1202 ; CHECK: jae | 1338 ; CHECK: jae |
1203 ; | 1339 ; |
1204 ; OPTM1-LABEL: icmpUge64Bool | 1340 ; OPTM1-LABEL: icmpUge64Bool |
1205 ; OPTM1: cmp | 1341 ; OPTM1: cmp |
1206 ; OPTM1: ja | 1342 ; OPTM1: ja |
1207 ; OPTM1: jb | 1343 ; OPTM1: jb |
1208 ; OPTM1: cmp | 1344 ; OPTM1: cmp |
1209 ; OPTM1: jae | 1345 ; OPTM1: jae |
1210 | 1346 |
| 1347 ; ARM32-LABEL: icmpUge64Bool |
| 1348 ; ARM32: cmp |
| 1349 ; ARM32: cmpeq |
| 1350 ; ARM32: movcs |
| 1351 ; ARM32: movcc |
| 1352 |
1211 define internal i32 @icmpSlt64Bool(i64 %a, i64 %b) { | 1353 define internal i32 @icmpSlt64Bool(i64 %a, i64 %b) { |
1212 entry: | 1354 entry: |
1213 %cmp = icmp slt i64 %a, %b | 1355 %cmp = icmp slt i64 %a, %b |
1214 %cmp.ret_ext = zext i1 %cmp to i32 | 1356 %cmp.ret_ext = zext i1 %cmp to i32 |
1215 ret i32 %cmp.ret_ext | 1357 ret i32 %cmp.ret_ext |
1216 } | 1358 } |
1217 ; CHECK-LABEL: icmpSlt64Bool | 1359 ; CHECK-LABEL: icmpSlt64Bool |
1218 ; CHECK: cmp | 1360 ; CHECK: cmp |
1219 ; CHECK: jl | 1361 ; CHECK: jl |
1220 ; CHECK: jg | 1362 ; CHECK: jg |
1221 ; CHECK: cmp | 1363 ; CHECK: cmp |
1222 ; CHECK: jb | 1364 ; CHECK: jb |
1223 ; | 1365 ; |
1224 ; OPTM1-LABEL: icmpSlt64Bool | 1366 ; OPTM1-LABEL: icmpSlt64Bool |
1225 ; OPTM1: cmp | 1367 ; OPTM1: cmp |
1226 ; OPTM1: jl | 1368 ; OPTM1: jl |
1227 ; OPTM1: jg | 1369 ; OPTM1: jg |
1228 ; OPTM1: cmp | 1370 ; OPTM1: cmp |
1229 ; OPTM1: jb | 1371 ; OPTM1: jb |
1230 | 1372 |
| 1373 ; ARM32-LABEL: icmpSlt64Bool |
| 1374 ; ARM32: cmp |
| 1375 ; ARM32: sbcs |
| 1376 ; ARM32: movlt |
| 1377 ; ARM32: movge |
| 1378 |
1231 define internal i32 @icmpUlt64Bool(i64 %a, i64 %b) { | 1379 define internal i32 @icmpUlt64Bool(i64 %a, i64 %b) { |
1232 entry: | 1380 entry: |
1233 %cmp = icmp ult i64 %a, %b | 1381 %cmp = icmp ult i64 %a, %b |
1234 %cmp.ret_ext = zext i1 %cmp to i32 | 1382 %cmp.ret_ext = zext i1 %cmp to i32 |
1235 ret i32 %cmp.ret_ext | 1383 ret i32 %cmp.ret_ext |
1236 } | 1384 } |
1237 ; CHECK-LABEL: icmpUlt64Bool | 1385 ; CHECK-LABEL: icmpUlt64Bool |
1238 ; CHECK: cmp | 1386 ; CHECK: cmp |
1239 ; CHECK: jb | 1387 ; CHECK: jb |
1240 ; CHECK: ja | 1388 ; CHECK: ja |
1241 ; CHECK: cmp | 1389 ; CHECK: cmp |
1242 ; CHECK: jb | 1390 ; CHECK: jb |
1243 ; | 1391 ; |
1244 ; OPTM1-LABEL: icmpUlt64Bool | 1392 ; OPTM1-LABEL: icmpUlt64Bool |
1245 ; OPTM1: cmp | 1393 ; OPTM1: cmp |
1246 ; OPTM1: jb | 1394 ; OPTM1: jb |
1247 ; OPTM1: ja | 1395 ; OPTM1: ja |
1248 ; OPTM1: cmp | 1396 ; OPTM1: cmp |
1249 ; OPTM1: jb | 1397 ; OPTM1: jb |
1250 | 1398 |
| 1399 ; ARM32-LABEL: icmpUlt64Bool |
| 1400 ; ARM32: cmp |
| 1401 ; ARM32: cmpeq |
| 1402 ; ARM32: movcc |
| 1403 ; ARM32: movcs |
| 1404 |
1251 define internal i32 @icmpSle64Bool(i64 %a, i64 %b) { | 1405 define internal i32 @icmpSle64Bool(i64 %a, i64 %b) { |
1252 entry: | 1406 entry: |
1253 %cmp = icmp sle i64 %a, %b | 1407 %cmp = icmp sle i64 %a, %b |
1254 %cmp.ret_ext = zext i1 %cmp to i32 | 1408 %cmp.ret_ext = zext i1 %cmp to i32 |
1255 ret i32 %cmp.ret_ext | 1409 ret i32 %cmp.ret_ext |
1256 } | 1410 } |
1257 ; CHECK-LABEL: icmpSle64Bool | 1411 ; CHECK-LABEL: icmpSle64Bool |
1258 ; CHECK: cmp | 1412 ; CHECK: cmp |
1259 ; CHECK: jl | 1413 ; CHECK: jl |
1260 ; CHECK: jg | 1414 ; CHECK: jg |
1261 ; CHECK: cmp | 1415 ; CHECK: cmp |
1262 ; CHECK: jbe | 1416 ; CHECK: jbe |
1263 ; | 1417 ; |
1264 ; OPTM1-LABEL: icmpSle64Bool | 1418 ; OPTM1-LABEL: icmpSle64Bool |
1265 ; OPTM1: cmp | 1419 ; OPTM1: cmp |
1266 ; OPTM1: jl | 1420 ; OPTM1: jl |
1267 ; OPTM1: jg | 1421 ; OPTM1: jg |
1268 ; OPTM1: cmp | 1422 ; OPTM1: cmp |
1269 ; OPTM1: jbe | 1423 ; OPTM1: jbe |
1270 | 1424 |
| 1425 ; ARM32-LABEL: icmpSle64Bool |
| 1426 ; ARM32: cmp |
| 1427 ; ARM32: sbcs |
| 1428 ; ARM32: movge |
| 1429 ; ARM32: movlt |
| 1430 |
1271 define internal i32 @icmpUle64Bool(i64 %a, i64 %b) { | 1431 define internal i32 @icmpUle64Bool(i64 %a, i64 %b) { |
1272 entry: | 1432 entry: |
1273 %cmp = icmp ule i64 %a, %b | 1433 %cmp = icmp ule i64 %a, %b |
1274 %cmp.ret_ext = zext i1 %cmp to i32 | 1434 %cmp.ret_ext = zext i1 %cmp to i32 |
1275 ret i32 %cmp.ret_ext | 1435 ret i32 %cmp.ret_ext |
1276 } | 1436 } |
1277 ; CHECK-LABEL: icmpUle64Bool | 1437 ; CHECK-LABEL: icmpUle64Bool |
1278 ; CHECK: cmp | 1438 ; CHECK: cmp |
1279 ; CHECK: jb | 1439 ; CHECK: jb |
1280 ; CHECK: ja | 1440 ; CHECK: ja |
1281 ; CHECK: cmp | 1441 ; CHECK: cmp |
1282 ; CHECK: jbe | 1442 ; CHECK: jbe |
1283 ; | 1443 ; |
1284 ; OPTM1-LABEL: icmpUle64Bool | 1444 ; OPTM1-LABEL: icmpUle64Bool |
1285 ; OPTM1: cmp | 1445 ; OPTM1: cmp |
1286 ; OPTM1: jb | 1446 ; OPTM1: jb |
1287 ; OPTM1: ja | 1447 ; OPTM1: ja |
1288 ; OPTM1: cmp | 1448 ; OPTM1: cmp |
1289 ; OPTM1: jbe | 1449 ; OPTM1: jbe |
1290 | 1450 |
| 1451 ; ARM32-LABEL: icmpUle64Bool |
| 1452 ; ARM32: cmp |
| 1453 ; ARM32: cmpeq |
| 1454 ; ARM32: movls |
| 1455 ; ARM32: movhi |
| 1456 |
1291 define internal i64 @load64(i32 %a) { | 1457 define internal i64 @load64(i32 %a) { |
1292 entry: | 1458 entry: |
1293 %__1 = inttoptr i32 %a to i64* | 1459 %__1 = inttoptr i32 %a to i64* |
1294 %v0 = load i64, i64* %__1, align 1 | 1460 %v0 = load i64, i64* %__1, align 1 |
1295 ret i64 %v0 | 1461 ret i64 %v0 |
1296 } | 1462 } |
1297 ; CHECK-LABEL: load64 | 1463 ; CHECK-LABEL: load64 |
1298 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] | 1464 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] |
1299 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]] | 1465 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]] |
1300 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]+0x4] | 1466 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]+0x4] |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1471 ret void | 1637 ret void |
1472 } | 1638 } |
1473 ; The following checks are not strictly necessary since one of the RUN | 1639 ; The following checks are not strictly necessary since one of the RUN |
1474 ; lines actually runs the output through the assembler. | 1640 ; lines actually runs the output through the assembler. |
1475 ; CHECK-LABEL: icmpLt64Imm | 1641 ; CHECK-LABEL: icmpLt64Imm |
1476 ; CHECK-NOT: cmp 0x{{[0-9a-f]+}}, | 1642 ; CHECK-NOT: cmp 0x{{[0-9a-f]+}}, |
1477 ; OPTM1-LABEL: icmpLt64Imm | 1643 ; OPTM1-LABEL: icmpLt64Imm |
1478 ; OPTM1-NOT: cmp 0x{{[0-9a-f]+}}, | 1644 ; OPTM1-NOT: cmp 0x{{[0-9a-f]+}}, |
1479 ; ARM32-LABEL: icmpLt64Imm | 1645 ; ARM32-LABEL: icmpLt64Imm |
1480 ; ARM32-NOT: cmp #{{[0-9a-f]+}}, | 1646 ; ARM32-NOT: cmp #{{[0-9a-f]+}}, |
OLD | NEW |