diff options
Diffstat (limited to 'llvm/test/CodeGen/AArch64/insertextract.ll')
| -rw-r--r-- | llvm/test/CodeGen/AArch64/insertextract.ll | 429 |
1 files changed, 293 insertions, 136 deletions
diff --git a/llvm/test/CodeGen/AArch64/insertextract.ll b/llvm/test/CodeGen/AArch64/insertextract.ll index 13a43d6d3523..a9167ad6ebb7 100644 --- a/llvm/test/CodeGen/AArch64/insertextract.ll +++ b/llvm/test/CodeGen/AArch64/insertextract.ll @@ -1,17 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD -; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI - -; CHECK-GI: warning: Instruction selection used fallback path for insert_v2i128_0 -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_v2i128_1 -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_v2i128_c -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_v2fp128_0 -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_v2fp128_1 -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_v2fp128_c -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for extract_v2i128_0 -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for extract_v2i128_1 -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for extract_v2i128_c -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for extract_v2fp128_c +; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI define <2 x double> @insert_v2f64_0(<2 x double> %a, double %b, i32 %c) { ; CHECK-LABEL: insert_v2f64_0: @@ -1324,13 +1313,21 @@ entry: } define <2 x i128> @insert_v2i128_0(<2 x i128> %a, i128 %b, i32 %c) { -; CHECK-LABEL: insert_v2i128_0: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: adds x2, x2, x2 -; CHECK-NEXT: mov x1, x5 -; CHECK-NEXT: mov x0, x4 -; CHECK-NEXT: adc x3, x3, x3 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: insert_v2i128_0: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: adds x2, x2, x2 +; CHECK-SD-NEXT: mov x1, x5 +; CHECK-SD-NEXT: mov x0, x4 +; CHECK-SD-NEXT: adc x3, x3, x3 +; CHECK-SD-NEXT: ret +; +; CHECK-GI-LABEL: insert_v2i128_0: +; CHECK-GI: // %bb.0: // %entry +; CHECK-GI-NEXT: adds x2, x2, x2 +; CHECK-GI-NEXT: mov x0, x4 +; CHECK-GI-NEXT: mov x1, x5 +; CHECK-GI-NEXT: adc x3, x3, x3 +; CHECK-GI-NEXT: ret entry: %aa = add <2 x i128> %a, %a %d = insertelement <2 x i128> %aa, i128 %b, i32 0 @@ -1338,13 +1335,21 @@ entry: } define <2 x i128> @insert_v2i128_1(<2 x i128> %a, i128 %b, i32 %c) { -; CHECK-LABEL: insert_v2i128_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: adds x0, x0, x0 -; CHECK-NEXT: mov x3, x5 -; CHECK-NEXT: mov x2, x4 -; CHECK-NEXT: adc x1, x1, x1 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: insert_v2i128_1: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: adds x0, x0, x0 +; CHECK-SD-NEXT: mov x3, x5 +; CHECK-SD-NEXT: mov x2, x4 +; CHECK-SD-NEXT: adc x1, x1, x1 +; CHECK-SD-NEXT: ret +; +; CHECK-GI-LABEL: insert_v2i128_1: +; CHECK-GI: // %bb.0: // %entry +; CHECK-GI-NEXT: adds x0, x0, x0 +; CHECK-GI-NEXT: mov x2, x4 +; CHECK-GI-NEXT: mov x3, x5 +; CHECK-GI-NEXT: adc x1, x1, x1 +; CHECK-GI-NEXT: ret entry: %aa = add <2 x i128> %a, %a %d = insertelement <2 x i128> %aa, i128 %b, i32 1 @@ -1352,28 +1357,63 @@ entry: } define <2 x i128> @insert_v2i128_c(<2 x i128> %a, i128 %b, i32 %c) { -; CHECK-LABEL: insert_v2i128_c: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: sub sp, sp, #32 -; CHECK-NEXT: .cfi_def_cfa_offset 32 -; CHECK-NEXT: // kill: def $w6 killed $w6 def $x6 -; CHECK-NEXT: adds x8, x0, x0 -; CHECK-NEXT: and x11, x6, #0x1 -; CHECK-NEXT: mov x12, sp -; CHECK-NEXT: adc x9, x1, x1 -; CHECK-NEXT: adds x10, x2, x2 -; CHECK-NEXT: add x11, x12, x11, lsl #4 -; CHECK-NEXT: str x8, [sp] -; CHECK-NEXT: adc x8, x3, x3 -; CHECK-NEXT: str x10, [sp, #16] -; CHECK-NEXT: str x4, [x11] -; CHECK-NEXT: str x8, [sp, #24] -; CHECK-NEXT: str x9, [sp, #8] -; CHECK-NEXT: str x5, [x11, #8] -; CHECK-NEXT: ldp x0, x1, [sp] -; CHECK-NEXT: ldp x2, x3, [sp, #16] -; CHECK-NEXT: add sp, sp, #32 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: insert_v2i128_c: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: sub sp, sp, #32 +; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 +; CHECK-SD-NEXT: // kill: def $w6 killed $w6 def $x6 +; CHECK-SD-NEXT: adds x8, x0, x0 +; CHECK-SD-NEXT: and x11, x6, #0x1 +; CHECK-SD-NEXT: mov x12, sp +; CHECK-SD-NEXT: adc x9, x1, x1 +; CHECK-SD-NEXT: adds x10, x2, x2 +; CHECK-SD-NEXT: add x11, x12, x11, lsl #4 +; CHECK-SD-NEXT: str x8, [sp] +; CHECK-SD-NEXT: adc x8, x3, x3 +; CHECK-SD-NEXT: str x10, [sp, #16] +; CHECK-SD-NEXT: str x4, [x11] +; CHECK-SD-NEXT: str x8, [sp, #24] +; CHECK-SD-NEXT: str x9, [sp, #8] +; CHECK-SD-NEXT: str x5, [x11, #8] +; CHECK-SD-NEXT: ldp x0, x1, [sp] +; CHECK-SD-NEXT: ldp x2, x3, [sp, #16] +; CHECK-SD-NEXT: add sp, sp, #32 +; CHECK-SD-NEXT: ret +; +; CHECK-GI-LABEL: insert_v2i128_c: +; CHECK-GI: // %bb.0: // %entry +; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill +; CHECK-GI-NEXT: sub x9, sp, #48 +; CHECK-GI-NEXT: mov x29, sp +; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 +; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 +; CHECK-GI-NEXT: .cfi_offset w30, -8 +; CHECK-GI-NEXT: .cfi_offset w29, -16 +; CHECK-GI-NEXT: adds x8, x0, x0 +; CHECK-GI-NEXT: mov v2.d[0], x4 +; CHECK-GI-NEXT: adc x9, x1, x1 +; CHECK-GI-NEXT: mov v0.d[0], x8 +; CHECK-GI-NEXT: adds x8, x2, x2 +; CHECK-GI-NEXT: mov v1.d[0], x8 +; CHECK-GI-NEXT: adc x8, x3, x3 +; CHECK-GI-NEXT: mov v2.d[1], x5 +; CHECK-GI-NEXT: mov v0.d[1], x9 +; CHECK-GI-NEXT: mov x9, sp +; CHECK-GI-NEXT: mov v1.d[1], x8 +; CHECK-GI-NEXT: mov w8, w6 +; CHECK-GI-NEXT: and x8, x8, #0x1 +; CHECK-GI-NEXT: stp q0, q1, [sp] +; CHECK-GI-NEXT: str q2, [x9, x8, lsl #4] +; CHECK-GI-NEXT: ldp q0, q1, [sp] +; CHECK-GI-NEXT: mov d2, v0.d[1] +; CHECK-GI-NEXT: mov d3, v1.d[1] +; CHECK-GI-NEXT: fmov x0, d0 +; CHECK-GI-NEXT: fmov x2, d1 +; CHECK-GI-NEXT: fmov x1, d2 +; CHECK-GI-NEXT: fmov x3, d3 +; CHECK-GI-NEXT: mov sp, x29 +; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload +; CHECK-GI-NEXT: ret entry: %aa = add <2 x i128> %a, %a %d = insertelement <2 x i128> %aa, i128 %b, i32 %c @@ -1381,20 +1421,38 @@ entry: } define <2 x fp128> @insert_v2fp128_0(<2 x fp128> %a, fp128 %b, i32 %c) { -; CHECK-LABEL: insert_v2fp128_0: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: sub sp, sp, #32 -; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill -; CHECK-NEXT: .cfi_def_cfa_offset 32 -; CHECK-NEXT: .cfi_offset w30, -16 -; CHECK-NEXT: mov v0.16b, v1.16b -; CHECK-NEXT: str q2, [sp] // 16-byte Folded Spill -; CHECK-NEXT: bl __addtf3 -; CHECK-NEXT: mov v1.16b, v0.16b -; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload -; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload -; CHECK-NEXT: add sp, sp, #32 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: insert_v2fp128_0: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: sub sp, sp, #32 +; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill +; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 +; CHECK-SD-NEXT: .cfi_offset w30, -16 +; CHECK-SD-NEXT: mov v0.16b, v1.16b +; CHECK-SD-NEXT: str q2, [sp] // 16-byte Folded Spill +; CHECK-SD-NEXT: bl __addtf3 +; CHECK-SD-NEXT: mov v1.16b, v0.16b +; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload +; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload +; CHECK-SD-NEXT: add sp, sp, #32 +; CHECK-SD-NEXT: ret +; +; CHECK-GI-LABEL: insert_v2fp128_0: +; CHECK-GI: // %bb.0: // %entry +; CHECK-GI-NEXT: sub sp, sp, #48 +; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill +; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 +; CHECK-GI-NEXT: .cfi_offset w30, -16 +; CHECK-GI-NEXT: stp q1, q2, [sp] // 32-byte Folded Spill +; CHECK-GI-NEXT: mov v1.16b, v0.16b +; CHECK-GI-NEXT: bl __addtf3 +; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload +; CHECK-GI-NEXT: mov v1.16b, v0.16b +; CHECK-GI-NEXT: bl __addtf3 +; CHECK-GI-NEXT: mov v1.16b, v0.16b +; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload +; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload +; CHECK-GI-NEXT: add sp, sp, #48 +; CHECK-GI-NEXT: ret entry: %aa = fadd <2 x fp128> %a, %a %d = insertelement <2 x fp128> %aa, fp128 %b, i32 0 @@ -1402,19 +1460,38 @@ entry: } define <2 x fp128> @insert_v2fp128_1(<2 x fp128> %a, fp128 %b, i32 %c) { -; CHECK-LABEL: insert_v2fp128_1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: sub sp, sp, #32 -; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill -; CHECK-NEXT: .cfi_def_cfa_offset 32 -; CHECK-NEXT: .cfi_offset w30, -16 -; CHECK-NEXT: mov v1.16b, v0.16b -; CHECK-NEXT: str q2, [sp] // 16-byte Folded Spill -; CHECK-NEXT: bl __addtf3 -; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload -; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload -; CHECK-NEXT: add sp, sp, #32 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: insert_v2fp128_1: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: sub sp, sp, #32 +; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill +; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 +; CHECK-SD-NEXT: .cfi_offset w30, -16 +; CHECK-SD-NEXT: mov v1.16b, v0.16b +; CHECK-SD-NEXT: str q2, [sp] // 16-byte Folded Spill +; CHECK-SD-NEXT: bl __addtf3 +; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload +; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload +; CHECK-SD-NEXT: add sp, sp, #32 +; CHECK-SD-NEXT: ret +; +; CHECK-GI-LABEL: insert_v2fp128_1: +; CHECK-GI: // %bb.0: // %entry +; CHECK-GI-NEXT: sub sp, sp, #64 +; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Folded Spill +; CHECK-GI-NEXT: .cfi_def_cfa_offset 64 +; CHECK-GI-NEXT: .cfi_offset w30, -16 +; CHECK-GI-NEXT: stp q1, q2, [sp, #16] // 32-byte Folded Spill +; CHECK-GI-NEXT: mov v1.16b, v0.16b +; CHECK-GI-NEXT: bl __addtf3 +; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill +; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload +; CHECK-GI-NEXT: mov v1.16b, v0.16b +; CHECK-GI-NEXT: bl __addtf3 +; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload +; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload +; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload +; CHECK-GI-NEXT: add sp, sp, #64 +; CHECK-GI-NEXT: ret entry: %aa = fadd <2 x fp128> %a, %a %d = insertelement <2 x fp128> %aa, fp128 %b, i32 1 @@ -1422,32 +1499,65 @@ entry: } define <2 x fp128> @insert_v2fp128_c(<2 x fp128> %a, fp128 %b, i32 %c) { -; CHECK-LABEL: insert_v2fp128_c: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: sub sp, sp, #96 -; CHECK-NEXT: stp x30, x19, [sp, #80] // 16-byte Folded Spill -; CHECK-NEXT: .cfi_def_cfa_offset 96 -; CHECK-NEXT: .cfi_offset w19, -8 -; CHECK-NEXT: .cfi_offset w30, -16 -; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill -; CHECK-NEXT: mov v1.16b, v0.16b -; CHECK-NEXT: mov w19, w0 -; CHECK-NEXT: str q2, [sp, #32] // 16-byte Folded Spill -; CHECK-NEXT: bl __addtf3 -; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill -; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload -; CHECK-NEXT: mov v1.16b, v0.16b -; CHECK-NEXT: bl __addtf3 -; CHECK-NEXT: str q0, [sp, #64] -; CHECK-NEXT: ldp q3, q0, [sp, #16] // 32-byte Folded Reload -; CHECK-NEXT: and x8, x19, #0x1 -; CHECK-NEXT: add x9, sp, #48 -; CHECK-NEXT: str q3, [sp, #48] -; CHECK-NEXT: str q0, [x9, x8, lsl #4] -; CHECK-NEXT: ldp q0, q1, [sp, #48] -; CHECK-NEXT: ldp x30, x19, [sp, #80] // 16-byte Folded Reload -; CHECK-NEXT: add sp, sp, #96 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: insert_v2fp128_c: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: sub sp, sp, #96 +; CHECK-SD-NEXT: stp x30, x19, [sp, #80] // 16-byte Folded Spill +; CHECK-SD-NEXT: .cfi_def_cfa_offset 96 +; CHECK-SD-NEXT: .cfi_offset w19, -8 +; CHECK-SD-NEXT: .cfi_offset w30, -16 +; CHECK-SD-NEXT: str q1, [sp] // 16-byte Folded Spill +; CHECK-SD-NEXT: mov v1.16b, v0.16b +; CHECK-SD-NEXT: mov w19, w0 +; CHECK-SD-NEXT: str q2, [sp, #32] // 16-byte Folded Spill +; CHECK-SD-NEXT: bl __addtf3 +; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill +; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload +; CHECK-SD-NEXT: mov v1.16b, v0.16b +; CHECK-SD-NEXT: bl __addtf3 +; CHECK-SD-NEXT: str q0, [sp, #64] +; CHECK-SD-NEXT: ldp q3, q0, [sp, #16] // 32-byte Folded Reload +; CHECK-SD-NEXT: and x8, x19, #0x1 +; CHECK-SD-NEXT: add x9, sp, #48 +; CHECK-SD-NEXT: str q3, [sp, #48] +; CHECK-SD-NEXT: str q0, [x9, x8, lsl #4] +; CHECK-SD-NEXT: ldp q0, q1, [sp, #48] +; CHECK-SD-NEXT: ldp x30, x19, [sp, #80] // 16-byte Folded Reload +; CHECK-SD-NEXT: add sp, sp, #96 +; CHECK-SD-NEXT: ret +; +; CHECK-GI-LABEL: insert_v2fp128_c: +; CHECK-GI: // %bb.0: // %entry +; CHECK-GI-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill +; CHECK-GI-NEXT: sub x9, sp, #96 +; CHECK-GI-NEXT: str x19, [sp, #16] // 8-byte Folded Spill +; CHECK-GI-NEXT: mov x29, sp +; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 +; CHECK-GI-NEXT: .cfi_def_cfa w29, 32 +; CHECK-GI-NEXT: .cfi_offset w19, -16 +; CHECK-GI-NEXT: .cfi_offset w30, -24 +; CHECK-GI-NEXT: .cfi_offset w29, -32 +; CHECK-GI-NEXT: str q1, [sp, #16] // 16-byte Folded Spill +; CHECK-GI-NEXT: mov v1.16b, v0.16b +; CHECK-GI-NEXT: mov w19, w0 +; CHECK-GI-NEXT: str q2, [sp, #48] // 16-byte Folded Spill +; CHECK-GI-NEXT: bl __addtf3 +; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill +; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload +; CHECK-GI-NEXT: mov v1.16b, v0.16b +; CHECK-GI-NEXT: bl __addtf3 +; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload +; CHECK-GI-NEXT: mov w8, w19 +; CHECK-GI-NEXT: add x9, sp, #64 +; CHECK-GI-NEXT: and x8, x8, #0x1 +; CHECK-GI-NEXT: stp q1, q0, [sp, #64] +; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload +; CHECK-GI-NEXT: str q0, [x9, x8, lsl #4] +; CHECK-GI-NEXT: ldp q0, q1, [sp, #64] +; CHECK-GI-NEXT: mov sp, x29 +; CHECK-GI-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload +; CHECK-GI-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload +; CHECK-GI-NEXT: ret entry: %aa = fadd <2 x fp128> %a, %a %d = insertelement <2 x fp128> %aa, fp128 %b, i32 %c @@ -2741,31 +2851,60 @@ entry: } define i128 @extract_v2i128_c(<2 x i128> %a, i32 %c) { -; CHECK-LABEL: extract_v2i128_c: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: sub sp, sp, #64 -; CHECK-NEXT: .cfi_def_cfa_offset 64 -; CHECK-NEXT: adds x9, x0, x0 -; CHECK-NEXT: mov w8, w4 -; CHECK-NEXT: adc x10, x1, x1 -; CHECK-NEXT: adds x11, x2, x2 -; CHECK-NEXT: fmov d1, x9 -; CHECK-NEXT: fmov d0, x11 -; CHECK-NEXT: adc x12, x3, x3 -; CHECK-NEXT: add x8, x8, x8 -; CHECK-NEXT: and x9, x8, #0x3 -; CHECK-NEXT: add w8, w8, #1 -; CHECK-NEXT: mov x11, sp -; CHECK-NEXT: mov v1.d[1], x10 -; CHECK-NEXT: add x10, sp, #32 -; CHECK-NEXT: and x8, x8, #0x3 -; CHECK-NEXT: mov v0.d[1], x12 -; CHECK-NEXT: stp q1, q0, [sp] -; CHECK-NEXT: stp q1, q0, [sp, #32] -; CHECK-NEXT: ldr x0, [x10, x9, lsl #3] -; CHECK-NEXT: ldr x1, [x11, x8, lsl #3] -; CHECK-NEXT: add sp, sp, #64 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: extract_v2i128_c: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: sub sp, sp, #64 +; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 +; CHECK-SD-NEXT: adds x9, x0, x0 +; CHECK-SD-NEXT: mov w8, w4 +; CHECK-SD-NEXT: adc x10, x1, x1 +; CHECK-SD-NEXT: adds x11, x2, x2 +; CHECK-SD-NEXT: fmov d1, x9 +; CHECK-SD-NEXT: fmov d0, x11 +; CHECK-SD-NEXT: adc x12, x3, x3 +; CHECK-SD-NEXT: add x8, x8, x8 +; CHECK-SD-NEXT: and x9, x8, #0x3 +; CHECK-SD-NEXT: add w8, w8, #1 +; CHECK-SD-NEXT: mov x11, sp +; CHECK-SD-NEXT: mov v1.d[1], x10 +; CHECK-SD-NEXT: add x10, sp, #32 +; CHECK-SD-NEXT: and x8, x8, #0x3 +; CHECK-SD-NEXT: mov v0.d[1], x12 +; CHECK-SD-NEXT: stp q1, q0, [sp] +; CHECK-SD-NEXT: stp q1, q0, [sp, #32] +; CHECK-SD-NEXT: ldr x0, [x10, x9, lsl #3] +; CHECK-SD-NEXT: ldr x1, [x11, x8, lsl #3] +; CHECK-SD-NEXT: add sp, sp, #64 +; CHECK-SD-NEXT: ret +; +; CHECK-GI-LABEL: extract_v2i128_c: +; CHECK-GI: // %bb.0: // %entry +; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill +; CHECK-GI-NEXT: sub x9, sp, #48 +; CHECK-GI-NEXT: mov x29, sp +; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 +; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 +; CHECK-GI-NEXT: .cfi_offset w30, -8 +; CHECK-GI-NEXT: .cfi_offset w29, -16 +; CHECK-GI-NEXT: adds x8, x0, x0 +; CHECK-GI-NEXT: adc x9, x1, x1 +; CHECK-GI-NEXT: mov v0.d[0], x8 +; CHECK-GI-NEXT: adds x8, x2, x2 +; CHECK-GI-NEXT: mov v1.d[0], x8 +; CHECK-GI-NEXT: adc x8, x3, x3 +; CHECK-GI-NEXT: mov v0.d[1], x9 +; CHECK-GI-NEXT: mov x9, sp +; CHECK-GI-NEXT: mov v1.d[1], x8 +; CHECK-GI-NEXT: mov w8, w4 +; CHECK-GI-NEXT: and x8, x8, #0x1 +; CHECK-GI-NEXT: stp q0, q1, [sp] +; CHECK-GI-NEXT: ldr q0, [x9, x8, lsl #4] +; CHECK-GI-NEXT: mov d1, v0.d[1] +; CHECK-GI-NEXT: fmov x0, d0 +; CHECK-GI-NEXT: fmov x1, d1 +; CHECK-GI-NEXT: mov sp, x29 +; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload +; CHECK-GI-NEXT: ret entry: %b = add <2 x i128> %a, %a %d = extractelement <2 x i128> %b, i32 %c @@ -2792,16 +2931,34 @@ entry: } define fp128 @extract_v2fp128_c(<2 x fp128> %a, i32 %c) { -; CHECK-LABEL: extract_v2fp128_c: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: stp q0, q1, [sp, #-32]! -; CHECK-NEXT: .cfi_def_cfa_offset 32 -; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 -; CHECK-NEXT: and x8, x0, #0x1 -; CHECK-NEXT: mov x9, sp -; CHECK-NEXT: ldr q0, [x9, x8, lsl #4] -; CHECK-NEXT: add sp, sp, #32 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: extract_v2fp128_c: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! +; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 +; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 +; CHECK-SD-NEXT: and x8, x0, #0x1 +; CHECK-SD-NEXT: mov x9, sp +; CHECK-SD-NEXT: ldr q0, [x9, x8, lsl #4] +; CHECK-SD-NEXT: add sp, sp, #32 +; CHECK-SD-NEXT: ret +; +; CHECK-GI-LABEL: extract_v2fp128_c: +; CHECK-GI: // %bb.0: // %entry +; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill +; CHECK-GI-NEXT: sub x9, sp, #48 +; CHECK-GI-NEXT: mov x29, sp +; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 +; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 +; CHECK-GI-NEXT: .cfi_offset w30, -8 +; CHECK-GI-NEXT: .cfi_offset w29, -16 +; CHECK-GI-NEXT: mov w8, w0 +; CHECK-GI-NEXT: stp q0, q1, [sp] +; CHECK-GI-NEXT: mov x9, sp +; CHECK-GI-NEXT: and x8, x8, #0x1 +; CHECK-GI-NEXT: ldr q0, [x9, x8, lsl #4] +; CHECK-GI-NEXT: mov sp, x29 +; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload +; CHECK-GI-NEXT: ret entry: %d = extractelement <2 x fp128> %a, i32 %c ret fp128 %d |
