216 changes: 216 additions & 0 deletions llvm/test/CodeGen/AArch64/spillfill-sve.ll
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,81 @@ define void @fill_nxv16i8() {
ret void
}

define void @fill_nxv8i8() {
; CHECK-LABEL: fill_nxv8i8
; CHECK-DAG: ld1b { z{{[01]}}.h }, p0/z, [sp]
; CHECK-DAG: ld1b { z{{[01]}}.h }, p0/z, [sp, #1, mul vl]
%local0 = alloca <vscale x 8 x i8>
%local1 = alloca <vscale x 8 x i8>
load volatile <vscale x 8 x i8>, <vscale x 8 x i8>* %local0
load volatile <vscale x 8 x i8>, <vscale x 8 x i8>* %local1
ret void
}

define <vscale x 8 x i16> @fill_signed_nxv8i8() {
; CHECK-LABEL: fill_signed_nxv8i8
; CHECK-DAG: ld1sb { z{{[01]}}.h }, p0/z, [sp]
; CHECK-DAG: ld1sb { z{{[01]}}.h }, p0/z, [sp, #1, mul vl]
%local0 = alloca <vscale x 8 x i8>
%local1 = alloca <vscale x 8 x i8>
%a = load volatile <vscale x 8 x i8>, <vscale x 8 x i8>* %local0
%a_ext = sext <vscale x 8 x i8> %a to <vscale x 8 x i16>
%b = load volatile <vscale x 8 x i8>, <vscale x 8 x i8>* %local1
%b_ext = sext <vscale x 8 x i8> %b to <vscale x 8 x i16>
%sum = add <vscale x 8 x i16> %a_ext, %b_ext
ret <vscale x 8 x i16> %sum
}

define void @fill_nxv4i8() {
; CHECK-LABEL: fill_nxv4i8
; CHECK-DAG: ld1b { z{{[01]}}.s }, p0/z, [sp, #3, mul vl]
; CHECK-DAG: ld1b { z{{[01]}}.s }, p0/z, [sp, #2, mul vl]
%local0 = alloca <vscale x 4 x i8>
%local1 = alloca <vscale x 4 x i8>
load volatile <vscale x 4 x i8>, <vscale x 4 x i8>* %local0
load volatile <vscale x 4 x i8>, <vscale x 4 x i8>* %local1
ret void
}

define <vscale x 4 x i32> @fill_signed_nxv4i8() {
; CHECK-LABEL: fill_signed_nxv4i8
; CHECK-DAG: ld1sb { z{{[01]}}.s }, p0/z, [sp, #3, mul vl]
; CHECK-DAG: ld1sb { z{{[01]}}.s }, p0/z, [sp, #2, mul vl]
%local0 = alloca <vscale x 4 x i8>
%local1 = alloca <vscale x 4 x i8>
%a = load volatile <vscale x 4 x i8>, <vscale x 4 x i8>* %local0
%a_ext = sext <vscale x 4 x i8> %a to <vscale x 4 x i32>
%b = load volatile <vscale x 4 x i8>, <vscale x 4 x i8>* %local1
%b_ext = sext <vscale x 4 x i8> %b to <vscale x 4 x i32>
%sum = add <vscale x 4 x i32> %a_ext, %b_ext
ret <vscale x 4 x i32> %sum
}

define void @fill_nxv2i8() {
; CHECK-LABEL: fill_nxv2i8
; CHECK-DAG: ld1b { z{{[01]}}.d }, p0/z, [sp, #7, mul vl]
; CHECK-DAG: ld1b { z{{[01]}}.d }, p0/z, [sp, #6, mul vl]
%local0 = alloca <vscale x 2 x i8>
%local1 = alloca <vscale x 2 x i8>
load volatile <vscale x 2 x i8>, <vscale x 2 x i8>* %local0
load volatile <vscale x 2 x i8>, <vscale x 2 x i8>* %local1
ret void
}

define <vscale x 2 x i64> @fill_signed_nxv2i8() {
; CHECK-LABEL: fill_signed_nxv2i8
; CHECK-DAG: ld1sb { z{{[01]}}.d }, p0/z, [sp, #7, mul vl]
; CHECK-DAG: ld1sb { z{{[01]}}.d }, p0/z, [sp, #6, mul vl]
%local0 = alloca <vscale x 2 x i8>
%local1 = alloca <vscale x 2 x i8>
%a = load volatile <vscale x 2 x i8>, <vscale x 2 x i8>* %local0
%a_ext = sext <vscale x 2 x i8> %a to <vscale x 2 x i64>
%b = load volatile <vscale x 2 x i8>, <vscale x 2 x i8>* %local1
%b_ext = sext <vscale x 2 x i8> %b to <vscale x 2 x i64>
%sum = add <vscale x 2 x i64> %a_ext, %b_ext
ret <vscale x 2 x i64> %sum
}

define void @fill_nxv8i16() {
; CHECK-LABEL: fill_nxv8i16
; CHECK-DAG: ld1h { z{{[01]}}.h }, p0/z, [sp]
Expand All @@ -27,6 +102,56 @@ define void @fill_nxv8i16() {
ret void
}

define void @fill_nxv4i16() {
; CHECK-LABEL: fill_nxv4i16
; CHECK-DAG: ld1h { z{{[01]}}.s }, p0/z, [sp]
; CHECK-DAG: ld1h { z{{[01]}}.s }, p0/z, [sp, #1, mul vl]
%local0 = alloca <vscale x 4 x i16>
%local1 = alloca <vscale x 4 x i16>
load volatile <vscale x 4 x i16>, <vscale x 4 x i16>* %local0
load volatile <vscale x 4 x i16>, <vscale x 4 x i16>* %local1
ret void
}

define <vscale x 4 x i32> @fill_signed_nxv4i16() {
; CHECK-LABEL: fill_signed_nxv4i16
; CHECK-DAG: ld1sh { z{{[01]}}.s }, p0/z, [sp]
; CHECK-DAG: ld1sh { z{{[01]}}.s }, p0/z, [sp, #1, mul vl]
%local0 = alloca <vscale x 4 x i16>
%local1 = alloca <vscale x 4 x i16>
%a = load volatile <vscale x 4 x i16>, <vscale x 4 x i16>* %local0
%a_ext = sext <vscale x 4 x i16> %a to <vscale x 4 x i32>
%b = load volatile <vscale x 4 x i16>, <vscale x 4 x i16>* %local1
%b_ext = sext <vscale x 4 x i16> %b to <vscale x 4 x i32>
%sum = add <vscale x 4 x i32> %a_ext, %b_ext
ret <vscale x 4 x i32> %sum
}

define void @fill_nxv2i16() {
; CHECK-LABEL: fill_nxv2i16
; CHECK-DAG: ld1h { z{{[01]}}.d }, p0/z, [sp, #3, mul vl]
; CHECK-DAG: ld1h { z{{[01]}}.d }, p0/z, [sp, #2, mul vl]
%local0 = alloca <vscale x 2 x i16>
%local1 = alloca <vscale x 2 x i16>
load volatile <vscale x 2 x i16>, <vscale x 2 x i16>* %local0
load volatile <vscale x 2 x i16>, <vscale x 2 x i16>* %local1
ret void
}

define <vscale x 2 x i64> @fill_signed_nxv2i16() {
; CHECK-LABEL: fill_signed_nxv2i16
; CHECK-DAG: ld1sh { z{{[01]}}.d }, p0/z, [sp, #3, mul vl]
; CHECK-DAG: ld1sh { z{{[01]}}.d }, p0/z, [sp, #2, mul vl]
%local0 = alloca <vscale x 2 x i16>
%local1 = alloca <vscale x 2 x i16>
%a = load volatile <vscale x 2 x i16>, <vscale x 2 x i16>* %local0
%a_ext = sext <vscale x 2 x i16> %a to <vscale x 2 x i64>
%b = load volatile <vscale x 2 x i16>, <vscale x 2 x i16>* %local1
%b_ext = sext <vscale x 2 x i16> %b to <vscale x 2 x i64>
%sum = add <vscale x 2 x i64> %a_ext, %b_ext
ret <vscale x 2 x i64> %sum
}

define void @fill_nxv4i32() {
; CHECK-LABEL: fill_nxv4i32
; CHECK-DAG: ld1w { z{{[01]}}.s }, p0/z, [sp]
Expand All @@ -38,6 +163,31 @@ define void @fill_nxv4i32() {
ret void
}

define void @fill_nxv2i32() {
; CHECK-LABEL: fill_nxv2i32
; CHECK-DAG: ld1w { z{{[01]}}.d }, p0/z, [sp]
; CHECK-DAG: ld1w { z{{[01]}}.d }, p0/z, [sp, #1, mul vl]
%local0 = alloca <vscale x 2 x i32>
%local1 = alloca <vscale x 2 x i32>
load volatile <vscale x 2 x i32>, <vscale x 2 x i32>* %local0
load volatile <vscale x 2 x i32>, <vscale x 2 x i32>* %local1
ret void
}

define <vscale x 2 x i64> @fill_signed_nxv2i32() {
; CHECK-LABEL: fill_signed_nxv2i32
; CHECK-DAG: ld1sw { z{{[01]}}.d }, p0/z, [sp]
; CHECK-DAG: ld1sw { z{{[01]}}.d }, p0/z, [sp, #1, mul vl]
%local0 = alloca <vscale x 2 x i32>
%local1 = alloca <vscale x 2 x i32>
%a = load volatile <vscale x 2 x i32>, <vscale x 2 x i32>* %local0
%a_ext = sext <vscale x 2 x i32> %a to <vscale x 2 x i64>
%b = load volatile <vscale x 2 x i32>, <vscale x 2 x i32>* %local1
%b_ext = sext <vscale x 2 x i32> %b to <vscale x 2 x i64>
%sum = add <vscale x 2 x i64> %a_ext, %b_ext
ret <vscale x 2 x i64> %sum
}

define void @fill_nxv2i64() {
; CHECK-LABEL: fill_nxv2i64
; CHECK-DAG: ld1d { z{{[01]}}.d }, p0/z, [sp]
Expand All @@ -63,6 +213,39 @@ define void @spill_nxv16i8(<vscale x 16 x i8> %v0, <vscale x 16 x i8> %v1) {
ret void
}

define void @spill_nxv8i8(<vscale x 8 x i8> %v0, <vscale x 8 x i8> %v1) {
; CHECK-LABEL: spill_nxv8i8
; CHECK-DAG: st1b { z{{[01]}}.h }, p0, [sp]
; CHECK-DAG: st1b { z{{[01]}}.h }, p0, [sp, #1, mul vl]
%local0 = alloca <vscale x 8 x i8>
%local1 = alloca <vscale x 8 x i8>
store volatile <vscale x 8 x i8> %v0, <vscale x 8 x i8>* %local0
store volatile <vscale x 8 x i8> %v1, <vscale x 8 x i8>* %local1
ret void
}

define void @spill_nxv4i8(<vscale x 4 x i8> %v0, <vscale x 4 x i8> %v1) {
; CHECK-LABEL: spill_nxv4i8
; CHECK-DAG: st1b { z{{[01]}}.s }, p0, [sp, #3, mul vl]
; CHECK-DAG: st1b { z{{[01]}}.s }, p0, [sp, #2, mul vl]
%local0 = alloca <vscale x 4 x i8>
%local1 = alloca <vscale x 4 x i8>
store volatile <vscale x 4 x i8> %v0, <vscale x 4 x i8>* %local0
store volatile <vscale x 4 x i8> %v1, <vscale x 4 x i8>* %local1
ret void
}

define void @spill_nxv2i8(<vscale x 2 x i8> %v0, <vscale x 2 x i8> %v1) {
; CHECK-LABEL: spill_nxv2i8
; CHECK-DAG: st1b { z{{[01]}}.d }, p0, [sp, #7, mul vl]
; CHECK-DAG: st1b { z{{[01]}}.d }, p0, [sp, #6, mul vl]
%local0 = alloca <vscale x 2 x i8>
%local1 = alloca <vscale x 2 x i8>
store volatile <vscale x 2 x i8> %v0, <vscale x 2 x i8>* %local0
store volatile <vscale x 2 x i8> %v1, <vscale x 2 x i8>* %local1
ret void
}

define void @spill_nxv8i16(<vscale x 8 x i16> %v0, <vscale x 8 x i16> %v1) {
; CHECK-LABEL: spill_nxv8i16
; CHECK-DAG: st1h { z{{[01]}}.h }, p0, [sp]
Expand All @@ -74,6 +257,28 @@ define void @spill_nxv8i16(<vscale x 8 x i16> %v0, <vscale x 8 x i16> %v1) {
ret void
}

define void @spill_nxv4i16(<vscale x 4 x i16> %v0, <vscale x 4 x i16> %v1) {
; CHECK-LABEL: spill_nxv4i16
; CHECK-DAG: st1h { z{{[01]}}.s }, p0, [sp]
; CHECK-DAG: st1h { z{{[01]}}.s }, p0, [sp, #1, mul vl]
%local0 = alloca <vscale x 4 x i16>
%local1 = alloca <vscale x 4 x i16>
store volatile <vscale x 4 x i16> %v0, <vscale x 4 x i16>* %local0
store volatile <vscale x 4 x i16> %v1, <vscale x 4 x i16>* %local1
ret void
}

define void @spill_nxv2i16(<vscale x 2 x i16> %v0, <vscale x 2 x i16> %v1) {
; CHECK-LABEL: spill_nxv2i16
; CHECK-DAG: st1h { z{{[01]}}.d }, p0, [sp, #3, mul vl]
; CHECK-DAG: st1h { z{{[01]}}.d }, p0, [sp, #2, mul vl]
%local0 = alloca <vscale x 2 x i16>
%local1 = alloca <vscale x 2 x i16>
store volatile <vscale x 2 x i16> %v0, <vscale x 2 x i16>* %local0
store volatile <vscale x 2 x i16> %v1, <vscale x 2 x i16>* %local1
ret void
}

define void @spill_nxv4i32(<vscale x 4 x i32> %v0, <vscale x 4 x i32> %v1) {
; CHECK-LABEL: spill_nxv4i32
; CHECK-DAG: st1w { z{{[01]}}.s }, p0, [sp]
Expand All @@ -85,6 +290,17 @@ define void @spill_nxv4i32(<vscale x 4 x i32> %v0, <vscale x 4 x i32> %v1) {
ret void
}

define void @spill_nxv2i32(<vscale x 2 x i32> %v0, <vscale x 2 x i32> %v1) {
; CHECK-LABEL: spill_nxv2i32
; CHECK-DAG: st1w { z{{[01]}}.d }, p0, [sp]
; CHECK-DAG: st1w { z{{[01]}}.d }, p0, [sp, #1, mul vl]
%local0 = alloca <vscale x 2 x i32>
%local1 = alloca <vscale x 2 x i32>
store volatile <vscale x 2 x i32> %v0, <vscale x 2 x i32>* %local0
store volatile <vscale x 2 x i32> %v1, <vscale x 2 x i32>* %local1
ret void
}

define void @spill_nxv2i64(<vscale x 2 x i64> %v0, <vscale x 2 x i64> %v1) {
; CHECK-LABEL: spill_nxv2i64
; CHECK-DAG: st1d { z{{[01]}}.d }, p0, [sp]
Expand Down