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: %p2i --filetype=obj --disassemble -i %s --args -O2 \ | 5 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
6 ; RUN: | FileCheck %s | 6 ; RUN: --target x8632 -i %s --args -O2 \ |
7 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \ | 7 ; RUN: | %if --need=target_X8632 --command FileCheck %s |
8 ; RUN: | FileCheck --check-prefix=OPTM1 %s | 8 |
| 9 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
| 10 ; RUN: --target x8632 -i %s --args -Om1 \ |
| 11 ; RUN: | %if --need=target_X8632 --command FileCheck --check-prefix=OPTM1 %s |
| 12 |
| 13 ; TODO(jvoung): Stop skipping unimplemented parts (via --skip-unimplemented) |
| 14 ; once enough infrastructure is in. Also, switch to --filetype=obj |
| 15 ; when possible. |
| 16 ; RUN: %if --need=target_ARM32 --command %p2i --filetype=asm --assemble \ |
| 17 ; RUN: --disassemble --target arm32 -i %s --args -O2 --skip-unimplemented \ |
| 18 ; RUN: | %if --need=target_ARM32 --command FileCheck --check-prefix ARM32 %s |
9 | 19 |
10 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 20 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
11 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 21 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
12 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 | 22 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 |
13 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 | 23 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 |
14 | 24 |
15 define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) { | 25 define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) { |
16 entry: | 26 entry: |
17 ret i32 %b | 27 ret i32 %b |
18 } | 28 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 ret i64 %a | 117 ret i64 %a |
108 } | 118 } |
109 ; CHECK-LABEL: return64BitArg | 119 ; CHECK-LABEL: return64BitArg |
110 ; CHECK: mov {{.*}},DWORD PTR [esp+0x4] | 120 ; CHECK: mov {{.*}},DWORD PTR [esp+0x4] |
111 ; CHECK: mov {{.*}},DWORD PTR [esp+0x8] | 121 ; CHECK: mov {{.*}},DWORD PTR [esp+0x8] |
112 ; | 122 ; |
113 ; OPTM1-LABEL: return64BitArg | 123 ; OPTM1-LABEL: return64BitArg |
114 ; OPTM1: mov {{.*}},DWORD PTR [esp+0x4] | 124 ; OPTM1: mov {{.*}},DWORD PTR [esp+0x4] |
115 ; OPTM1: mov {{.*}},DWORD PTR [esp+0x8] | 125 ; OPTM1: mov {{.*}},DWORD PTR [esp+0x8] |
116 | 126 |
| 127 ; Nothing to do for ARM O2 -- arg and return value are in r0,r1. |
| 128 ; ARM32-LABEL: return64BitArg |
| 129 ; ARM32-NEXT: bx lr |
| 130 |
117 define internal i64 @return64BitConst() { | 131 define internal i64 @return64BitConst() { |
118 entry: | 132 entry: |
119 ret i64 -2401053092306725256 | 133 ret i64 -2401053092306725256 |
120 } | 134 } |
121 ; CHECK-LABEL: return64BitConst | 135 ; CHECK-LABEL: return64BitConst |
122 ; CHECK: mov eax,0x12345678 | 136 ; CHECK: mov eax,0x12345678 |
123 ; CHECK: mov edx,0xdeadbeef | 137 ; CHECK: mov edx,0xdeadbeef |
124 ; | 138 ; |
125 ; OPTM1-LABEL: return64BitConst | 139 ; OPTM1-LABEL: return64BitConst |
126 ; OPTM1: mov eax,0x12345678 | 140 ; OPTM1: mov eax,0x12345678 |
127 ; OPTM1: mov edx,0xdeadbeef | 141 ; OPTM1: mov edx,0xdeadbeef |
128 | 142 |
| 143 ; ARM32-LABEL: return64BitConst |
| 144 ; ARM32: movw r0, #22136 ; 0x5678 |
| 145 ; ARM32: movt r0, #4660 ; 0x1234 |
| 146 ; ARM32: movw r1, #48879 ; 0xbeef |
| 147 ; ARM32: movt r1, #57005 ; 0xdead |
| 148 |
129 define internal i64 @add64BitSigned(i64 %a, i64 %b) { | 149 define internal i64 @add64BitSigned(i64 %a, i64 %b) { |
130 entry: | 150 entry: |
131 %add = add i64 %b, %a | 151 %add = add i64 %b, %a |
132 ret i64 %add | 152 ret i64 %add |
133 } | 153 } |
134 ; CHECK-LABEL: add64BitSigned | 154 ; CHECK-LABEL: add64BitSigned |
135 ; CHECK: add | 155 ; CHECK: add |
136 ; CHECK: adc | 156 ; CHECK: adc |
137 ; | 157 ; |
138 ; OPTM1-LABEL: add64BitSigned | 158 ; OPTM1-LABEL: add64BitSigned |
139 ; OPTM1: add | 159 ; OPTM1: add |
140 ; OPTM1: adc | 160 ; OPTM1: adc |
141 | 161 |
| 162 ; ARM32-LABEL: add64BitSigned |
| 163 ; ARM32: adds |
| 164 ; ARM32: adc |
| 165 |
142 define internal i64 @add64BitUnsigned(i64 %a, i64 %b) { | 166 define internal i64 @add64BitUnsigned(i64 %a, i64 %b) { |
143 entry: | 167 entry: |
144 %add = add i64 %b, %a | 168 %add = add i64 %b, %a |
145 ret i64 %add | 169 ret i64 %add |
146 } | 170 } |
147 ; CHECK-LABEL: add64BitUnsigned | 171 ; CHECK-LABEL: add64BitUnsigned |
148 ; CHECK: add | 172 ; CHECK: add |
149 ; CHECK: adc | 173 ; CHECK: adc |
150 ; | 174 ; |
151 ; OPTM1-LABEL: add64BitUnsigned | 175 ; OPTM1-LABEL: add64BitUnsigned |
152 ; OPTM1: add | 176 ; OPTM1: add |
153 ; OPTM1: adc | 177 ; OPTM1: adc |
154 | 178 |
| 179 ; ARM32-LABEL: add64BitUnsigned |
| 180 ; ARM32: adds |
| 181 ; ARM32: adc |
| 182 |
155 define internal i64 @sub64BitSigned(i64 %a, i64 %b) { | 183 define internal i64 @sub64BitSigned(i64 %a, i64 %b) { |
156 entry: | 184 entry: |
157 %sub = sub i64 %a, %b | 185 %sub = sub i64 %a, %b |
158 ret i64 %sub | 186 ret i64 %sub |
159 } | 187 } |
160 ; CHECK-LABEL: sub64BitSigned | 188 ; CHECK-LABEL: sub64BitSigned |
161 ; CHECK: sub | 189 ; CHECK: sub |
162 ; CHECK: sbb | 190 ; CHECK: sbb |
163 ; | 191 ; |
164 ; OPTM1-LABEL: sub64BitSigned | 192 ; OPTM1-LABEL: sub64BitSigned |
165 ; OPTM1: sub | 193 ; OPTM1: sub |
166 ; OPTM1: sbb | 194 ; OPTM1: sbb |
167 | 195 |
| 196 ; ARM32-LABEL: sub64BitSigned |
| 197 ; ARM32: subs |
| 198 ; ARM32: sbc |
| 199 |
168 define internal i64 @sub64BitUnsigned(i64 %a, i64 %b) { | 200 define internal i64 @sub64BitUnsigned(i64 %a, i64 %b) { |
169 entry: | 201 entry: |
170 %sub = sub i64 %a, %b | 202 %sub = sub i64 %a, %b |
171 ret i64 %sub | 203 ret i64 %sub |
172 } | 204 } |
173 ; CHECK-LABEL: sub64BitUnsigned | 205 ; CHECK-LABEL: sub64BitUnsigned |
174 ; CHECK: sub | 206 ; CHECK: sub |
175 ; CHECK: sbb | 207 ; CHECK: sbb |
176 ; | 208 ; |
177 ; OPTM1-LABEL: sub64BitUnsigned | 209 ; OPTM1-LABEL: sub64BitUnsigned |
178 ; OPTM1: sub | 210 ; OPTM1: sub |
179 ; OPTM1: sbb | 211 ; OPTM1: sbb |
180 | 212 |
| 213 ; ARM32-LABEL: sub64BitUnsigned |
| 214 ; ARM32: subs |
| 215 ; ARM32: sbc |
| 216 |
181 define internal i64 @mul64BitSigned(i64 %a, i64 %b) { | 217 define internal i64 @mul64BitSigned(i64 %a, i64 %b) { |
182 entry: | 218 entry: |
183 %mul = mul i64 %b, %a | 219 %mul = mul i64 %b, %a |
184 ret i64 %mul | 220 ret i64 %mul |
185 } | 221 } |
186 ; CHECK-LABEL: mul64BitSigned | 222 ; CHECK-LABEL: mul64BitSigned |
187 ; CHECK: imul | 223 ; CHECK: imul |
188 ; CHECK: imul | 224 ; CHECK: imul |
189 ; CHECK: mul | 225 ; CHECK: mul |
190 ; CHECK: add | 226 ; CHECK: add |
191 ; CHECK: add | 227 ; CHECK: add |
192 ; | 228 ; |
193 ; OPTM1-LABEL: mul64BitSigned | 229 ; OPTM1-LABEL: mul64BitSigned |
194 ; OPTM1: imul | 230 ; OPTM1: imul |
195 ; OPTM1: imul | 231 ; OPTM1: imul |
196 ; OPTM1: mul | 232 ; OPTM1: mul |
197 ; OPTM1: add | 233 ; OPTM1: add |
198 ; OPTM1: add | 234 ; OPTM1: add |
199 | 235 |
| 236 ; ARM32-LABEL: mul64BitSigned |
| 237 ; ARM32: mul |
| 238 ; ARM32: mla |
| 239 ; ARM32: umull |
| 240 ; ARM32: add |
| 241 |
200 define internal i64 @mul64BitUnsigned(i64 %a, i64 %b) { | 242 define internal i64 @mul64BitUnsigned(i64 %a, i64 %b) { |
201 entry: | 243 entry: |
202 %mul = mul i64 %b, %a | 244 %mul = mul i64 %b, %a |
203 ret i64 %mul | 245 ret i64 %mul |
204 } | 246 } |
205 ; CHECK-LABEL: mul64BitUnsigned | 247 ; CHECK-LABEL: mul64BitUnsigned |
206 ; CHECK: imul | 248 ; CHECK: imul |
207 ; CHECK: imul | 249 ; CHECK: imul |
208 ; CHECK: mul | 250 ; CHECK: mul |
209 ; CHECK: add | 251 ; CHECK: add |
210 ; CHECK: add | 252 ; CHECK: add |
211 ; | 253 ; |
212 ; OPTM1-LABEL: mul64BitUnsigned | 254 ; OPTM1-LABEL: mul64BitUnsigned |
213 ; OPTM1: imul | 255 ; OPTM1: imul |
214 ; OPTM1: imul | 256 ; OPTM1: imul |
215 ; OPTM1: mul | 257 ; OPTM1: mul |
216 ; OPTM1: add | 258 ; OPTM1: add |
217 ; OPTM1: add | 259 ; OPTM1: add |
218 | 260 |
| 261 ; ARM32-LABEL: mul64BitUnsigned |
| 262 ; ARM32: mul |
| 263 ; ARM32: mla |
| 264 ; ARM32: umull |
| 265 ; ARM32: add |
| 266 |
219 define internal i64 @div64BitSigned(i64 %a, i64 %b) { | 267 define internal i64 @div64BitSigned(i64 %a, i64 %b) { |
220 entry: | 268 entry: |
221 %div = sdiv i64 %a, %b | 269 %div = sdiv i64 %a, %b |
222 ret i64 %div | 270 ret i64 %div |
223 } | 271 } |
224 ; CHECK-LABEL: div64BitSigned | 272 ; CHECK-LABEL: div64BitSigned |
225 ; CHECK: call {{.*}} R_{{.*}} __divdi3 | 273 ; CHECK: call {{.*}} R_{{.*}} __divdi3 |
226 | 274 |
227 ; OPTM1-LABEL: div64BitSigned | 275 ; OPTM1-LABEL: div64BitSigned |
228 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 | 276 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
406 ret i64 %and | 454 ret i64 %and |
407 } | 455 } |
408 ; CHECK-LABEL: and64BitSigned | 456 ; CHECK-LABEL: and64BitSigned |
409 ; CHECK: and | 457 ; CHECK: and |
410 ; CHECK: and | 458 ; CHECK: and |
411 ; | 459 ; |
412 ; OPTM1-LABEL: and64BitSigned | 460 ; OPTM1-LABEL: and64BitSigned |
413 ; OPTM1: and | 461 ; OPTM1: and |
414 ; OPTM1: and | 462 ; OPTM1: and |
415 | 463 |
| 464 ; ARM32-LABEL: and64BitSigned |
| 465 ; ARM32: and |
| 466 ; ARM32: and |
| 467 |
416 define internal i64 @and64BitUnsigned(i64 %a, i64 %b) { | 468 define internal i64 @and64BitUnsigned(i64 %a, i64 %b) { |
417 entry: | 469 entry: |
418 %and = and i64 %b, %a | 470 %and = and i64 %b, %a |
419 ret i64 %and | 471 ret i64 %and |
420 } | 472 } |
421 ; CHECK-LABEL: and64BitUnsigned | 473 ; CHECK-LABEL: and64BitUnsigned |
422 ; CHECK: and | 474 ; CHECK: and |
423 ; CHECK: and | 475 ; CHECK: and |
424 ; | 476 ; |
425 ; OPTM1-LABEL: and64BitUnsigned | 477 ; OPTM1-LABEL: and64BitUnsigned |
426 ; OPTM1: and | 478 ; OPTM1: and |
427 ; OPTM1: and | 479 ; OPTM1: and |
428 | 480 |
| 481 ; ARM32-LABEL: and64BitUnsigned |
| 482 ; ARM32: and |
| 483 ; ARM32: and |
| 484 |
429 define internal i64 @or64BitSigned(i64 %a, i64 %b) { | 485 define internal i64 @or64BitSigned(i64 %a, i64 %b) { |
430 entry: | 486 entry: |
431 %or = or i64 %b, %a | 487 %or = or i64 %b, %a |
432 ret i64 %or | 488 ret i64 %or |
433 } | 489 } |
434 ; CHECK-LABEL: or64BitSigned | 490 ; CHECK-LABEL: or64BitSigned |
435 ; CHECK: or | 491 ; CHECK: or |
436 ; CHECK: or | 492 ; CHECK: or |
437 ; | 493 ; |
438 ; OPTM1-LABEL: or64BitSigned | 494 ; OPTM1-LABEL: or64BitSigned |
439 ; OPTM1: or | 495 ; OPTM1: or |
440 ; OPTM1: or | 496 ; OPTM1: or |
441 | 497 |
| 498 ; ARM32-LABEL: or64BitSigned |
| 499 ; ARM32: orr |
| 500 ; ARM32: orr |
| 501 |
442 define internal i64 @or64BitUnsigned(i64 %a, i64 %b) { | 502 define internal i64 @or64BitUnsigned(i64 %a, i64 %b) { |
443 entry: | 503 entry: |
444 %or = or i64 %b, %a | 504 %or = or i64 %b, %a |
445 ret i64 %or | 505 ret i64 %or |
446 } | 506 } |
447 ; CHECK-LABEL: or64BitUnsigned | 507 ; CHECK-LABEL: or64BitUnsigned |
448 ; CHECK: or | 508 ; CHECK: or |
449 ; CHECK: or | 509 ; CHECK: or |
450 ; | 510 ; |
451 ; OPTM1-LABEL: or64BitUnsigned | 511 ; OPTM1-LABEL: or64BitUnsigned |
452 ; OPTM1: or | 512 ; OPTM1: or |
453 ; OPTM1: or | 513 ; OPTM1: or |
454 | 514 |
| 515 ; ARM32-LABEL: or64BitUnsigned |
| 516 ; ARM32: orr |
| 517 ; ARM32: orr |
| 518 |
455 define internal i64 @xor64BitSigned(i64 %a, i64 %b) { | 519 define internal i64 @xor64BitSigned(i64 %a, i64 %b) { |
456 entry: | 520 entry: |
457 %xor = xor i64 %b, %a | 521 %xor = xor i64 %b, %a |
458 ret i64 %xor | 522 ret i64 %xor |
459 } | 523 } |
460 ; CHECK-LABEL: xor64BitSigned | 524 ; CHECK-LABEL: xor64BitSigned |
461 ; CHECK: xor | 525 ; CHECK: xor |
462 ; CHECK: xor | 526 ; CHECK: xor |
463 ; | 527 ; |
464 ; OPTM1-LABEL: xor64BitSigned | 528 ; OPTM1-LABEL: xor64BitSigned |
465 ; OPTM1: xor | 529 ; OPTM1: xor |
466 ; OPTM1: xor | 530 ; OPTM1: xor |
467 | 531 |
| 532 ; ARM32-LABEL: xor64BitSigned |
| 533 ; ARM32: eor |
| 534 ; ARM32: eor |
| 535 |
468 define internal i64 @xor64BitUnsigned(i64 %a, i64 %b) { | 536 define internal i64 @xor64BitUnsigned(i64 %a, i64 %b) { |
469 entry: | 537 entry: |
470 %xor = xor i64 %b, %a | 538 %xor = xor i64 %b, %a |
471 ret i64 %xor | 539 ret i64 %xor |
472 } | 540 } |
473 ; CHECK-LABEL: xor64BitUnsigned | 541 ; CHECK-LABEL: xor64BitUnsigned |
474 ; CHECK: xor | 542 ; CHECK: xor |
475 ; CHECK: xor | 543 ; CHECK: xor |
476 ; | 544 ; |
477 ; OPTM1-LABEL: xor64BitUnsigned | 545 ; OPTM1-LABEL: xor64BitUnsigned |
478 ; OPTM1: xor | 546 ; OPTM1: xor |
479 ; OPTM1: xor | 547 ; OPTM1: xor |
480 | 548 |
| 549 ; ARM32-LABEL: xor64BitUnsigned |
| 550 ; ARM32: eor |
| 551 ; ARM32: eor |
| 552 |
481 define internal i32 @trunc64To32Signed(i64 %a) { | 553 define internal i32 @trunc64To32Signed(i64 %a) { |
482 entry: | 554 entry: |
483 %conv = trunc i64 %a to i32 | 555 %conv = trunc i64 %a to i32 |
484 ret i32 %conv | 556 ret i32 %conv |
485 } | 557 } |
486 ; CHECK-LABEL: trunc64To32Signed | 558 ; CHECK-LABEL: trunc64To32Signed |
487 ; CHECK: mov eax,DWORD PTR [esp+0x4] | 559 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
488 ; | 560 ; |
489 ; OPTM1-LABEL: trunc64To32Signed | 561 ; OPTM1-LABEL: trunc64To32Signed |
490 ; OPTM1: mov eax,DWORD PTR [esp+ | 562 ; OPTM1: mov eax,DWORD PTR [esp+ |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 ; CHECK: call | 811 ; CHECK: call |
740 ; | 812 ; |
741 ; OPTM1-LABEL: icmpEq64 | 813 ; OPTM1-LABEL: icmpEq64 |
742 ; OPTM1: jne | 814 ; OPTM1: jne |
743 ; OPTM1: je | 815 ; OPTM1: je |
744 ; OPTM1: call | 816 ; OPTM1: call |
745 ; OPTM1: jne | 817 ; OPTM1: jne |
746 ; OPTM1: je | 818 ; OPTM1: je |
747 ; OPTM1: call | 819 ; OPTM1: call |
748 | 820 |
| 821 ; ARM32-LABEL: icmpEq64 |
| 822 ; ARM32: cmp |
| 823 ; ARM32: cmpeq |
| 824 ; ARM32: moveq |
| 825 ; ARM32: movne |
| 826 ; ARM32: beq |
| 827 ; ARM32: bl |
| 828 ; ARM32: cmp |
| 829 ; ARM32: cmpeq |
| 830 ; ARM32: moveq |
| 831 ; ARM32: movne |
| 832 ; ARM32: beq |
| 833 ; ARM32: bl |
| 834 |
749 declare void @func() | 835 declare void @func() |
750 | 836 |
751 define internal void @icmpNe64(i64 %a, i64 %b, i64 %c, i64 %d) { | 837 define internal void @icmpNe64(i64 %a, i64 %b, i64 %c, i64 %d) { |
752 entry: | 838 entry: |
753 %cmp = icmp ne i64 %a, %b | 839 %cmp = icmp ne i64 %a, %b |
754 br i1 %cmp, label %if.then, label %if.end | 840 br i1 %cmp, label %if.then, label %if.end |
755 | 841 |
756 if.then: ; preds = %entry | 842 if.then: ; preds = %entry |
757 call void @func() | 843 call void @func() |
758 br label %if.end | 844 br label %if.end |
(...skipping 18 matching lines...) Expand all Loading... |
777 ; CHECK: call | 863 ; CHECK: call |
778 ; | 864 ; |
779 ; OPTM1-LABEL: icmpNe64 | 865 ; OPTM1-LABEL: icmpNe64 |
780 ; OPTM1: jne | 866 ; OPTM1: jne |
781 ; OPTM1: jne | 867 ; OPTM1: jne |
782 ; OPTM1: call | 868 ; OPTM1: call |
783 ; OPTM1: jne | 869 ; OPTM1: jne |
784 ; OPTM1: jne | 870 ; OPTM1: jne |
785 ; OPTM1: call | 871 ; OPTM1: call |
786 | 872 |
| 873 ; ARM32-LABEL: icmpNe64 |
| 874 ; ARM32: cmp |
| 875 ; ARM32: cmpeq |
| 876 ; ARM32: movne |
| 877 ; ARM32: moveq |
| 878 ; ARM32: beq |
| 879 ; ARM32: bl |
| 880 ; ARM32: cmp |
| 881 ; ARM32: cmpeq |
| 882 ; ARM32: movne |
| 883 ; ARM32: moveq |
| 884 ; ARM32: beq |
| 885 ; ARM32: bl |
| 886 |
787 define internal void @icmpGt64(i64 %a, i64 %b, i64 %c, i64 %d) { | 887 define internal void @icmpGt64(i64 %a, i64 %b, i64 %c, i64 %d) { |
788 entry: | 888 entry: |
789 %cmp = icmp ugt i64 %a, %b | 889 %cmp = icmp ugt i64 %a, %b |
790 br i1 %cmp, label %if.then, label %if.end | 890 br i1 %cmp, label %if.then, label %if.end |
791 | 891 |
792 if.then: ; preds = %entry | 892 if.then: ; preds = %entry |
793 call void @func() | 893 call void @func() |
794 br label %if.end | 894 br label %if.end |
795 | 895 |
796 if.end: ; preds = %if.then, %entry | 896 if.end: ; preds = %if.then, %entry |
(...skipping 20 matching lines...) Expand all Loading... |
817 ; OPTM1-LABEL: icmpGt64 | 917 ; OPTM1-LABEL: icmpGt64 |
818 ; OPTM1: ja | 918 ; OPTM1: ja |
819 ; OPTM1: jb | 919 ; OPTM1: jb |
820 ; OPTM1: ja | 920 ; OPTM1: ja |
821 ; OPTM1: call | 921 ; OPTM1: call |
822 ; OPTM1: jg | 922 ; OPTM1: jg |
823 ; OPTM1: jl | 923 ; OPTM1: jl |
824 ; OPTM1: ja | 924 ; OPTM1: ja |
825 ; OPTM1: call | 925 ; OPTM1: call |
826 | 926 |
| 927 ; ARM32-LABEL: icmpGt64 |
| 928 ; ARM32: cmp |
| 929 ; ARM32: cmpeq |
| 930 ; ARM32: movhi |
| 931 ; ARM32: movls |
| 932 ; ARM32: beq |
| 933 ; ARM32: bl |
| 934 ; ARM32: cmp |
| 935 ; TODO(jvoung): need to get param from stack |
| 936 ; TODOARM32: cmpeq |
| 937 ; ARM32: movlt |
| 938 ; ARM32: movge |
| 939 ; ARM32: beq |
| 940 ; ARM32: bl |
| 941 |
827 define internal void @icmpGe64(i64 %a, i64 %b, i64 %c, i64 %d) { | 942 define internal void @icmpGe64(i64 %a, i64 %b, i64 %c, i64 %d) { |
828 entry: | 943 entry: |
829 %cmp = icmp uge i64 %a, %b | 944 %cmp = icmp uge i64 %a, %b |
830 br i1 %cmp, label %if.then, label %if.end | 945 br i1 %cmp, label %if.then, label %if.end |
831 | 946 |
832 if.then: ; preds = %entry | 947 if.then: ; preds = %entry |
833 call void @func() | 948 call void @func() |
834 br label %if.end | 949 br label %if.end |
835 | 950 |
836 if.end: ; preds = %if.then, %entry | 951 if.end: ; preds = %if.then, %entry |
(...skipping 20 matching lines...) Expand all Loading... |
857 ; OPTM1-LABEL: icmpGe64 | 972 ; OPTM1-LABEL: icmpGe64 |
858 ; OPTM1: ja | 973 ; OPTM1: ja |
859 ; OPTM1: jb | 974 ; OPTM1: jb |
860 ; OPTM1: jae | 975 ; OPTM1: jae |
861 ; OPTM1: call | 976 ; OPTM1: call |
862 ; OPTM1: jg | 977 ; OPTM1: jg |
863 ; OPTM1: jl | 978 ; OPTM1: jl |
864 ; OPTM1: jae | 979 ; OPTM1: jae |
865 ; OPTM1: call | 980 ; OPTM1: call |
866 | 981 |
| 982 ; ARM32-LABEL: icmpGe64 |
| 983 ; ARM32: cmp |
| 984 ; ARM32: cmpeq |
| 985 ; ARM32: movcs |
| 986 ; ARM32: movcc |
| 987 ; ARM32: beq |
| 988 ; ARM32: bl |
| 989 ; ARM32: cmp |
| 990 ; TODOARM32: cmpeq |
| 991 ; ARM32: movge |
| 992 ; ARM32: movlt |
| 993 ; ARM32: beq |
| 994 ; ARM32: bl |
| 995 |
867 define internal void @icmpLt64(i64 %a, i64 %b, i64 %c, i64 %d) { | 996 define internal void @icmpLt64(i64 %a, i64 %b, i64 %c, i64 %d) { |
868 entry: | 997 entry: |
869 %cmp = icmp ult i64 %a, %b | 998 %cmp = icmp ult i64 %a, %b |
870 br i1 %cmp, label %if.then, label %if.end | 999 br i1 %cmp, label %if.then, label %if.end |
871 | 1000 |
872 if.then: ; preds = %entry | 1001 if.then: ; preds = %entry |
873 call void @func() | 1002 call void @func() |
874 br label %if.end | 1003 br label %if.end |
875 | 1004 |
876 if.end: ; preds = %if.then, %entry | 1005 if.end: ; preds = %if.then, %entry |
(...skipping 20 matching lines...) Expand all Loading... |
897 ; OPTM1-LABEL: icmpLt64 | 1026 ; OPTM1-LABEL: icmpLt64 |
898 ; OPTM1: jb | 1027 ; OPTM1: jb |
899 ; OPTM1: ja | 1028 ; OPTM1: ja |
900 ; OPTM1: jb | 1029 ; OPTM1: jb |
901 ; OPTM1: call | 1030 ; OPTM1: call |
902 ; OPTM1: jl | 1031 ; OPTM1: jl |
903 ; OPTM1: jg | 1032 ; OPTM1: jg |
904 ; OPTM1: jb | 1033 ; OPTM1: jb |
905 ; OPTM1: call | 1034 ; OPTM1: call |
906 | 1035 |
| 1036 ; ARM32-LABEL: icmpLt64 |
| 1037 ; ARM32: cmp |
| 1038 ; ARM32: cmpeq |
| 1039 ; ARM32: movcc |
| 1040 ; ARM32: movcs |
| 1041 ; ARM32: beq |
| 1042 ; ARM32: bl |
| 1043 ; ARM32: cmp |
| 1044 ; TODOARM32: cmpeq |
| 1045 ; ARM32: movlt |
| 1046 ; ARM32: movge |
| 1047 ; ARM32: beq |
| 1048 ; ARM32: bl |
| 1049 |
907 define internal void @icmpLe64(i64 %a, i64 %b, i64 %c, i64 %d) { | 1050 define internal void @icmpLe64(i64 %a, i64 %b, i64 %c, i64 %d) { |
908 entry: | 1051 entry: |
909 %cmp = icmp ule i64 %a, %b | 1052 %cmp = icmp ule i64 %a, %b |
910 br i1 %cmp, label %if.then, label %if.end | 1053 br i1 %cmp, label %if.then, label %if.end |
911 | 1054 |
912 if.then: ; preds = %entry | 1055 if.then: ; preds = %entry |
913 call void @func() | 1056 call void @func() |
914 br label %if.end | 1057 br label %if.end |
915 | 1058 |
916 if.end: ; preds = %if.then, %entry | 1059 if.end: ; preds = %if.then, %entry |
(...skipping 20 matching lines...) Expand all Loading... |
937 ; OPTM1-LABEL: icmpLe64 | 1080 ; OPTM1-LABEL: icmpLe64 |
938 ; OPTM1: jb | 1081 ; OPTM1: jb |
939 ; OPTM1: ja | 1082 ; OPTM1: ja |
940 ; OPTM1: jbe | 1083 ; OPTM1: jbe |
941 ; OPTM1: call | 1084 ; OPTM1: call |
942 ; OPTM1: jl | 1085 ; OPTM1: jl |
943 ; OPTM1: jg | 1086 ; OPTM1: jg |
944 ; OPTM1: jbe | 1087 ; OPTM1: jbe |
945 ; OPTM1: call | 1088 ; OPTM1: call |
946 | 1089 |
| 1090 ; ARM32-LABEL: icmpLe64 |
| 1091 ; ARM32: cmp |
| 1092 ; ARM32: cmpeq |
| 1093 ; ARM32: movls |
| 1094 ; ARM32: movhi |
| 1095 ; ARM32: beq |
| 1096 ; ARM32: bl |
| 1097 ; ARM32: cmp |
| 1098 ; TODOARM32: cmpeq |
| 1099 ; ARM32: movge |
| 1100 ; ARM32: movlt |
| 1101 ; ARM32: beq |
| 1102 ; ARM32: bl |
| 1103 |
947 define internal i32 @icmpEq64Bool(i64 %a, i64 %b) { | 1104 define internal i32 @icmpEq64Bool(i64 %a, i64 %b) { |
948 entry: | 1105 entry: |
949 %cmp = icmp eq i64 %a, %b | 1106 %cmp = icmp eq i64 %a, %b |
950 %cmp.ret_ext = zext i1 %cmp to i32 | 1107 %cmp.ret_ext = zext i1 %cmp to i32 |
951 ret i32 %cmp.ret_ext | 1108 ret i32 %cmp.ret_ext |
952 } | 1109 } |
953 ; CHECK-LABEL: icmpEq64Bool | 1110 ; CHECK-LABEL: icmpEq64Bool |
954 ; CHECK: jne | 1111 ; CHECK: jne |
955 ; CHECK: je | 1112 ; CHECK: je |
956 ; | 1113 ; |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1268 | 1425 |
1269 if.end3: ; preds = %if.then2, %if.end | 1426 if.end3: ; preds = %if.then2, %if.end |
1270 ret void | 1427 ret void |
1271 } | 1428 } |
1272 ; The following checks are not strictly necessary since one of the RUN | 1429 ; The following checks are not strictly necessary since one of the RUN |
1273 ; lines actually runs the output through the assembler. | 1430 ; lines actually runs the output through the assembler. |
1274 ; CHECK-LABEL: icmpEq64Imm | 1431 ; CHECK-LABEL: icmpEq64Imm |
1275 ; CHECK-NOT: cmp 0x{{[0-9a-f]+}}, | 1432 ; CHECK-NOT: cmp 0x{{[0-9a-f]+}}, |
1276 ; OPTM1-LABEL: icmpEq64Imm | 1433 ; OPTM1-LABEL: icmpEq64Imm |
1277 ; OPTM1-LABEL-NOT: cmp 0x{{[0-9a-f]+}}, | 1434 ; OPTM1-LABEL-NOT: cmp 0x{{[0-9a-f]+}}, |
| 1435 ; ARM32-LABEL: icmpEq64Imm |
| 1436 ; ARM32-NOT: cmp #{{[0-9a-f]+}}, |
1278 | 1437 |
1279 define internal void @icmpLt64Imm() { | 1438 define internal void @icmpLt64Imm() { |
1280 entry: | 1439 entry: |
1281 %cmp = icmp ult i64 123, 234 | 1440 %cmp = icmp ult i64 123, 234 |
1282 br i1 %cmp, label %if.then, label %if.end | 1441 br i1 %cmp, label %if.then, label %if.end |
1283 | 1442 |
1284 if.then: ; preds = %entry | 1443 if.then: ; preds = %entry |
1285 call void @func() | 1444 call void @func() |
1286 br label %if.end | 1445 br label %if.end |
1287 | 1446 |
1288 if.end: ; preds = %if.then, %entry | 1447 if.end: ; preds = %if.then, %entry |
1289 %cmp1 = icmp slt i64 345, 456 | 1448 %cmp1 = icmp slt i64 345, 456 |
1290 br i1 %cmp1, label %if.then2, label %if.end3 | 1449 br i1 %cmp1, label %if.then2, label %if.end3 |
1291 | 1450 |
1292 if.then2: ; preds = %if.end | 1451 if.then2: ; preds = %if.end |
1293 call void @func() | 1452 call void @func() |
1294 br label %if.end3 | 1453 br label %if.end3 |
1295 | 1454 |
1296 if.end3: ; preds = %if.then2, %if.end | 1455 if.end3: ; preds = %if.then2, %if.end |
1297 ret void | 1456 ret void |
1298 } | 1457 } |
1299 ; The following checks are not strictly necessary since one of the RUN | 1458 ; The following checks are not strictly necessary since one of the RUN |
1300 ; lines actually runs the output through the assembler. | 1459 ; lines actually runs the output through the assembler. |
1301 ; CHECK-LABEL: icmpLt64Imm | 1460 ; CHECK-LABEL: icmpLt64Imm |
1302 ; CHECK-NOT: cmp 0x{{[0-9a-f]+}}, | 1461 ; CHECK-NOT: cmp 0x{{[0-9a-f]+}}, |
1303 ; OPTM1-LABEL: icmpLt64Imm | 1462 ; OPTM1-LABEL: icmpLt64Imm |
1304 ; OPTM1-NOT: cmp 0x{{[0-9a-f]+}}, | 1463 ; OPTM1-NOT: cmp 0x{{[0-9a-f]+}}, |
| 1464 ; ARM32-LABEL: icmpLt64Imm |
| 1465 ; ARM32-NOT: cmp #{{[0-9a-f]+}}, |
OLD | NEW |