| 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 -allow-externally-defined-symbols \ | 6 ; RUN: --target x8632 -i %s --args -O2 -allow-externally-defined-symbols \ |
| 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 -allow-externally-defined-symbols \ | 10 ; RUN: --target x8632 -i %s --args -Om1 -allow-externally-defined-symbols \ |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 ; TODO(rkotler): Stop skipping unimplemented parts (via --skip-unimplemented) | 29 ; TODO(rkotler): Stop skipping unimplemented parts (via --skip-unimplemented) |
| 30 ; once enough infrastructure is in. Also, switch to --filetype=obj | 30 ; once enough infrastructure is in. Also, switch to --filetype=obj |
| 31 ; when possible. | 31 ; when possible. |
| 32 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ | 32 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ |
| 33 ; RUN: --command %p2i --filetype=asm --assemble \ | 33 ; RUN: --command %p2i --filetype=asm --assemble \ |
| 34 ; RUN: --disassemble --target mips32 -i %s --args -O2 --skip-unimplemented \ | 34 ; RUN: --disassemble --target mips32 -i %s --args -O2 --skip-unimplemented \ |
| 35 ; RUN: -allow-externally-defined-symbols \ | 35 ; RUN: -allow-externally-defined-symbols \ |
| 36 ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ | 36 ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ |
| 37 ; RUN: --command FileCheck --check-prefix MIPS32 --check-prefix MIPS32-O2 %s | 37 ; RUN: --command FileCheck --check-prefix MIPS32 --check-prefix MIPS32-O2 %s |
| 38 | 38 |
| 39 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ |
| 40 ; RUN: --command %p2i --filetype=asm --assemble \ |
| 41 ; RUN: --disassemble --target mips32 -i %s --args -Om1 --skip-unimplemented \ |
| 42 ; RUN: -allow-externally-defined-symbols \ |
| 43 ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ |
| 44 ; RUN: --command FileCheck --check-prefix MIPS32 --check-prefix MIPS32-OM1 %s |
| 45 |
| 39 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 46 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
| 40 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 47 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
| 41 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 | 48 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 |
| 42 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 | 49 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 |
| 43 | 50 |
| 44 define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) { | 51 define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) { |
| 45 entry: | 52 entry: |
| 46 ret i32 %b | 53 ret i32 %b |
| 47 } | 54 } |
| 48 | 55 |
| 49 ; MIPS32-LABEL: ignore64BitArg | 56 ; MIPS32-LABEL: ignore64BitArg |
| 50 ; MIPS32: move v0,a2 | 57 ; MIPS32-O2: move v0,a2 |
| 58 ; MIPS32-OM1: sw a2,[[MEM:.*]] |
| 59 ; MIPS32-OM1: lw v0,[[MEM]] |
| 51 | 60 |
| 52 define internal i32 @pass64BitArg(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f
) { | 61 define internal i32 @pass64BitArg(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f
) { |
| 53 entry: | 62 entry: |
| 54 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 %b) | 63 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 %b) |
| 55 %call1 = call i32 @ignore64BitArgNoInline(i64 %c, i32 123, i64 %d) | 64 %call1 = call i32 @ignore64BitArgNoInline(i64 %c, i32 123, i64 %d) |
| 56 %call2 = call i32 @ignore64BitArgNoInline(i64 %e, i32 123, i64 %f) | 65 %call2 = call i32 @ignore64BitArgNoInline(i64 %e, i32 123, i64 %f) |
| 57 %add = add i32 %call1, %call | 66 %add = add i32 %call1, %call |
| 58 %add3 = add i32 %add, %call2 | 67 %add3 = add i32 %add, %call2 |
| 59 ret i32 %add3 | 68 ret i32 %add3 |
| 60 } | 69 } |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 ; OPTM1-LABEL: return64BitArg | 205 ; OPTM1-LABEL: return64BitArg |
| 197 ; OPTM1: mov {{.*}},DWORD PTR [esp+0xc] | 206 ; OPTM1: mov {{.*}},DWORD PTR [esp+0xc] |
| 198 ; OPTM1: mov {{.*}},DWORD PTR [esp+0x10] | 207 ; OPTM1: mov {{.*}},DWORD PTR [esp+0x10] |
| 199 | 208 |
| 200 ; ARM32-LABEL: return64BitArg | 209 ; ARM32-LABEL: return64BitArg |
| 201 ; ARM32: mov {{.*}}, r2 | 210 ; ARM32: mov {{.*}}, r2 |
| 202 ; ARM32: mov {{.*}}, r3 | 211 ; ARM32: mov {{.*}}, r3 |
| 203 ; ARM32: bx lr | 212 ; ARM32: bx lr |
| 204 | 213 |
| 205 ; MIPS32-LABEL; return64BitArg | 214 ; MIPS32-LABEL; return64BitArg |
| 206 ; MIPS32: move v0,a2 | 215 ; MIPS32-O2: move v0,a2 |
| 207 ; MIPS32: move v1,a3 | 216 ; MIPS32-O2: move v1,a3 |
| 217 ; MIPS32-OM1: move [[T1:.*]],a2 |
| 218 ; MIPS32-OM1: sw [[T1]],[[MEM1:.*]] |
| 219 ; MIPS32-OM1: move [[T2:.*]],a3 |
| 220 ; MIPS32-OM1: sw [[T2]],[[MEM2:.*]] |
| 221 ; MIPS32-OM1: lw v0,[[MEM1]] |
| 222 ; MIPS32-OM1: lw v1,[[MEM2]] |
| 208 ; MIPS32: jr ra | 223 ; MIPS32: jr ra |
| 209 | 224 |
| 210 define internal i64 @return64BitConst() { | 225 define internal i64 @return64BitConst() { |
| 211 entry: | 226 entry: |
| 212 ret i64 -2401053092306725256 | 227 ret i64 -2401053092306725256 |
| 213 } | 228 } |
| 214 ; CHECK-LABEL: return64BitConst | 229 ; CHECK-LABEL: return64BitConst |
| 215 ; CHECK: mov eax,0x12345678 | 230 ; CHECK: mov eax,0x12345678 |
| 216 ; CHECK: mov edx,0xdeadbeef | 231 ; CHECK: mov edx,0xdeadbeef |
| 217 ; | 232 ; |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 ; MIPS32: sllv [[T1:.*]],[[A_HI:.*]],[[B_LO:.*]] | 539 ; MIPS32: sllv [[T1:.*]],[[A_HI:.*]],[[B_LO:.*]] |
| 525 ; MIPS32: nor [[T2:.*]],[[B_LO]],zero | 540 ; MIPS32: nor [[T2:.*]],[[B_LO]],zero |
| 526 ; MIPS32: srl [[T3:.*]],[[A_LO:.*]],0x1 | 541 ; MIPS32: srl [[T3:.*]],[[A_LO:.*]],0x1 |
| 527 ; MIPS32: srlv [[T4:.*]],[[T3]],[[T2]] | 542 ; MIPS32: srlv [[T4:.*]],[[T3]],[[T2]] |
| 528 ; MIPS32: or [[T_HI:.*]],[[T1]],[[T4]] | 543 ; MIPS32: or [[T_HI:.*]],[[T1]],[[T4]] |
| 529 ; MIPS32: sllv [[T_LO:.*]],[[A_LO]],[[B_LO]] | 544 ; MIPS32: sllv [[T_LO:.*]],[[A_LO]],[[B_LO]] |
| 530 ; MIPS32: move [[T1_LO:.*]],[[T_LO]] | 545 ; MIPS32: move [[T1_LO:.*]],[[T_LO]] |
| 531 ; MIPS32: andi [[T5:.*]],[[B_LO]],0x20 | 546 ; MIPS32: andi [[T5:.*]],[[B_LO]],0x20 |
| 532 ; MIPS32: movn [[T_HI]],[[T_LO]],[[T5]] | 547 ; MIPS32: movn [[T_HI]],[[T_LO]],[[T5]] |
| 533 ; MIPS32: movn [[T1_LO]],zero,[[T5]] | 548 ; MIPS32: movn [[T1_LO]],zero,[[T5]] |
| 534 ; MIPS32: move» v1,[[T_HI]] | 549 ; MIPS32-O2: move» v1,[[T_HI]] |
| 550 ; MIPS32-OM1: sw» [[T_HI]],[[MEM:.*]] |
| 551 ; MIPS32-OM1: lw v1,[[MEM]] |
| 535 | 552 |
| 536 define internal i32 @shl64BitSignedTrunc(i64 %a, i64 %b) { | 553 define internal i32 @shl64BitSignedTrunc(i64 %a, i64 %b) { |
| 537 entry: | 554 entry: |
| 538 %shl = shl i64 %a, %b | 555 %shl = shl i64 %a, %b |
| 539 %result = trunc i64 %shl to i32 | 556 %result = trunc i64 %shl to i32 |
| 540 ret i32 %result | 557 ret i32 %result |
| 541 } | 558 } |
| 542 ; CHECK-LABEL: shl64BitSignedTrunc | 559 ; CHECK-LABEL: shl64BitSignedTrunc |
| 543 ; CHECK: mov | 560 ; CHECK: mov |
| 544 ; CHECK: shl e | 561 ; CHECK: shl e |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 ; MIPS32: sllv [[T1:.*]],[[A_HI:.*]],[[B_LO:.*]] | 601 ; MIPS32: sllv [[T1:.*]],[[A_HI:.*]],[[B_LO:.*]] |
| 585 ; MIPS32: nor [[T2:.*]],[[B_LO]],zero | 602 ; MIPS32: nor [[T2:.*]],[[B_LO]],zero |
| 586 ; MIPS32: srl [[T3:.*]],[[A_LO:.*]],0x1 | 603 ; MIPS32: srl [[T3:.*]],[[A_LO:.*]],0x1 |
| 587 ; MIPS32: srlv [[T4:.*]],[[T3]],[[T2]] | 604 ; MIPS32: srlv [[T4:.*]],[[T3]],[[T2]] |
| 588 ; MIPS32: or [[T_HI:.*]],[[T1]],[[T4]] | 605 ; MIPS32: or [[T_HI:.*]],[[T1]],[[T4]] |
| 589 ; MIPS32: sllv [[T_LO:.*]],[[A_LO]],[[B_LO]] | 606 ; MIPS32: sllv [[T_LO:.*]],[[A_LO]],[[B_LO]] |
| 590 ; MIPS32: move [[T1_LO:.*]],[[T_LO]] | 607 ; MIPS32: move [[T1_LO:.*]],[[T_LO]] |
| 591 ; MIPS32: andi [[T5:.*]],[[B_LO]],0x20 | 608 ; MIPS32: andi [[T5:.*]],[[B_LO]],0x20 |
| 592 ; MIPS32: movn [[T_HI]],[[T_LO]],[[T5]] | 609 ; MIPS32: movn [[T_HI]],[[T_LO]],[[T5]] |
| 593 ; MIPS32: movn [[T1_LO]],zero,[[T5]] | 610 ; MIPS32: movn [[T1_LO]],zero,[[T5]] |
| 594 ; MIPS32: move v1,[[T_HI]] | 611 ; MIPS32-O2: move v1,[[T_HI]] |
| 612 ; MIPS32-OM1: sw [[T_HI]],[[MEM:.*]] |
| 613 ; MIPS32-OM1: lw v1,[[MEM]] |
| 595 | 614 |
| 596 define internal i64 @shr64BitSigned(i64 %a, i64 %b) { | 615 define internal i64 @shr64BitSigned(i64 %a, i64 %b) { |
| 597 entry: | 616 entry: |
| 598 %shr = ashr i64 %a, %b | 617 %shr = ashr i64 %a, %b |
| 599 ret i64 %shr | 618 ret i64 %shr |
| 600 } | 619 } |
| 601 ; CHECK-LABEL: shr64BitSigned | 620 ; CHECK-LABEL: shr64BitSigned |
| 602 ; CHECK: shrd | 621 ; CHECK: shrd |
| 603 ; CHECK: sar | 622 ; CHECK: sar |
| 604 ; CHECK: test {{.*}},0x20 | 623 ; CHECK: test {{.*}},0x20 |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 879 ; CHECK-NEXT: movsx eax,ax | 898 ; CHECK-NEXT: movsx eax,ax |
| 880 ; | 899 ; |
| 881 ; OPTM1-LABEL: trunc64To16Signed | 900 ; OPTM1-LABEL: trunc64To16Signed |
| 882 ; OPTM1: mov ax,WORD PTR [esp+ | 901 ; OPTM1: mov ax,WORD PTR [esp+ |
| 883 ; OPTM1: movsx eax, | 902 ; OPTM1: movsx eax, |
| 884 | 903 |
| 885 ; ARM32-LABEL: trunc64To16Signed | 904 ; ARM32-LABEL: trunc64To16Signed |
| 886 ; ARM32: sxth r0, r0 | 905 ; ARM32: sxth r0, r0 |
| 887 | 906 |
| 888 ; MIPS32-LABEL: trunc64To16Signed | 907 ; MIPS32-LABEL: trunc64To16Signed |
| 889 ; MIPS32: sll a0,a0,0x10 | 908 ; MIPS32-O2: sll [[T1:.*]],a0,0x10 |
| 890 ; MIPS32: sra a0,a0,0x10 | 909 ; MIPS32-O2: sra [[T2:.*]],[[T1]],0x10 |
| 891 ; MIPS32: move v0,a0 | 910 ; MIPS32-O2: move v0,[[T2]] |
| 911 ; MIPS32-OM1: sll [[T1:.*]],{{.*}},0x10 |
| 912 ; MIPS32-OM1: sra [[T2:.*]],[[T1]],0x10 |
| 913 ; MIPS32-OM1: sw [[T2]],[[MEM:.*]] |
| 914 ; MIPS32-OM1: lw v0,[[MEM]] |
| 892 | 915 |
| 893 define internal i32 @trunc64To8Signed(i64 %a) { | 916 define internal i32 @trunc64To8Signed(i64 %a) { |
| 894 entry: | 917 entry: |
| 895 %conv = trunc i64 %a to i8 | 918 %conv = trunc i64 %a to i8 |
| 896 %conv.ret_ext = sext i8 %conv to i32 | 919 %conv.ret_ext = sext i8 %conv to i32 |
| 897 ret i32 %conv.ret_ext | 920 ret i32 %conv.ret_ext |
| 898 } | 921 } |
| 899 ; CHECK-LABEL: trunc64To8Signed | 922 ; CHECK-LABEL: trunc64To8Signed |
| 900 ; CHECK: mov eax,DWORD PTR [esp+0x4] | 923 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
| 901 ; CHECK-NEXT: movsx eax,al | 924 ; CHECK-NEXT: movsx eax,al |
| 902 ; | 925 ; |
| 903 ; OPTM1-LABEL: trunc64To8Signed | 926 ; OPTM1-LABEL: trunc64To8Signed |
| 904 ; OPTM1: mov eax,DWORD PTR [esp+ | 927 ; OPTM1: mov eax,DWORD PTR [esp+ |
| 905 ; OPTM1: movsx eax, | 928 ; OPTM1: movsx eax, |
| 906 | 929 |
| 907 ; ARM32-LABEL: trunc64To8Signed | 930 ; ARM32-LABEL: trunc64To8Signed |
| 908 ; ARM32: sxtb r0, r0 | 931 ; ARM32: sxtb r0, r0 |
| 909 | 932 |
| 910 ; MIPS32-LABEL: trunc64To8Signed | 933 ; MIPS32-LABEL: trunc64To8Signed |
| 911 ; MIPS32: sll a0,a0,0x18 | 934 ; MIPS32-O2: sll [[T1:.*]],a0,0x18 |
| 912 ; MIPS32: sra a0,a0,0x18 | 935 ; MIPS32-O2: sra [[T2:.*]],[[T1]],0x18 |
| 913 ; MIPS32: move v0,a0 | 936 ; MIPS32-O2: move v0,[[T2]] |
| 937 ; MIPS32-OM1: sll [[T1:.*]],{{.*}},0x18 |
| 938 ; MIPS32-OM1: sra [[T2:.*]],[[T1]],0x18 |
| 939 ; MIPS32-OM1: sw [[T2]],[[MEM:.*]] |
| 940 ; MIPS32-OM1: lw v0,[[MEM]] |
| 914 | 941 |
| 915 define internal i32 @trunc64To32SignedConst() { | 942 define internal i32 @trunc64To32SignedConst() { |
| 916 entry: | 943 entry: |
| 917 %conv = trunc i64 12345678901234 to i32 | 944 %conv = trunc i64 12345678901234 to i32 |
| 918 ret i32 %conv | 945 ret i32 %conv |
| 919 } | 946 } |
| 920 ; CHECK-LABEL: trunc64To32SignedConst | 947 ; CHECK-LABEL: trunc64To32SignedConst |
| 921 ; CHECK: mov eax,0x73ce2ff2 | 948 ; CHECK: mov eax,0x73ce2ff2 |
| 922 ; | 949 ; |
| 923 ; OPTM1-LABEL: trunc64To32SignedConst | 950 ; OPTM1-LABEL: trunc64To32SignedConst |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 984 ; CHECK-NEXT: movzx eax,ax | 1011 ; CHECK-NEXT: movzx eax,ax |
| 985 ; | 1012 ; |
| 986 ; OPTM1-LABEL: trunc64To16Unsigned | 1013 ; OPTM1-LABEL: trunc64To16Unsigned |
| 987 ; OPTM1: mov ax,WORD PTR [esp+ | 1014 ; OPTM1: mov ax,WORD PTR [esp+ |
| 988 ; OPTM1: movzx eax, | 1015 ; OPTM1: movzx eax, |
| 989 | 1016 |
| 990 ; ARM32-LABEL: trunc64To16Unsigned | 1017 ; ARM32-LABEL: trunc64To16Unsigned |
| 991 ; ARM32: uxth | 1018 ; ARM32: uxth |
| 992 | 1019 |
| 993 ; MIPS32-LABEL: trunc64To16Unsigned | 1020 ; MIPS32-LABEL: trunc64To16Unsigned |
| 994 ; MIPS32: andi a0,a0,0xffff | 1021 ; MIPS32-O2: andi [[T1:.*]],a0,0xffff |
| 995 ; MIPS32: move v0,a0 | 1022 ; MIPS32-O2: move v0,[[T1]] |
| 1023 ; MIPS32-OM1: andi [[T1:.*]],{{.*}},0xffff |
| 1024 ; MIPS32-OM1: sw [[T1]],[[MEM:.*]] |
| 1025 ; MIPS32-OM1: lw v0,[[MEM]] |
| 996 | 1026 |
| 997 define internal i32 @trunc64To8Unsigned(i64 %a) { | 1027 define internal i32 @trunc64To8Unsigned(i64 %a) { |
| 998 entry: | 1028 entry: |
| 999 %conv = trunc i64 %a to i8 | 1029 %conv = trunc i64 %a to i8 |
| 1000 %conv.ret_ext = zext i8 %conv to i32 | 1030 %conv.ret_ext = zext i8 %conv to i32 |
| 1001 ret i32 %conv.ret_ext | 1031 ret i32 %conv.ret_ext |
| 1002 } | 1032 } |
| 1003 ; CHECK-LABEL: trunc64To8Unsigned | 1033 ; CHECK-LABEL: trunc64To8Unsigned |
| 1004 ; CHECK: mov eax,DWORD PTR [esp+0x4] | 1034 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
| 1005 ; CHECK-NEXT: movzx eax,al | 1035 ; CHECK-NEXT: movzx eax,al |
| 1006 ; | 1036 ; |
| 1007 ; OPTM1-LABEL: trunc64To8Unsigned | 1037 ; OPTM1-LABEL: trunc64To8Unsigned |
| 1008 ; OPTM1: mov eax,DWORD PTR [esp+ | 1038 ; OPTM1: mov eax,DWORD PTR [esp+ |
| 1009 ; OPTM1: movzx eax, | 1039 ; OPTM1: movzx eax, |
| 1010 | 1040 |
| 1011 ; ARM32-LABEL: trunc64To8Unsigned | 1041 ; ARM32-LABEL: trunc64To8Unsigned |
| 1012 ; ARM32: uxtb | 1042 ; ARM32: uxtb |
| 1013 | 1043 |
| 1014 ; MIPS32-LABEL: trunc64To8Unsigned | 1044 ; MIPS32-LABEL: trunc64To8Unsigned |
| 1015 ; MIPS32: andi a0,a0,0xff | 1045 ; MIPS32-O2: andi [[T1:.*]],a0,0xff |
| 1016 ; MIPS32: move v0,a0 | 1046 ; MIPS32-O2: move v0,[[T1]] |
| 1047 ; MIPS32-OM1: andi [[T1:.*]],{{.*}},0xff |
| 1048 ; MIPS32-OM1: sw [[T1]],[[MEM:.*]] |
| 1049 ; MIPS32-OM1: lw v0,[[MEM]] |
| 1017 | 1050 |
| 1018 define internal i32 @trunc64To1(i64 %a) { | 1051 define internal i32 @trunc64To1(i64 %a) { |
| 1019 entry: | 1052 entry: |
| 1020 ; %tobool = icmp ne i64 %a, 0 | 1053 ; %tobool = icmp ne i64 %a, 0 |
| 1021 %tobool = trunc i64 %a to i1 | 1054 %tobool = trunc i64 %a to i1 |
| 1022 %tobool.ret_ext = zext i1 %tobool to i32 | 1055 %tobool.ret_ext = zext i1 %tobool to i32 |
| 1023 ret i32 %tobool.ret_ext | 1056 ret i32 %tobool.ret_ext |
| 1024 } | 1057 } |
| 1025 ; CHECK-LABEL: trunc64To1 | 1058 ; CHECK-LABEL: trunc64To1 |
| 1026 ; CHECK: mov eax,DWORD PTR [esp+0x4] | 1059 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
| 1027 ; CHECK: and al,0x1 | 1060 ; CHECK: and al,0x1 |
| 1028 ; CHECK-NOT: and eax,0x1 | 1061 ; CHECK-NOT: and eax,0x1 |
| 1029 ; | 1062 ; |
| 1030 ; OPTM1-LABEL: trunc64To1 | 1063 ; OPTM1-LABEL: trunc64To1 |
| 1031 ; OPTM1: mov eax,DWORD PTR [esp+ | 1064 ; OPTM1: mov eax,DWORD PTR [esp+ |
| 1032 ; OPTM1: and al,0x1 | 1065 ; OPTM1: and al,0x1 |
| 1033 ; OPTM1-NOT: and eax,0x1 | 1066 ; OPTM1-NOT: and eax,0x1 |
| 1034 | 1067 |
| 1035 ; ARM32-LABEL: trunc64To1 | 1068 ; ARM32-LABEL: trunc64To1 |
| 1036 ; ARM32-OM1: and r0, r0, #1 | 1069 ; ARM32-OM1: and r0, r0, #1 |
| 1037 ; ARM32-O2: and r0, r0, #1 | 1070 ; ARM32-O2: and r0, r0, #1 |
| 1038 | 1071 |
| 1039 ; MIPS32-LABEL: trunc64To1 | 1072 ; MIPS32-LABEL: trunc64To1 |
| 1040 ; MIPS32: andi {{.*}},a0,0x1 | 1073 ; MIPS32-O2: andi [[T1:.*]],a0,0x1 |
| 1041 ; MIPS32: move v0,a0 | 1074 ; MIPS32-O2: move v0,[[T1]] |
| 1075 ; MIPS32-OM1: andi [[T1:.*]],{{.*}},0x1 |
| 1076 ; MIPS32-OM1: sw [[T1]],[[MEM:.*]] |
| 1077 ; MIPS32-OM1: lw v0,[[MEM]] |
| 1042 | 1078 |
| 1043 define internal i64 @sext32To64(i32 %a) { | 1079 define internal i64 @sext32To64(i32 %a) { |
| 1044 entry: | 1080 entry: |
| 1045 %conv = sext i32 %a to i64 | 1081 %conv = sext i32 %a to i64 |
| 1046 ret i64 %conv | 1082 ret i64 %conv |
| 1047 } | 1083 } |
| 1048 ; CHECK-LABEL: sext32To64 | 1084 ; CHECK-LABEL: sext32To64 |
| 1049 ; CHECK: mov | 1085 ; CHECK: mov |
| 1050 ; CHECK: sar {{.*}},0x1f | 1086 ; CHECK: sar {{.*}},0x1f |
| 1051 ; | 1087 ; |
| 1052 ; OPTM1-LABEL: sext32To64 | 1088 ; OPTM1-LABEL: sext32To64 |
| 1053 ; OPTM1: mov | 1089 ; OPTM1: mov |
| 1054 ; OPTM1: sar {{.*}},0x1f | 1090 ; OPTM1: sar {{.*}},0x1f |
| 1055 | 1091 |
| 1056 ; ARM32-LABEL: sext32To64 | 1092 ; ARM32-LABEL: sext32To64 |
| 1057 ; ARM32: asr {{.*}}, #31 | 1093 ; ARM32: asr {{.*}}, #31 |
| 1058 | 1094 |
| 1059 ; MIPS32-LABEL: sext32To64 | 1095 ; MIPS32-LABEL: sext32To64 |
| 1060 ; MIPS32-LABEL: sra {{.*}},a0,0x1f | 1096 ; MIPS32: sra [[T_HI:.*]],[[T_LO:.*]],0x1f |
| 1061 ; MIPS32-LABEL: move v1,v0 | 1097 ; MIPS32-O2: move v1,[[T_HI]] |
| 1062 ; MIPS32-LABEL: move v0,a0 | 1098 ; MIPS32-O2: move v0,[[T_LO]] |
| 1099 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]] |
| 1100 ; MIPS32-OM1: sw [[T_LO]],[[MEM_LO:.*]] |
| 1101 ; MIPS32-OM1: lw v0,[[MEM_LO]] |
| 1102 ; MIPS32-OM1: lw v1,[[MEM_HI]] |
| 1063 | 1103 |
| 1064 define internal i64 @sext16To64(i32 %a) { | 1104 define internal i64 @sext16To64(i32 %a) { |
| 1065 entry: | 1105 entry: |
| 1066 %a.arg_trunc = trunc i32 %a to i16 | 1106 %a.arg_trunc = trunc i32 %a to i16 |
| 1067 %conv = sext i16 %a.arg_trunc to i64 | 1107 %conv = sext i16 %a.arg_trunc to i64 |
| 1068 ret i64 %conv | 1108 ret i64 %conv |
| 1069 } | 1109 } |
| 1070 ; CHECK-LABEL: sext16To64 | 1110 ; CHECK-LABEL: sext16To64 |
| 1071 ; CHECK: movsx | 1111 ; CHECK: movsx |
| 1072 ; CHECK: sar {{.*}},0x1f | 1112 ; CHECK: sar {{.*}},0x1f |
| 1073 ; | 1113 ; |
| 1074 ; OPTM1-LABEL: sext16To64 | 1114 ; OPTM1-LABEL: sext16To64 |
| 1075 ; OPTM1: movsx | 1115 ; OPTM1: movsx |
| 1076 ; OPTM1: sar {{.*}},0x1f | 1116 ; OPTM1: sar {{.*}},0x1f |
| 1077 | 1117 |
| 1078 ; ARM32-LABEL: sext16To64 | 1118 ; ARM32-LABEL: sext16To64 |
| 1079 ; ARM32: sxth | 1119 ; ARM32: sxth |
| 1080 ; ARM32: asr {{.*}}, #31 | 1120 ; ARM32: asr {{.*}}, #31 |
| 1081 | 1121 |
| 1082 ; MIPS32-LABEL: sext16To64 | 1122 ; MIPS32-LABEL: sext16To64 |
| 1083 ; MIPS32: sll {{.*}},{{.*}},0x10 | 1123 ; MIPS32: sll [[T1_LO:.*]],{{.*}},0x10 |
| 1084 ; MIPS32: sra {{.*}},{{.*}},0x10 | 1124 ; MIPS32: sra [[T2_LO:.*]],[[T1_LO]],0x10 |
| 1085 ; MIPS32: sra {{.*}},{{.*}},0x1f | 1125 ; MIPS32: sra [[T_HI:.*]],[[T2_LO]],0x1f |
| 1086 ; MIPS32: move v1,v0 | 1126 ; MIPS32-O2: move v1,[[T_HI]] |
| 1087 ; MIPS32: move v0,a0 | 1127 ; MIPS32-O2: move v0,[[T2_LO]] |
| 1128 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]] |
| 1129 ; MIPS32-OM1: sw [[T2_LO]],[[MEM_LO:.*]] |
| 1130 ; MIPS32-OM1: lw v0,[[MEM_LO]] |
| 1131 ; MIPS32-OM1: lw v1,[[MEM_HI]] |
| 1132 |
| 1088 | 1133 |
| 1089 define internal i64 @sext8To64(i32 %a) { | 1134 define internal i64 @sext8To64(i32 %a) { |
| 1090 entry: | 1135 entry: |
| 1091 %a.arg_trunc = trunc i32 %a to i8 | 1136 %a.arg_trunc = trunc i32 %a to i8 |
| 1092 %conv = sext i8 %a.arg_trunc to i64 | 1137 %conv = sext i8 %a.arg_trunc to i64 |
| 1093 ret i64 %conv | 1138 ret i64 %conv |
| 1094 } | 1139 } |
| 1095 ; CHECK-LABEL: sext8To64 | 1140 ; CHECK-LABEL: sext8To64 |
| 1096 ; CHECK: movsx | 1141 ; CHECK: movsx |
| 1097 ; CHECK: sar {{.*}},0x1f | 1142 ; CHECK: sar {{.*}},0x1f |
| 1098 ; | 1143 ; |
| 1099 ; OPTM1-LABEL: sext8To64 | 1144 ; OPTM1-LABEL: sext8To64 |
| 1100 ; OPTM1: movsx | 1145 ; OPTM1: movsx |
| 1101 ; OPTM1: sar {{.*}},0x1f | 1146 ; OPTM1: sar {{.*}},0x1f |
| 1102 | 1147 |
| 1103 ; ARM32-LABEL: sext8To64 | 1148 ; ARM32-LABEL: sext8To64 |
| 1104 ; ARM32: sxtb | 1149 ; ARM32: sxtb |
| 1105 ; ARM32: asr {{.*}}, #31 | 1150 ; ARM32: asr {{.*}}, #31 |
| 1106 | 1151 |
| 1107 ; MIPS32-LABEL: sext8To64 | 1152 ; MIPS32-LABEL: sext8To64 |
| 1108 ; MIPS32: sll {{.*}},a0,0x18 | 1153 ; MIPS32: sll [[T1_LO:.*]],{{.*}},0x18 |
| 1109 ; MIPS32: sra {{.*}},{{.*}},0x18 | 1154 ; MIPS32: sra [[T2_LO:.*]],[[T1_LO]],0x18 |
| 1110 ; MIPS32: sra {{.*}},{{.*}},0x1f | 1155 ; MIPS32: sra [[T_HI:.*]],[[T2_LO]],0x1f |
| 1111 ; MIPS32: move v1,v0 | 1156 ; MIPS32-O2: move v1,[[T_HI]] |
| 1112 ; MIPS32: move v0,a0 | 1157 ; MIPS32-O2: move v0,[[T2_LO]] |
| 1158 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]] |
| 1159 ; MIPS32-OM1: sw [[T2_LO]],[[MEM_LO:.*]] |
| 1160 ; MIPS32-OM1: lw v0,[[MEM_LO]] |
| 1161 ; MIPS32-OM1: lw v1,[[MEM_HI]] |
| 1113 | 1162 |
| 1114 define internal i64 @sext1To64(i32 %a) { | 1163 define internal i64 @sext1To64(i32 %a) { |
| 1115 entry: | 1164 entry: |
| 1116 %a.arg_trunc = trunc i32 %a to i1 | 1165 %a.arg_trunc = trunc i32 %a to i1 |
| 1117 %conv = sext i1 %a.arg_trunc to i64 | 1166 %conv = sext i1 %a.arg_trunc to i64 |
| 1118 ret i64 %conv | 1167 ret i64 %conv |
| 1119 } | 1168 } |
| 1120 ; CHECK-LABEL: sext1To64 | 1169 ; CHECK-LABEL: sext1To64 |
| 1121 ; CHECK: mov | 1170 ; CHECK: mov |
| 1122 ; CHECK: shl {{.*}},0x1f | 1171 ; CHECK: shl {{.*}},0x1f |
| 1123 ; CHECK: sar {{.*}},0x1f | 1172 ; CHECK: sar {{.*}},0x1f |
| 1124 ; | 1173 ; |
| 1125 ; OPTM1-LABEL: sext1To64 | 1174 ; OPTM1-LABEL: sext1To64 |
| 1126 ; OPTM1: mov | 1175 ; OPTM1: mov |
| 1127 ; OPTM1: shl {{.*}},0x1f | 1176 ; OPTM1: shl {{.*}},0x1f |
| 1128 ; OPTM1: sar {{.*}},0x1f | 1177 ; OPTM1: sar {{.*}},0x1f |
| 1129 | 1178 |
| 1130 ; ARM32-LABEL: sext1To64 | 1179 ; ARM32-LABEL: sext1To64 |
| 1131 ; ARM32: mov {{.*}}, #0 | 1180 ; ARM32: mov {{.*}}, #0 |
| 1132 ; ARM32: tst {{.*}}, #1 | 1181 ; ARM32: tst {{.*}}, #1 |
| 1133 ; ARM32: mvn {{.*}}, #0 | 1182 ; ARM32: mvn {{.*}}, #0 |
| 1134 ; ARM32: movne | 1183 ; ARM32: movne |
| 1135 | 1184 |
| 1136 ; MIPS32-LABEL: sext1To64 | 1185 ; MIPS32-LABEL: sext1To64 |
| 1137 ; MIPS32: sll {{.*}},a0,0x1f | 1186 ; MIPS32: sll [[T1:.*]],{{.*}},0x1f |
| 1138 ; MIPS32: sra {{.*}},{{.*}},0x1f | 1187 ; MIPS32: sra [[T2:.*]],[[T1]],0x1f |
| 1139 ; MIPS32: move v1,a0 | 1188 ; MIPS32-O2: move v1,[[T2]] |
| 1140 ; MIPS32: move v0,a0 | 1189 ; MIPS32-O2: move v0,[[T2]] |
| 1190 ; MIPS32-OM1: sw [[T2]],[[MEM_HI:.*]] |
| 1191 ; MIPS32-OM1: sw [[T2]],[[MEM_LO:.*]] |
| 1192 ; MIPS32-OM1: lw v0,[[MEM_LO]] |
| 1193 ; MIPS32-OM1: lw v1,[[MEM_HI]] |
| 1141 | 1194 |
| 1142 define internal i64 @zext32To64(i32 %a) { | 1195 define internal i64 @zext32To64(i32 %a) { |
| 1143 entry: | 1196 entry: |
| 1144 %conv = zext i32 %a to i64 | 1197 %conv = zext i32 %a to i64 |
| 1145 ret i64 %conv | 1198 ret i64 %conv |
| 1146 } | 1199 } |
| 1147 ; CHECK-LABEL: zext32To64 | 1200 ; CHECK-LABEL: zext32To64 |
| 1148 ; CHECK: mov | 1201 ; CHECK: mov |
| 1149 ; CHECK: mov {{.*}},0x0 | 1202 ; CHECK: mov {{.*}},0x0 |
| 1150 ; | 1203 ; |
| 1151 ; OPTM1-LABEL: zext32To64 | 1204 ; OPTM1-LABEL: zext32To64 |
| 1152 ; OPTM1: mov | 1205 ; OPTM1: mov |
| 1153 ; OPTM1: mov {{.*}},0x0 | 1206 ; OPTM1: mov {{.*}},0x0 |
| 1154 | 1207 |
| 1155 ; ARM32-LABEL: zext32To64 | 1208 ; ARM32-LABEL: zext32To64 |
| 1156 ; ARM32: mov {{.*}}, #0 | 1209 ; ARM32: mov {{.*}}, #0 |
| 1157 | 1210 |
| 1158 ; MIPS32-LABEL: zext32To64 | 1211 ; MIPS32-LABEL: zext32To64 |
| 1159 ; MIPS32: li {{.*}},0 | 1212 ; MIPS32: li [[T1:.*]],0 |
| 1160 ; MIPS32: move v1,v0 | 1213 ; MIPS32-O2: move v1,[[T1]] |
| 1161 ; MIPS32: move v0,a0 | 1214 ; MIPS32-O2: move v0,a0 |
| 1215 ; MIPS32-OM1: sw [[T1]],[[MEM_HI:.*]] |
| 1216 ; MIPS32-OM1: lw v1,[[MEM_HI]] |
| 1162 | 1217 |
| 1163 define internal i64 @zext16To64(i32 %a) { | 1218 define internal i64 @zext16To64(i32 %a) { |
| 1164 entry: | 1219 entry: |
| 1165 %a.arg_trunc = trunc i32 %a to i16 | 1220 %a.arg_trunc = trunc i32 %a to i16 |
| 1166 %conv = zext i16 %a.arg_trunc to i64 | 1221 %conv = zext i16 %a.arg_trunc to i64 |
| 1167 ret i64 %conv | 1222 ret i64 %conv |
| 1168 } | 1223 } |
| 1169 ; CHECK-LABEL: zext16To64 | 1224 ; CHECK-LABEL: zext16To64 |
| 1170 ; CHECK: movzx | 1225 ; CHECK: movzx |
| 1171 ; CHECK: mov {{.*}},0x0 | 1226 ; CHECK: mov {{.*}},0x0 |
| 1172 ; | 1227 ; |
| 1173 ; OPTM1-LABEL: zext16To64 | 1228 ; OPTM1-LABEL: zext16To64 |
| 1174 ; OPTM1: movzx | 1229 ; OPTM1: movzx |
| 1175 ; OPTM1: mov {{.*}},0x0 | 1230 ; OPTM1: mov {{.*}},0x0 |
| 1176 | 1231 |
| 1177 ; ARM32-LABEL: zext16To64 | 1232 ; ARM32-LABEL: zext16To64 |
| 1178 ; ARM32: uxth | 1233 ; ARM32: uxth |
| 1179 ; ARM32: mov {{.*}}, #0 | 1234 ; ARM32: mov {{.*}}, #0 |
| 1180 | 1235 |
| 1181 ; MIPS32-LABEL: zext16To64 | 1236 ; MIPS32-LABEL: zext16To64 |
| 1182 ; MIPS32: andi {{.*}},a0,0xffff | 1237 ; MIPS32: andi [[T_LO:.*]],{{.*}},0xffff |
| 1183 ; MIPS32: li {{.*}},0 | 1238 ; MIPS32: li [[T_HI:.*]],0 |
| 1184 ; MIPS32: move v1,v0 | 1239 ; MIPS32-O2: move v1,[[T_HI]] |
| 1185 ; MIPS32: move v0,a0 | 1240 ; MIPS32-O2: move v0,[[T_LO]] |
| 1241 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]] |
| 1242 ; MIPS32-OM1: lw v1,[[MEM_HI]] |
| 1186 | 1243 |
| 1187 define internal i64 @zext8To64(i32 %a) { | 1244 define internal i64 @zext8To64(i32 %a) { |
| 1188 entry: | 1245 entry: |
| 1189 %a.arg_trunc = trunc i32 %a to i8 | 1246 %a.arg_trunc = trunc i32 %a to i8 |
| 1190 %conv = zext i8 %a.arg_trunc to i64 | 1247 %conv = zext i8 %a.arg_trunc to i64 |
| 1191 ret i64 %conv | 1248 ret i64 %conv |
| 1192 } | 1249 } |
| 1193 ; CHECK-LABEL: zext8To64 | 1250 ; CHECK-LABEL: zext8To64 |
| 1194 ; CHECK: movzx | 1251 ; CHECK: movzx |
| 1195 ; CHECK: mov {{.*}},0x0 | 1252 ; CHECK: mov {{.*}},0x0 |
| 1196 ; | 1253 ; |
| 1197 ; OPTM1-LABEL: zext8To64 | 1254 ; OPTM1-LABEL: zext8To64 |
| 1198 ; OPTM1: movzx | 1255 ; OPTM1: movzx |
| 1199 ; OPTM1: mov {{.*}},0x0 | 1256 ; OPTM1: mov {{.*}},0x0 |
| 1200 | 1257 |
| 1201 ; ARM32-LABEL: zext8To64 | 1258 ; ARM32-LABEL: zext8To64 |
| 1202 ; ARM32: uxtb | 1259 ; ARM32: uxtb |
| 1203 ; ARM32: mov {{.*}}, #0 | 1260 ; ARM32: mov {{.*}}, #0 |
| 1204 | 1261 |
| 1205 ; MIPS32-LABEL: zext8To64 | 1262 ; MIPS32-LABEL: zext8To64 |
| 1206 ; MIPS32: andi {{.*}},a0,0xff | 1263 ; MIPS32: andi [[T_LO:.*]],{{.*}},0xff |
| 1207 ; MIPS32: li {{.*}},0 | 1264 ; MIPS32: li [[T_HI:.*]],0 |
| 1208 ; MIPS32: move v1,v0 | 1265 ; MIPS32-O2: move v1,[[T_HI]] |
| 1209 ; MIPS32: move v0,a0 | 1266 ; MIPS32-O2: move v0,[[T_LO]] |
| 1267 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]] |
| 1268 ; MIPS32-OM1: lw v1,[[MEM_HI]] |
| 1210 | 1269 |
| 1211 define internal i64 @zext1To64(i32 %a) { | 1270 define internal i64 @zext1To64(i32 %a) { |
| 1212 entry: | 1271 entry: |
| 1213 %a.arg_trunc = trunc i32 %a to i1 | 1272 %a.arg_trunc = trunc i32 %a to i1 |
| 1214 %conv = zext i1 %a.arg_trunc to i64 | 1273 %conv = zext i1 %a.arg_trunc to i64 |
| 1215 ret i64 %conv | 1274 ret i64 %conv |
| 1216 } | 1275 } |
| 1217 ; CHECK-LABEL: zext1To64 | 1276 ; CHECK-LABEL: zext1To64 |
| 1218 ; CHECK: and {{.*}},0x1 | 1277 ; CHECK: and {{.*}},0x1 |
| 1219 ; CHECK: mov {{.*}},0x0 | 1278 ; CHECK: mov {{.*}},0x0 |
| 1220 ; | 1279 ; |
| 1221 ; OPTM1-LABEL: zext1To64 | 1280 ; OPTM1-LABEL: zext1To64 |
| 1222 ; OPTM1: and {{.*}},0x1 | 1281 ; OPTM1: and {{.*}},0x1 |
| 1223 ; OPTM1: mov {{.*}},0x0 | 1282 ; OPTM1: mov {{.*}},0x0 |
| 1224 | 1283 |
| 1225 ; ARM32-LABEL: zext1To64 | 1284 ; ARM32-LABEL: zext1To64 |
| 1226 ; ARM32: and {{.*}}, #1 | 1285 ; ARM32: and {{.*}}, #1 |
| 1227 ; ARM32: mov {{.*}}, #0 | 1286 ; ARM32: mov {{.*}}, #0 |
| 1228 ; ARM32: bx | 1287 ; ARM32: bx |
| 1229 | 1288 |
| 1230 ; MIPS32-LABEL: zext1To64 | 1289 ; MIPS32-LABEL: zext1To64 |
| 1231 ; MIPS32: andi {{.*}},a0,0x1 | 1290 ; MIPS32: andi [[T_LO:.*]],{{.*}},0x1 |
| 1232 ; MIPS32: li {{.*}},0 | 1291 ; MIPS32: li [[T_HI:.*]],0 |
| 1233 ; MIPS32: move v1,v0 | 1292 ; MIPS32-O2: move v1,[[T_HI]] |
| 1234 ; MIPS32: move v0,a0 | 1293 ; MIPS32-O2: move v0,[[T_LO]] |
| 1294 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]] |
| 1295 ; MIPS32-OM1: lw v1,[[MEM_HI]] |
| 1235 | 1296 |
| 1236 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { | 1297 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { |
| 1237 entry: | 1298 entry: |
| 1238 %cmp = icmp eq i64 %a, %b | 1299 %cmp = icmp eq i64 %a, %b |
| 1239 br i1 %cmp, label %if.then, label %if.end | 1300 br i1 %cmp, label %if.then, label %if.end |
| 1240 | 1301 |
| 1241 if.then: ; preds = %entry | 1302 if.then: ; preds = %entry |
| 1242 call void @func() | 1303 call void @func() |
| 1243 br label %if.end | 1304 br label %if.end |
| 1244 | 1305 |
| (...skipping 984 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2229 %s = lshr i64 %a, 40 | 2290 %s = lshr i64 %a, 40 |
| 2230 %t = trunc i64 %s to i32 | 2291 %t = trunc i64 %s to i32 |
| 2231 %r = sub i32 %t, 1 | 2292 %r = sub i32 %t, 1 |
| 2232 ret i32 %r | 2293 ret i32 %r |
| 2233 ; ARM32-LABEL: subOneToUpperAfterShift | 2294 ; ARM32-LABEL: subOneToUpperAfterShift |
| 2234 ; ARM32: subs | 2295 ; ARM32: subs |
| 2235 ; ARM32: sbc | 2296 ; ARM32: sbc |
| 2236 ; ARM32: lsr | 2297 ; ARM32: lsr |
| 2237 ; ARM32: sub | 2298 ; ARM32: sub |
| 2238 } | 2299 } |
| OLD | NEW |