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,20(sp) | |
Jim Stichnoth
2016/10/28 17:42:07
You may want to reconsider whether to use hard-cod
Stefan Maksimovic
2016/10/31 10:33:08
Done.
| |
124 ; MIPS32-O2: sw a2,16(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,20(sp) | |
130 ; MIPS32-O2: sw s2,16(sp) | |
131 ; MIPS32-O2: lw a0,68(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,20(sp) | |
138 ; MIPS32-O2: sw s6,16(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]],20(sp) | |
194 ; MIPS32-O2: sw [[REG2]],16(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 |