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 1285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1296 } | 1296 } |
1297 ; CHECK-LABEL: load64 | 1297 ; CHECK-LABEL: load64 |
1298 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] | 1298 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] |
1299 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]] | 1299 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]] |
1300 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]+0x4] | 1300 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]+0x4] |
1301 ; | 1301 ; |
1302 ; OPTM1-LABEL: load64 | 1302 ; OPTM1-LABEL: load64 |
1303 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}] | 1303 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}] |
1304 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}+0x4] | 1304 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}+0x4] |
1305 | 1305 |
| 1306 ; ARM32-LABEL: load64 |
| 1307 ; ARM32: ldr r{{.*}}, [r[[REG:.*]]] |
| 1308 ; ARM32: ldr r{{.*}}, [r[[REG]], #4] |
| 1309 |
1306 define internal void @store64(i32 %a, i64 %value) { | 1310 define internal void @store64(i32 %a, i64 %value) { |
1307 entry: | 1311 entry: |
1308 %__2 = inttoptr i32 %a to i64* | 1312 %__2 = inttoptr i32 %a to i64* |
1309 store i64 %value, i64* %__2, align 1 | 1313 store i64 %value, i64* %__2, align 1 |
1310 ret void | 1314 ret void |
1311 } | 1315 } |
1312 ; CHECK-LABEL: store64 | 1316 ; CHECK-LABEL: store64 |
1313 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] | 1317 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] |
1314 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4], | 1318 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4], |
1315 ; CHECK: mov DWORD PTR [e[[REGISTER]]], | 1319 ; CHECK: mov DWORD PTR [e[[REGISTER]]], |
1316 ; | 1320 ; |
1317 ; OPTM1-LABEL: store64 | 1321 ; OPTM1-LABEL: store64 |
1318 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4], | 1322 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4], |
1319 ; OPTM1: mov DWORD PTR [e[[REGISTER]]], | 1323 ; OPTM1: mov DWORD PTR [e[[REGISTER]]], |
1320 | 1324 |
| 1325 ; ARM32-LABEL: store64 |
| 1326 ; ARM32: str r{{.*}}, [r[[REG:.*]], #4] |
| 1327 ; ARM32: str r{{.*}}, [r[[REG]]] |
| 1328 |
1321 define internal void @store64Const(i32 %a) { | 1329 define internal void @store64Const(i32 %a) { |
1322 entry: | 1330 entry: |
1323 %__1 = inttoptr i32 %a to i64* | 1331 %__1 = inttoptr i32 %a to i64* |
1324 store i64 -2401053092306725256, i64* %__1, align 1 | 1332 store i64 -2401053092306725256, i64* %__1, align 1 |
1325 ret void | 1333 ret void |
1326 } | 1334 } |
1327 ; CHECK-LABEL: store64Const | 1335 ; CHECK-LABEL: store64Const |
1328 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] | 1336 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] |
1329 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4],0xdeadbeef | 1337 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4],0xdeadbeef |
1330 ; CHECK: mov DWORD PTR [e[[REGISTER]]],0x12345678 | 1338 ; CHECK: mov DWORD PTR [e[[REGISTER]]],0x12345678 |
1331 ; | 1339 ; |
1332 ; OPTM1-LABEL: store64Const | 1340 ; OPTM1-LABEL: store64Const |
1333 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4],0xdeadbeef | 1341 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4],0xdeadbeef |
1334 ; OPTM1: mov DWORD PTR [e[[REGISTER]]],0x12345678 | 1342 ; OPTM1: mov DWORD PTR [e[[REGISTER]]],0x12345678 |
1335 | 1343 |
| 1344 ; ARM32-LABEL: store64Const |
| 1345 ; ARM32: movw [[REG1:.*]], #48879 ; 0xbeef |
| 1346 ; ARM32: movt [[REG1:.*]], #57005 ; 0xdead |
| 1347 ; ARM32: movw [[REG2:.*]], #22136 ; 0x5678 |
| 1348 ; ARM32: movt [[REG2:.*]], #4660 ; 0x1234 |
| 1349 ; ARM32: str [[REG1]], [r[[REG:.*]], #4] |
| 1350 ; ARM32: str [[REG2]], [r[[REG]]] |
| 1351 |
1336 define internal i64 @select64VarVar(i64 %a, i64 %b) { | 1352 define internal i64 @select64VarVar(i64 %a, i64 %b) { |
1337 entry: | 1353 entry: |
1338 %cmp = icmp ult i64 %a, %b | 1354 %cmp = icmp ult i64 %a, %b |
1339 %cond = select i1 %cmp, i64 %a, i64 %b | 1355 %cond = select i1 %cmp, i64 %a, i64 %b |
1340 ret i64 %cond | 1356 ret i64 %cond |
1341 } | 1357 } |
1342 ; CHECK-LABEL: select64VarVar | 1358 ; CHECK-LABEL: select64VarVar |
1343 ; CHECK: cmp | 1359 ; CHECK: cmp |
1344 ; CHECK: jb | 1360 ; CHECK: jb |
1345 ; CHECK: ja | 1361 ; CHECK: ja |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1455 ret void | 1471 ret void |
1456 } | 1472 } |
1457 ; The following checks are not strictly necessary since one of the RUN | 1473 ; The following checks are not strictly necessary since one of the RUN |
1458 ; lines actually runs the output through the assembler. | 1474 ; lines actually runs the output through the assembler. |
1459 ; CHECK-LABEL: icmpLt64Imm | 1475 ; CHECK-LABEL: icmpLt64Imm |
1460 ; CHECK-NOT: cmp 0x{{[0-9a-f]+}}, | 1476 ; CHECK-NOT: cmp 0x{{[0-9a-f]+}}, |
1461 ; OPTM1-LABEL: icmpLt64Imm | 1477 ; OPTM1-LABEL: icmpLt64Imm |
1462 ; OPTM1-NOT: cmp 0x{{[0-9a-f]+}}, | 1478 ; OPTM1-NOT: cmp 0x{{[0-9a-f]+}}, |
1463 ; ARM32-LABEL: icmpLt64Imm | 1479 ; ARM32-LABEL: icmpLt64Imm |
1464 ; ARM32-NOT: cmp #{{[0-9a-f]+}}, | 1480 ; ARM32-NOT: cmp #{{[0-9a-f]+}}, |
OLD | NEW |