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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 ; ARM32: {{mov|ldr}} r1 | 113 ; ARM32: {{mov|ldr}} r1 |
114 ; ARM32: mov r2, #123 | 114 ; ARM32: mov r2, #123 |
115 ; ARM32: bl {{.*}} ignore64BitArgNoInline | 115 ; ARM32: bl {{.*}} ignore64BitArgNoInline |
116 ; ARM32: str {{.*}}, [sp] | 116 ; ARM32: str {{.*}}, [sp] |
117 ; ARM32: {{mov|ldr}} r0 | 117 ; ARM32: {{mov|ldr}} r0 |
118 ; ARM32: {{mov|ldr}} r1 | 118 ; ARM32: {{mov|ldr}} r1 |
119 ; ARM32: mov r2, #123 | 119 ; ARM32: mov r2, #123 |
120 ; ARM32: bl {{.*}} ignore64BitArgNoInline | 120 ; ARM32: bl {{.*}} ignore64BitArgNoInline |
121 | 121 |
122 ; MIPS32-LABEL: pass64BitArg | 122 ; MIPS32-LABEL: pass64BitArg |
| 123 ; MIPS32-O2: sw a3,{{.*}}(sp) |
| 124 ; MIPS32-O2: sw a2,{{.*}}(sp) |
| 125 ; MIPS32-O2: li a2,123 |
| 126 ; MIPS32-O2: jal {{.*}} ignore64BitArgNoInline |
| 127 ; MIPS32-O2: nop |
| 128 ; MIPS32-O2: move s0,v0 |
| 129 ; MIPS32-O2: sw s3,{{.*}}(sp) |
| 130 ; MIPS32-O2: sw s2,{{.*}}(sp) |
| 131 ; MIPS32-O2: lw a0,{{.*}}(sp) |
| 132 ; MIPS32-O2: move a1,s1 |
| 133 ; MIPS32-O2: li a2,123 |
| 134 ; MIPS32-O2: jal {{.*}} ignore64BitArgNoInline |
| 135 ; MIPS32-O2: nop |
| 136 ; MIPS32-O2: move s1,v0 |
| 137 ; MIPS32-O2: sw s7,{{.*}}(sp) |
| 138 ; MIPS32-O2: sw s6,{{.*}}(sp) |
| 139 ; MIPS32-O2: move a0,s4 |
| 140 ; MIPS32-O2: move a1,s5 |
| 141 ; MIPS32-O2: li a2,123 |
| 142 ; MIPS32-O2: jal {{.*}} ignore64BitArgNoInline |
| 143 ; MIPS32-O2: nop |
123 | 144 |
124 | 145 |
125 declare i32 @ignore64BitArgNoInline(i64, i32, i64) | 146 declare i32 @ignore64BitArgNoInline(i64, i32, i64) |
126 | 147 |
127 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { | 148 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { |
128 entry: | 149 entry: |
129 %call = call i32 @ignore64BitArgNoInline(i64 %b, i32 123, i64 -240105309230672
5256) | 150 %call = call i32 @ignore64BitArgNoInline(i64 %b, i32 123, i64 -240105309230672
5256) |
130 ret i32 %call | 151 ret i32 %call |
131 } | 152 } |
132 ; CHECK-LABEL: pass64BitConstArg | 153 ; CHECK-LABEL: pass64BitConstArg |
(...skipping 24 matching lines...) Expand all Loading... |
157 ; ARM32: movt [[REG1]], {{.*}} ; 0xdead | 178 ; ARM32: movt [[REG1]], {{.*}} ; 0xdead |
158 ; ARM32: movw [[REG2:r.*]], {{.*}} ; 0x5678 | 179 ; ARM32: movw [[REG2:r.*]], {{.*}} ; 0x5678 |
159 ; ARM32: movt [[REG2]], {{.*}} ; 0x1234 | 180 ; ARM32: movt [[REG2]], {{.*}} ; 0x1234 |
160 ; ARM32: str [[REG1]], [sp, #4] | 181 ; ARM32: str [[REG1]], [sp, #4] |
161 ; ARM32: str [[REG2]], [sp] | 182 ; ARM32: str [[REG2]], [sp] |
162 ; ARM32: {{mov|ldr}} r0 | 183 ; ARM32: {{mov|ldr}} r0 |
163 ; ARM32: {{mov|ldr}} r1 | 184 ; ARM32: {{mov|ldr}} r1 |
164 ; ARM32: mov r2, #123 | 185 ; ARM32: mov r2, #123 |
165 ; ARM32: bl {{.*}} ignore64BitArgNoInline | 186 ; ARM32: bl {{.*}} ignore64BitArgNoInline |
166 | 187 |
| 188 ; MIPS32-LABEL: pass64BitConstArg |
| 189 ; MIPS32-O2: lui [[REG:.*]],0xdead |
| 190 ; MIPS32-O2: ori [[REG1:.*]],[[REG]],0xbeef |
| 191 ; MIPS32-O2: lui [[REG:.*]],0x1234 |
| 192 ; MIPS32-O2: ori [[REG2:.*]],[[REG]],0x5678 |
| 193 ; MIPS32-O2: sw [[REG1]],{{.*}}(sp) |
| 194 ; MIPS32-O2: sw [[REG2]],{{.*}}(sp) |
| 195 ; MIPS32-O2: move a0,a2 |
| 196 ; MIPS32-O2: move a1,a3 |
| 197 ; MIPS32-O2: li a2,123 |
| 198 ; MIPS32-O2: jal {{.*}} ignore64BitArgNoInline |
| 199 |
167 define internal i32 @pass64BitUndefArg() { | 200 define internal i32 @pass64BitUndefArg() { |
168 entry: | 201 entry: |
169 %call = call i32 @ignore64BitArgNoInline(i64 0, i32 123, i64 undef) | 202 %call = call i32 @ignore64BitArgNoInline(i64 0, i32 123, i64 undef) |
170 ret i32 %call | 203 ret i32 %call |
171 } | 204 } |
172 ; CHECK-LABEL: pass64BitUndefArg | 205 ; CHECK-LABEL: pass64BitUndefArg |
173 ; CHECK: sub esp | 206 ; CHECK: sub esp |
174 ; CHECK: mov DWORD PTR{{.*}},0x7b | 207 ; CHECK: mov DWORD PTR{{.*}},0x7b |
175 ; CHECK: mov DWORD PTR{{.*}},0x0 | 208 ; CHECK: mov DWORD PTR{{.*}},0x0 |
176 ; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline | 209 ; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 ; | 592 ; |
560 ; OPTM1-LABEL: shl64BitSignedTrunc | 593 ; OPTM1-LABEL: shl64BitSignedTrunc |
561 ; OPTM1: shld | 594 ; OPTM1: shld |
562 ; OPTM1: shl e | 595 ; OPTM1: shl e |
563 ; OPTM1: test {{.*}},0x20 | 596 ; OPTM1: test {{.*}},0x20 |
564 ; OPTM1: je | 597 ; OPTM1: je |
565 | 598 |
566 ; ARM32-LABEL: shl64BitSignedTrunc | 599 ; ARM32-LABEL: shl64BitSignedTrunc |
567 ; ARM32: lsl r | 600 ; ARM32: lsl r |
568 | 601 |
| 602 ; MIPS32-LABEL: shl64BitSignedTrunc |
| 603 ; MIPS32-O2: sllv |
| 604 ; MIPS32-O2: andi {{.*}},0x20 |
| 605 ; MIPS32-O2: movn |
| 606 |
569 define internal i64 @shl64BitUnsigned(i64 %a, i64 %b) { | 607 define internal i64 @shl64BitUnsigned(i64 %a, i64 %b) { |
570 entry: | 608 entry: |
571 %shl = shl i64 %a, %b | 609 %shl = shl i64 %a, %b |
572 ret i64 %shl | 610 ret i64 %shl |
573 } | 611 } |
574 ; CHECK-LABEL: shl64BitUnsigned | 612 ; CHECK-LABEL: shl64BitUnsigned |
575 ; CHECK: shld | 613 ; CHECK: shld |
576 ; CHECK: shl e | 614 ; CHECK: shl e |
577 ; CHECK: test {{.*}},0x20 | 615 ; CHECK: test {{.*}},0x20 |
578 ; CHECK: je | 616 ; CHECK: je |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
668 ; OPTM1: sar {{.*}},0x1f | 706 ; OPTM1: sar {{.*}},0x1f |
669 | 707 |
670 ; ARM32-LABEL: shr64BitSignedTrunc | 708 ; ARM32-LABEL: shr64BitSignedTrunc |
671 ; ARM32: lsr | 709 ; ARM32: lsr |
672 ; ARM32: rsb | 710 ; ARM32: rsb |
673 ; ARM32: orr | 711 ; ARM32: orr |
674 ; ARM32: sub | 712 ; ARM32: sub |
675 ; ARM32: cmp | 713 ; ARM32: cmp |
676 ; ARM32: asrge | 714 ; ARM32: asrge |
677 | 715 |
| 716 ; MIPS32-LABEL: shr64BitSignedTrunc |
| 717 ; MIPS32-O2: srlv |
| 718 ; MIPS32-O2: nor |
| 719 ; MIPS32-O2: sll |
| 720 ; MIPS32-O2: sllv |
| 721 ; MIPS32-O2: or |
| 722 ; MIPS32-O2: srav |
| 723 ; MIPS32-O2: andi {{.*}},0x20 |
| 724 ; MIPS32-O2: movn |
| 725 |
678 define internal i64 @shr64BitUnsigned(i64 %a, i64 %b) { | 726 define internal i64 @shr64BitUnsigned(i64 %a, i64 %b) { |
679 entry: | 727 entry: |
680 %shr = lshr i64 %a, %b | 728 %shr = lshr i64 %a, %b |
681 ret i64 %shr | 729 ret i64 %shr |
682 } | 730 } |
683 ; CHECK-LABEL: shr64BitUnsigned | 731 ; CHECK-LABEL: shr64BitUnsigned |
684 ; CHECK: shrd | 732 ; CHECK: shrd |
685 ; CHECK: shr | 733 ; CHECK: shr |
686 ; CHECK: test {{.*}},0x20 | 734 ; CHECK: test {{.*}},0x20 |
687 ; CHECK: je | 735 ; CHECK: je |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 ; OPTM1: je | 780 ; OPTM1: je |
733 | 781 |
734 ; ARM32-LABEL: shr64BitUnsignedTrunc | 782 ; ARM32-LABEL: shr64BitUnsignedTrunc |
735 ; ARM32: lsr | 783 ; ARM32: lsr |
736 ; ARM32: rsb | 784 ; ARM32: rsb |
737 ; ARM32: orr | 785 ; ARM32: orr |
738 ; ARM32: sub | 786 ; ARM32: sub |
739 ; ARM32: cmp | 787 ; ARM32: cmp |
740 ; ARM32: lsrge | 788 ; ARM32: lsrge |
741 | 789 |
| 790 ; MIPS32-LABEL: shr64BitUnsignedTrunc |
| 791 ; MIPS32-O2: srlv |
| 792 ; MIPS32-O2: nor |
| 793 ; MIPS32-O2: sll |
| 794 ; MIPS32-O2: sllv |
| 795 ; MIPS32-O2: or |
| 796 ; MIPS32-O2: srlv |
| 797 ; MIPS32-O2: andi |
| 798 ; MIPS32-O2: movn |
| 799 |
742 define internal i64 @and64BitSigned(i64 %a, i64 %b) { | 800 define internal i64 @and64BitSigned(i64 %a, i64 %b) { |
743 entry: | 801 entry: |
744 %and = and i64 %b, %a | 802 %and = and i64 %b, %a |
745 ret i64 %and | 803 ret i64 %and |
746 } | 804 } |
747 ; CHECK-LABEL: and64BitSigned | 805 ; CHECK-LABEL: and64BitSigned |
748 ; CHECK: and | 806 ; CHECK: and |
749 ; CHECK: and | 807 ; CHECK: and |
750 ; | 808 ; |
751 ; OPTM1-LABEL: and64BitSigned | 809 ; OPTM1-LABEL: and64BitSigned |
(...skipping 1414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2166 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]+0x4] | 2224 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]+0x4] |
2167 ; | 2225 ; |
2168 ; OPTM1-LABEL: load64 | 2226 ; OPTM1-LABEL: load64 |
2169 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}] | 2227 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}] |
2170 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}+0x4] | 2228 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}+0x4] |
2171 | 2229 |
2172 ; ARM32-LABEL: load64 | 2230 ; ARM32-LABEL: load64 |
2173 ; ARM32: ldr r{{.*}}, [r[[REG:.*]]] | 2231 ; ARM32: ldr r{{.*}}, [r[[REG:.*]]] |
2174 ; ARM32: ldr r{{.*}}, [r[[REG]], #4] | 2232 ; ARM32: ldr r{{.*}}, [r[[REG]], #4] |
2175 | 2233 |
| 2234 ; MIPS32-LABEL: load64 |
| 2235 ; MIPS32-O2: lw {{.*}},0([[REG:.*]]) |
| 2236 ; MIPS32-O2: lw [[REG]],4([[REG]]) |
| 2237 |
2176 define internal void @store64(i32 %a, i64 %value) { | 2238 define internal void @store64(i32 %a, i64 %value) { |
2177 entry: | 2239 entry: |
2178 %__2 = inttoptr i32 %a to i64* | 2240 %__2 = inttoptr i32 %a to i64* |
2179 store i64 %value, i64* %__2, align 1 | 2241 store i64 %value, i64* %__2, align 1 |
2180 ret void | 2242 ret void |
2181 } | 2243 } |
2182 ; CHECK-LABEL: store64 | 2244 ; CHECK-LABEL: store64 |
2183 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] | 2245 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] |
2184 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4], | 2246 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4], |
2185 ; CHECK: mov DWORD PTR [e[[REGISTER]]], | 2247 ; CHECK: mov DWORD PTR [e[[REGISTER]]], |
2186 ; | 2248 ; |
2187 ; OPTM1-LABEL: store64 | 2249 ; OPTM1-LABEL: store64 |
2188 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4], | 2250 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4], |
2189 ; OPTM1: mov DWORD PTR [e[[REGISTER]]], | 2251 ; OPTM1: mov DWORD PTR [e[[REGISTER]]], |
2190 | 2252 |
2191 ; ARM32-LABEL: store64 | 2253 ; ARM32-LABEL: store64 |
2192 ; ARM32: str r{{.*}}, [r[[REG:.*]], #4] | 2254 ; ARM32: str r{{.*}}, [r[[REG:.*]], #4] |
2193 ; ARM32: str r{{.*}}, [r[[REG]]] | 2255 ; ARM32: str r{{.*}}, [r[[REG]]] |
2194 | 2256 |
| 2257 ; MIPS32-LABEL: store64 |
| 2258 ; MIPS32-O2: sw {{.*}},4([[REG:.*]]) |
| 2259 ; MIPS32-O2: sw {{.*}},0([[REG]]) |
| 2260 |
2195 define internal void @store64Const(i32 %a) { | 2261 define internal void @store64Const(i32 %a) { |
2196 entry: | 2262 entry: |
2197 %__1 = inttoptr i32 %a to i64* | 2263 %__1 = inttoptr i32 %a to i64* |
2198 store i64 -2401053092306725256, i64* %__1, align 1 | 2264 store i64 -2401053092306725256, i64* %__1, align 1 |
2199 ret void | 2265 ret void |
2200 } | 2266 } |
2201 ; CHECK-LABEL: store64Const | 2267 ; CHECK-LABEL: store64Const |
2202 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] | 2268 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] |
2203 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4],0xdeadbeef | 2269 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4],0xdeadbeef |
2204 ; CHECK: mov DWORD PTR [e[[REGISTER]]],0x12345678 | 2270 ; CHECK: mov DWORD PTR [e[[REGISTER]]],0x12345678 |
2205 ; | 2271 ; |
2206 ; OPTM1-LABEL: store64Const | 2272 ; OPTM1-LABEL: store64Const |
2207 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4],0xdeadbeef | 2273 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4],0xdeadbeef |
2208 ; OPTM1: mov DWORD PTR [e[[REGISTER]]],0x12345678 | 2274 ; OPTM1: mov DWORD PTR [e[[REGISTER]]],0x12345678 |
2209 | 2275 |
2210 ; ARM32-LABEL: store64Const | 2276 ; ARM32-LABEL: store64Const |
2211 ; ARM32: movw [[REG1:.*]], #48879 ; 0xbeef | 2277 ; ARM32: movw [[REG1:.*]], #48879 ; 0xbeef |
2212 ; ARM32: movt [[REG1:.*]], #57005 ; 0xdead | 2278 ; ARM32: movt [[REG1:.*]], #57005 ; 0xdead |
2213 ; ARM32: movw [[REG2:.*]], #22136 ; 0x5678 | 2279 ; ARM32: movw [[REG2:.*]], #22136 ; 0x5678 |
2214 ; ARM32: movt [[REG2:.*]], #4660 ; 0x1234 | 2280 ; ARM32: movt [[REG2:.*]], #4660 ; 0x1234 |
2215 ; ARM32: str [[REG1]], [r[[REG:.*]], #4] | 2281 ; ARM32: str [[REG1]], [r[[REG:.*]], #4] |
2216 ; ARM32: str [[REG2]], [r[[REG]]] | 2282 ; ARM32: str [[REG2]], [r[[REG]]] |
2217 | 2283 |
| 2284 ; MIPS32-LABEL: store64Const |
| 2285 ; MIPS32-O2: lui [[REG1:.*]],0xdead |
| 2286 ; MIPS32-O2: ori [[REG1:.*]],[[REG1]],0xbeef |
| 2287 ; MIPS32-O2: lui [[REG2:.*]],0x1234 |
| 2288 ; MIPS32-O2: ori [[REG2:.*]],[[REG2]],0x5678 |
| 2289 ; MIPS32-O2: sw [[REG1]],4([[REG:.*]]) |
| 2290 ; MIPS32-O2: sw [[REG2]],0([[REG]]) |
| 2291 |
2218 define internal i64 @select64VarVar(i64 %a, i64 %b) { | 2292 define internal i64 @select64VarVar(i64 %a, i64 %b) { |
2219 entry: | 2293 entry: |
2220 %cmp = icmp ult i64 %a, %b | 2294 %cmp = icmp ult i64 %a, %b |
2221 %cond = select i1 %cmp, i64 %a, i64 %b | 2295 %cond = select i1 %cmp, i64 %a, i64 %b |
2222 ret i64 %cond | 2296 ret i64 %cond |
2223 } | 2297 } |
2224 ; CHECK-LABEL: select64VarVar | 2298 ; CHECK-LABEL: select64VarVar |
2225 ; CHECK: mov | 2299 ; CHECK: mov |
2226 ; CHECK: mov | 2300 ; CHECK: mov |
2227 ; CHECK: cmp | 2301 ; CHECK: cmp |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2461 %s = lshr i64 %a, 40 | 2535 %s = lshr i64 %a, 40 |
2462 %t = trunc i64 %s to i32 | 2536 %t = trunc i64 %s to i32 |
2463 %r = sub i32 %t, 1 | 2537 %r = sub i32 %t, 1 |
2464 ret i32 %r | 2538 ret i32 %r |
2465 ; ARM32-LABEL: subOneToUpperAfterShift | 2539 ; ARM32-LABEL: subOneToUpperAfterShift |
2466 ; ARM32: subs | 2540 ; ARM32: subs |
2467 ; ARM32: sbc | 2541 ; ARM32: sbc |
2468 ; ARM32: lsr | 2542 ; ARM32: lsr |
2469 ; ARM32: sub | 2543 ; ARM32: sub |
2470 } | 2544 } |
OLD | NEW |