|
1 |
| -; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 |
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
2 | 2 | ; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
3 |
| -; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI |
| 3 | +; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI |
| 4 | + |
| 5 | +; CHECK-GI: warning: Instruction selection used fallback path for insert_v2i128_0 |
| 6 | +; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_v2i128_1 |
| 7 | +; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_v2i128_c |
| 8 | +; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_v2fp128_0 |
| 9 | +; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_v2fp128_1 |
| 10 | +; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_v2fp128_c |
| 11 | +; CHECK-GI-NEXT: warning: Instruction selection used fallback path for extract_v2i128_0 |
| 12 | +; CHECK-GI-NEXT: warning: Instruction selection used fallback path for extract_v2i128_1 |
| 13 | +; CHECK-GI-NEXT: warning: Instruction selection used fallback path for extract_v2i128_c |
| 14 | +; CHECK-GI-NEXT: warning: Instruction selection used fallback path for extract_v2fp128_c |
4 | 15 |
|
5 | 16 | define <2 x double> @insert_v2f64_0(<2 x double> %a, double %b, i32 %c) {
|
6 | 17 | ; CHECK-LABEL: insert_v2f64_0:
|
@@ -1312,6 +1323,137 @@ entry:
|
1312 | 1323 | ret <4 x i64> %d
|
1313 | 1324 | }
|
1314 | 1325 |
|
| 1326 | +define <2 x i128> @insert_v2i128_0(<2 x i128> %a, i128 %b, i32 %c) { |
| 1327 | +; CHECK-LABEL: insert_v2i128_0: |
| 1328 | +; CHECK: // %bb.0: // %entry |
| 1329 | +; CHECK-NEXT: adds x2, x2, x2 |
| 1330 | +; CHECK-NEXT: mov x1, x5 |
| 1331 | +; CHECK-NEXT: mov x0, x4 |
| 1332 | +; CHECK-NEXT: adc x3, x3, x3 |
| 1333 | +; CHECK-NEXT: ret |
| 1334 | +entry: |
| 1335 | + %aa = add <2 x i128> %a, %a |
| 1336 | + %d = insertelement <2 x i128> %aa, i128 %b, i32 0 |
| 1337 | + ret <2 x i128> %d |
| 1338 | +} |
| 1339 | + |
| 1340 | +define <2 x i128> @insert_v2i128_1(<2 x i128> %a, i128 %b, i32 %c) { |
| 1341 | +; CHECK-LABEL: insert_v2i128_1: |
| 1342 | +; CHECK: // %bb.0: // %entry |
| 1343 | +; CHECK-NEXT: adds x0, x0, x0 |
| 1344 | +; CHECK-NEXT: mov x3, x5 |
| 1345 | +; CHECK-NEXT: mov x2, x4 |
| 1346 | +; CHECK-NEXT: adc x1, x1, x1 |
| 1347 | +; CHECK-NEXT: ret |
| 1348 | +entry: |
| 1349 | + %aa = add <2 x i128> %a, %a |
| 1350 | + %d = insertelement <2 x i128> %aa, i128 %b, i32 1 |
| 1351 | + ret <2 x i128> %d |
| 1352 | +} |
| 1353 | + |
| 1354 | +define <2 x i128> @insert_v2i128_c(<2 x i128> %a, i128 %b, i32 %c) { |
| 1355 | +; CHECK-LABEL: insert_v2i128_c: |
| 1356 | +; CHECK: // %bb.0: // %entry |
| 1357 | +; CHECK-NEXT: sub sp, sp, #32 |
| 1358 | +; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| 1359 | +; CHECK-NEXT: // kill: def $w6 killed $w6 def $x6 |
| 1360 | +; CHECK-NEXT: adds x8, x0, x0 |
| 1361 | +; CHECK-NEXT: and x11, x6, #0x1 |
| 1362 | +; CHECK-NEXT: mov x12, sp |
| 1363 | +; CHECK-NEXT: adc x9, x1, x1 |
| 1364 | +; CHECK-NEXT: adds x10, x2, x2 |
| 1365 | +; CHECK-NEXT: add x11, x12, x11, lsl #4 |
| 1366 | +; CHECK-NEXT: str x8, [sp] |
| 1367 | +; CHECK-NEXT: adc x8, x3, x3 |
| 1368 | +; CHECK-NEXT: str x10, [sp, #16] |
| 1369 | +; CHECK-NEXT: str x4, [x11] |
| 1370 | +; CHECK-NEXT: str x8, [sp, #24] |
| 1371 | +; CHECK-NEXT: str x9, [sp, #8] |
| 1372 | +; CHECK-NEXT: str x5, [x11, #8] |
| 1373 | +; CHECK-NEXT: ldp x0, x1, [sp] |
| 1374 | +; CHECK-NEXT: ldp x2, x3, [sp, #16] |
| 1375 | +; CHECK-NEXT: add sp, sp, #32 |
| 1376 | +; CHECK-NEXT: ret |
| 1377 | +entry: |
| 1378 | + %aa = add <2 x i128> %a, %a |
| 1379 | + %d = insertelement <2 x i128> %aa, i128 %b, i32 %c |
| 1380 | + ret <2 x i128> %d |
| 1381 | +} |
| 1382 | + |
| 1383 | +define <2 x fp128> @insert_v2fp128_0(<2 x fp128> %a, fp128 %b, i32 %c) { |
| 1384 | +; CHECK-LABEL: insert_v2fp128_0: |
| 1385 | +; CHECK: // %bb.0: // %entry |
| 1386 | +; CHECK-NEXT: sub sp, sp, #32 |
| 1387 | +; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill |
| 1388 | +; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| 1389 | +; CHECK-NEXT: .cfi_offset w30, -16 |
| 1390 | +; CHECK-NEXT: mov v0.16b, v1.16b |
| 1391 | +; CHECK-NEXT: str q2, [sp] // 16-byte Folded Spill |
| 1392 | +; CHECK-NEXT: bl __addtf3 |
| 1393 | +; CHECK-NEXT: mov v1.16b, v0.16b |
| 1394 | +; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload |
| 1395 | +; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload |
| 1396 | +; CHECK-NEXT: add sp, sp, #32 |
| 1397 | +; CHECK-NEXT: ret |
| 1398 | +entry: |
| 1399 | + %aa = fadd <2 x fp128> %a, %a |
| 1400 | + %d = insertelement <2 x fp128> %aa, fp128 %b, i32 0 |
| 1401 | + ret <2 x fp128> %d |
| 1402 | +} |
| 1403 | + |
| 1404 | +define <2 x fp128> @insert_v2fp128_1(<2 x fp128> %a, fp128 %b, i32 %c) { |
| 1405 | +; CHECK-LABEL: insert_v2fp128_1: |
| 1406 | +; CHECK: // %bb.0: // %entry |
| 1407 | +; CHECK-NEXT: sub sp, sp, #32 |
| 1408 | +; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill |
| 1409 | +; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| 1410 | +; CHECK-NEXT: .cfi_offset w30, -16 |
| 1411 | +; CHECK-NEXT: mov v1.16b, v0.16b |
| 1412 | +; CHECK-NEXT: str q2, [sp] // 16-byte Folded Spill |
| 1413 | +; CHECK-NEXT: bl __addtf3 |
| 1414 | +; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload |
| 1415 | +; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload |
| 1416 | +; CHECK-NEXT: add sp, sp, #32 |
| 1417 | +; CHECK-NEXT: ret |
| 1418 | +entry: |
| 1419 | + %aa = fadd <2 x fp128> %a, %a |
| 1420 | + %d = insertelement <2 x fp128> %aa, fp128 %b, i32 1 |
| 1421 | + ret <2 x fp128> %d |
| 1422 | +} |
| 1423 | + |
| 1424 | +define <2 x fp128> @insert_v2fp128_c(<2 x fp128> %a, fp128 %b, i32 %c) { |
| 1425 | +; CHECK-LABEL: insert_v2fp128_c: |
| 1426 | +; CHECK: // %bb.0: // %entry |
| 1427 | +; CHECK-NEXT: sub sp, sp, #96 |
| 1428 | +; CHECK-NEXT: stp x30, x19, [sp, #80] // 16-byte Folded Spill |
| 1429 | +; CHECK-NEXT: .cfi_def_cfa_offset 96 |
| 1430 | +; CHECK-NEXT: .cfi_offset w19, -8 |
| 1431 | +; CHECK-NEXT: .cfi_offset w30, -16 |
| 1432 | +; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill |
| 1433 | +; CHECK-NEXT: mov v1.16b, v0.16b |
| 1434 | +; CHECK-NEXT: mov w19, w0 |
| 1435 | +; CHECK-NEXT: str q2, [sp, #32] // 16-byte Folded Spill |
| 1436 | +; CHECK-NEXT: bl __addtf3 |
| 1437 | +; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill |
| 1438 | +; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload |
| 1439 | +; CHECK-NEXT: mov v1.16b, v0.16b |
| 1440 | +; CHECK-NEXT: bl __addtf3 |
| 1441 | +; CHECK-NEXT: str q0, [sp, #64] |
| 1442 | +; CHECK-NEXT: ldp q3, q0, [sp, #16] // 32-byte Folded Reload |
| 1443 | +; CHECK-NEXT: and x8, x19, #0x1 |
| 1444 | +; CHECK-NEXT: add x9, sp, #48 |
| 1445 | +; CHECK-NEXT: str q3, [sp, #48] |
| 1446 | +; CHECK-NEXT: str q0, [x9, x8, lsl #4] |
| 1447 | +; CHECK-NEXT: ldp q0, q1, [sp, #48] |
| 1448 | +; CHECK-NEXT: ldp x30, x19, [sp, #80] // 16-byte Folded Reload |
| 1449 | +; CHECK-NEXT: add sp, sp, #96 |
| 1450 | +; CHECK-NEXT: ret |
| 1451 | +entry: |
| 1452 | + %aa = fadd <2 x fp128> %a, %a |
| 1453 | + %d = insertelement <2 x fp128> %aa, fp128 %b, i32 %c |
| 1454 | + ret <2 x fp128> %d |
| 1455 | +} |
| 1456 | + |
1315 | 1457 | define double @extract_v2f64_0(<2 x double> %a, i32 %c) {
|
1316 | 1458 | ; CHECK-LABEL: extract_v2f64_0:
|
1317 | 1459 | ; CHECK: // %bb.0: // %entry
|
@@ -2573,3 +2715,94 @@ entry:
|
2573 | 2715 | %d = extractelement <4 x i64> %a, i32 %c
|
2574 | 2716 | ret i64 %d
|
2575 | 2717 | }
|
| 2718 | + |
| 2719 | +define i128 @extract_v2i128_0(<2 x i128> %a, i32 %c) { |
| 2720 | +; CHECK-LABEL: extract_v2i128_0: |
| 2721 | +; CHECK: // %bb.0: // %entry |
| 2722 | +; CHECK-NEXT: adds x0, x0, x0 |
| 2723 | +; CHECK-NEXT: adc x1, x1, x1 |
| 2724 | +; CHECK-NEXT: ret |
| 2725 | +entry: |
| 2726 | + %b = add <2 x i128> %a, %a |
| 2727 | + %d = extractelement <2 x i128> %b, i32 0 |
| 2728 | + ret i128 %d |
| 2729 | +} |
| 2730 | + |
| 2731 | +define i128 @extract_v2i128_1(<2 x i128> %a, i32 %c) { |
| 2732 | +; CHECK-LABEL: extract_v2i128_1: |
| 2733 | +; CHECK: // %bb.0: // %entry |
| 2734 | +; CHECK-NEXT: adds x0, x2, x2 |
| 2735 | +; CHECK-NEXT: adc x1, x3, x3 |
| 2736 | +; CHECK-NEXT: ret |
| 2737 | +entry: |
| 2738 | + %b = add <2 x i128> %a, %a |
| 2739 | + %d = extractelement <2 x i128> %b, i32 1 |
| 2740 | + ret i128 %d |
| 2741 | +} |
| 2742 | + |
| 2743 | +define i128 @extract_v2i128_c(<2 x i128> %a, i32 %c) { |
| 2744 | +; CHECK-LABEL: extract_v2i128_c: |
| 2745 | +; CHECK: // %bb.0: // %entry |
| 2746 | +; CHECK-NEXT: sub sp, sp, #64 |
| 2747 | +; CHECK-NEXT: .cfi_def_cfa_offset 64 |
| 2748 | +; CHECK-NEXT: adds x9, x0, x0 |
| 2749 | +; CHECK-NEXT: mov w8, w4 |
| 2750 | +; CHECK-NEXT: adc x10, x1, x1 |
| 2751 | +; CHECK-NEXT: adds x11, x2, x2 |
| 2752 | +; CHECK-NEXT: fmov d1, x9 |
| 2753 | +; CHECK-NEXT: fmov d0, x11 |
| 2754 | +; CHECK-NEXT: adc x12, x3, x3 |
| 2755 | +; CHECK-NEXT: add x8, x8, x8 |
| 2756 | +; CHECK-NEXT: and x9, x8, #0x3 |
| 2757 | +; CHECK-NEXT: add w8, w8, #1 |
| 2758 | +; CHECK-NEXT: mov x11, sp |
| 2759 | +; CHECK-NEXT: mov v1.d[1], x10 |
| 2760 | +; CHECK-NEXT: add x10, sp, #32 |
| 2761 | +; CHECK-NEXT: and x8, x8, #0x3 |
| 2762 | +; CHECK-NEXT: mov v0.d[1], x12 |
| 2763 | +; CHECK-NEXT: stp q1, q0, [sp] |
| 2764 | +; CHECK-NEXT: stp q1, q0, [sp, #32] |
| 2765 | +; CHECK-NEXT: ldr x0, [x10, x9, lsl #3] |
| 2766 | +; CHECK-NEXT: ldr x1, [x11, x8, lsl #3] |
| 2767 | +; CHECK-NEXT: add sp, sp, #64 |
| 2768 | +; CHECK-NEXT: ret |
| 2769 | +entry: |
| 2770 | + %b = add <2 x i128> %a, %a |
| 2771 | + %d = extractelement <2 x i128> %b, i32 %c |
| 2772 | + ret i128 %d |
| 2773 | +} |
| 2774 | + |
| 2775 | +define fp128 @extract_v2fp128_0(<2 x fp128> %a, i32 %c) { |
| 2776 | +; CHECK-LABEL: extract_v2fp128_0: |
| 2777 | +; CHECK: // %bb.0: // %entry |
| 2778 | +; CHECK-NEXT: ret |
| 2779 | +entry: |
| 2780 | + %d = extractelement <2 x fp128> %a, i32 0 |
| 2781 | + ret fp128 %d |
| 2782 | +} |
| 2783 | + |
| 2784 | +define fp128 @extract_v2fp128_1(<2 x fp128> %a, i32 %c) { |
| 2785 | +; CHECK-LABEL: extract_v2fp128_1: |
| 2786 | +; CHECK: // %bb.0: // %entry |
| 2787 | +; CHECK-NEXT: mov v0.16b, v1.16b |
| 2788 | +; CHECK-NEXT: ret |
| 2789 | +entry: |
| 2790 | + %d = extractelement <2 x fp128> %a, i32 1 |
| 2791 | + ret fp128 %d |
| 2792 | +} |
| 2793 | + |
| 2794 | +define fp128 @extract_v2fp128_c(<2 x fp128> %a, i32 %c) { |
| 2795 | +; CHECK-LABEL: extract_v2fp128_c: |
| 2796 | +; CHECK: // %bb.0: // %entry |
| 2797 | +; CHECK-NEXT: stp q0, q1, [sp, #-32]! |
| 2798 | +; CHECK-NEXT: .cfi_def_cfa_offset 32 |
| 2799 | +; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 |
| 2800 | +; CHECK-NEXT: and x8, x0, #0x1 |
| 2801 | +; CHECK-NEXT: mov x9, sp |
| 2802 | +; CHECK-NEXT: ldr q0, [x9, x8, lsl #4] |
| 2803 | +; CHECK-NEXT: add sp, sp, #32 |
| 2804 | +; CHECK-NEXT: ret |
| 2805 | +entry: |
| 2806 | + %d = extractelement <2 x fp128> %a, i32 %c |
| 2807 | + ret fp128 %d |
| 2808 | +} |
0 commit comments