
The LIT test cases were migrated with the script provided by Nikita Popov. No manual changes were made. Committed without review since no functional changes, after consultation with uweigand.
316 lines
11 KiB
LLVM
316 lines
11 KiB
LLVM
; Test spilling of vector registers.
|
|
;
|
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
|
|
|
|
; We need to allocate a 16-byte spill slot and save the 8 call-saved FPRs.
|
|
; The frame size should be exactly 160 + 16 + 8 * 8 = 240.
|
|
define void @f1(ptr %ptr) {
|
|
; CHECK-LABEL: f1:
|
|
; CHECK: aghi %r15, -240
|
|
; CHECK-DAG: std %f8,
|
|
; CHECK-DAG: std %f9,
|
|
; CHECK-DAG: std %f10,
|
|
; CHECK-DAG: std %f11,
|
|
; CHECK-DAG: std %f12,
|
|
; CHECK-DAG: std %f13,
|
|
; CHECK-DAG: std %f14,
|
|
; CHECK-DAG: std %f15,
|
|
; CHECK: vst {{%v[0-9]+}}, 160(%r15), 3
|
|
; CHECK: vl {{%v[0-9]+}}, 160(%r15), 3
|
|
; CHECK-DAG: ld %f8,
|
|
; CHECK-DAG: ld %f9,
|
|
; CHECK-DAG: ld %f10,
|
|
; CHECK-DAG: ld %f11,
|
|
; CHECK-DAG: ld %f12,
|
|
; CHECK-DAG: ld %f13,
|
|
; CHECK-DAG: ld %f14,
|
|
; CHECK-DAG: ld %f15,
|
|
; CHECK: aghi %r15, 240
|
|
; CHECK: br %r14
|
|
%v0 = load volatile <16 x i8>, ptr %ptr
|
|
%v1 = load volatile <16 x i8>, ptr %ptr
|
|
%v2 = load volatile <16 x i8>, ptr %ptr
|
|
%v3 = load volatile <16 x i8>, ptr %ptr
|
|
%v4 = load volatile <16 x i8>, ptr %ptr
|
|
%v5 = load volatile <16 x i8>, ptr %ptr
|
|
%v6 = load volatile <16 x i8>, ptr %ptr
|
|
%v7 = load volatile <16 x i8>, ptr %ptr
|
|
%v8 = load volatile <16 x i8>, ptr %ptr
|
|
%v9 = load volatile <16 x i8>, ptr %ptr
|
|
%v10 = load volatile <16 x i8>, ptr %ptr
|
|
%v11 = load volatile <16 x i8>, ptr %ptr
|
|
%v12 = load volatile <16 x i8>, ptr %ptr
|
|
%v13 = load volatile <16 x i8>, ptr %ptr
|
|
%v14 = load volatile <16 x i8>, ptr %ptr
|
|
%v15 = load volatile <16 x i8>, ptr %ptr
|
|
%v16 = load volatile <16 x i8>, ptr %ptr
|
|
%v17 = load volatile <16 x i8>, ptr %ptr
|
|
%v18 = load volatile <16 x i8>, ptr %ptr
|
|
%v19 = load volatile <16 x i8>, ptr %ptr
|
|
%v20 = load volatile <16 x i8>, ptr %ptr
|
|
%v21 = load volatile <16 x i8>, ptr %ptr
|
|
%v22 = load volatile <16 x i8>, ptr %ptr
|
|
%v23 = load volatile <16 x i8>, ptr %ptr
|
|
%v24 = load volatile <16 x i8>, ptr %ptr
|
|
%v25 = load volatile <16 x i8>, ptr %ptr
|
|
%v26 = load volatile <16 x i8>, ptr %ptr
|
|
%v27 = load volatile <16 x i8>, ptr %ptr
|
|
%v28 = load volatile <16 x i8>, ptr %ptr
|
|
%v29 = load volatile <16 x i8>, ptr %ptr
|
|
%v30 = load volatile <16 x i8>, ptr %ptr
|
|
%v31 = load volatile <16 x i8>, ptr %ptr
|
|
%vx = load volatile <16 x i8>, ptr %ptr
|
|
store volatile <16 x i8> %vx, ptr %ptr
|
|
store volatile <16 x i8> %v31, ptr %ptr
|
|
store volatile <16 x i8> %v30, ptr %ptr
|
|
store volatile <16 x i8> %v29, ptr %ptr
|
|
store volatile <16 x i8> %v28, ptr %ptr
|
|
store volatile <16 x i8> %v27, ptr %ptr
|
|
store volatile <16 x i8> %v26, ptr %ptr
|
|
store volatile <16 x i8> %v25, ptr %ptr
|
|
store volatile <16 x i8> %v24, ptr %ptr
|
|
store volatile <16 x i8> %v23, ptr %ptr
|
|
store volatile <16 x i8> %v22, ptr %ptr
|
|
store volatile <16 x i8> %v21, ptr %ptr
|
|
store volatile <16 x i8> %v20, ptr %ptr
|
|
store volatile <16 x i8> %v19, ptr %ptr
|
|
store volatile <16 x i8> %v18, ptr %ptr
|
|
store volatile <16 x i8> %v17, ptr %ptr
|
|
store volatile <16 x i8> %v16, ptr %ptr
|
|
store volatile <16 x i8> %v15, ptr %ptr
|
|
store volatile <16 x i8> %v14, ptr %ptr
|
|
store volatile <16 x i8> %v13, ptr %ptr
|
|
store volatile <16 x i8> %v12, ptr %ptr
|
|
store volatile <16 x i8> %v11, ptr %ptr
|
|
store volatile <16 x i8> %v10, ptr %ptr
|
|
store volatile <16 x i8> %v9, ptr %ptr
|
|
store volatile <16 x i8> %v8, ptr %ptr
|
|
store volatile <16 x i8> %v7, ptr %ptr
|
|
store volatile <16 x i8> %v6, ptr %ptr
|
|
store volatile <16 x i8> %v5, ptr %ptr
|
|
store volatile <16 x i8> %v4, ptr %ptr
|
|
store volatile <16 x i8> %v3, ptr %ptr
|
|
store volatile <16 x i8> %v2, ptr %ptr
|
|
store volatile <16 x i8> %v1, ptr %ptr
|
|
store volatile <16 x i8> %v0, ptr %ptr
|
|
ret void
|
|
}
|
|
|
|
; Like f1, but no 16-byte slot should be needed, and no outgoing reg save
|
|
; area of 160 bytes.
|
|
define void @f2(ptr %ptr) {
|
|
; CHECK-LABEL: f2:
|
|
; CHECK: aghi %r15, -64
|
|
; CHECK-DAG: std %f8,
|
|
; CHECK-DAG: std %f9,
|
|
; CHECK-DAG: std %f10,
|
|
; CHECK-DAG: std %f11,
|
|
; CHECK-DAG: std %f12,
|
|
; CHECK-DAG: std %f13,
|
|
; CHECK-DAG: std %f14,
|
|
; CHECK-DAG: std %f15,
|
|
; CHECK-NOT: vst {{.*}}(%r15)
|
|
; CHECK-NOT: vl {{.*}}(%r15)
|
|
; CHECK-DAG: ld %f8,
|
|
; CHECK-DAG: ld %f9,
|
|
; CHECK-DAG: ld %f10,
|
|
; CHECK-DAG: ld %f11,
|
|
; CHECK-DAG: ld %f12,
|
|
; CHECK-DAG: ld %f13,
|
|
; CHECK-DAG: ld %f14,
|
|
; CHECK-DAG: ld %f15,
|
|
; CHECK: aghi %r15, 64
|
|
; CHECK: br %r14
|
|
%v0 = load volatile <16 x i8>, ptr %ptr
|
|
%v1 = load volatile <16 x i8>, ptr %ptr
|
|
%v2 = load volatile <16 x i8>, ptr %ptr
|
|
%v3 = load volatile <16 x i8>, ptr %ptr
|
|
%v4 = load volatile <16 x i8>, ptr %ptr
|
|
%v5 = load volatile <16 x i8>, ptr %ptr
|
|
%v6 = load volatile <16 x i8>, ptr %ptr
|
|
%v7 = load volatile <16 x i8>, ptr %ptr
|
|
%v8 = load volatile <16 x i8>, ptr %ptr
|
|
%v9 = load volatile <16 x i8>, ptr %ptr
|
|
%v10 = load volatile <16 x i8>, ptr %ptr
|
|
%v11 = load volatile <16 x i8>, ptr %ptr
|
|
%v12 = load volatile <16 x i8>, ptr %ptr
|
|
%v13 = load volatile <16 x i8>, ptr %ptr
|
|
%v14 = load volatile <16 x i8>, ptr %ptr
|
|
%v15 = load volatile <16 x i8>, ptr %ptr
|
|
%v16 = load volatile <16 x i8>, ptr %ptr
|
|
%v17 = load volatile <16 x i8>, ptr %ptr
|
|
%v18 = load volatile <16 x i8>, ptr %ptr
|
|
%v19 = load volatile <16 x i8>, ptr %ptr
|
|
%v20 = load volatile <16 x i8>, ptr %ptr
|
|
%v21 = load volatile <16 x i8>, ptr %ptr
|
|
%v22 = load volatile <16 x i8>, ptr %ptr
|
|
%v23 = load volatile <16 x i8>, ptr %ptr
|
|
%v24 = load volatile <16 x i8>, ptr %ptr
|
|
%v25 = load volatile <16 x i8>, ptr %ptr
|
|
%v26 = load volatile <16 x i8>, ptr %ptr
|
|
%v27 = load volatile <16 x i8>, ptr %ptr
|
|
%v28 = load volatile <16 x i8>, ptr %ptr
|
|
%v29 = load volatile <16 x i8>, ptr %ptr
|
|
%v30 = load volatile <16 x i8>, ptr %ptr
|
|
%v31 = load volatile <16 x i8>, ptr %ptr
|
|
store volatile <16 x i8> %v31, ptr %ptr
|
|
store volatile <16 x i8> %v30, ptr %ptr
|
|
store volatile <16 x i8> %v29, ptr %ptr
|
|
store volatile <16 x i8> %v28, ptr %ptr
|
|
store volatile <16 x i8> %v27, ptr %ptr
|
|
store volatile <16 x i8> %v26, ptr %ptr
|
|
store volatile <16 x i8> %v25, ptr %ptr
|
|
store volatile <16 x i8> %v24, ptr %ptr
|
|
store volatile <16 x i8> %v23, ptr %ptr
|
|
store volatile <16 x i8> %v22, ptr %ptr
|
|
store volatile <16 x i8> %v21, ptr %ptr
|
|
store volatile <16 x i8> %v20, ptr %ptr
|
|
store volatile <16 x i8> %v19, ptr %ptr
|
|
store volatile <16 x i8> %v18, ptr %ptr
|
|
store volatile <16 x i8> %v17, ptr %ptr
|
|
store volatile <16 x i8> %v16, ptr %ptr
|
|
store volatile <16 x i8> %v15, ptr %ptr
|
|
store volatile <16 x i8> %v14, ptr %ptr
|
|
store volatile <16 x i8> %v13, ptr %ptr
|
|
store volatile <16 x i8> %v12, ptr %ptr
|
|
store volatile <16 x i8> %v11, ptr %ptr
|
|
store volatile <16 x i8> %v10, ptr %ptr
|
|
store volatile <16 x i8> %v9, ptr %ptr
|
|
store volatile <16 x i8> %v8, ptr %ptr
|
|
store volatile <16 x i8> %v7, ptr %ptr
|
|
store volatile <16 x i8> %v6, ptr %ptr
|
|
store volatile <16 x i8> %v5, ptr %ptr
|
|
store volatile <16 x i8> %v4, ptr %ptr
|
|
store volatile <16 x i8> %v3, ptr %ptr
|
|
store volatile <16 x i8> %v2, ptr %ptr
|
|
store volatile <16 x i8> %v1, ptr %ptr
|
|
store volatile <16 x i8> %v0, ptr %ptr
|
|
ret void
|
|
}
|
|
|
|
; Like f2, but only %f8 should be saved.
|
|
define void @f3(ptr %ptr) {
|
|
; CHECK-LABEL: f3:
|
|
; CHECK: aghi %r15, -8
|
|
; CHECK-DAG: std %f8,
|
|
; CHECK-NOT: vst {{.*}}(%r15)
|
|
; CHECK-NOT: vl {{.*}}(%r15)
|
|
; CHECK-NOT: %v9
|
|
; CHECK-NOT: %v10
|
|
; CHECK-NOT: %v11
|
|
; CHECK-NOT: %v12
|
|
; CHECK-NOT: %v13
|
|
; CHECK-NOT: %v14
|
|
; CHECK-NOT: %v15
|
|
; CHECK-DAG: ld %f8,
|
|
; CHECK: aghi %r15, 8
|
|
; CHECK: br %r14
|
|
%v0 = load volatile <16 x i8>, ptr %ptr
|
|
%v1 = load volatile <16 x i8>, ptr %ptr
|
|
%v2 = load volatile <16 x i8>, ptr %ptr
|
|
%v3 = load volatile <16 x i8>, ptr %ptr
|
|
%v4 = load volatile <16 x i8>, ptr %ptr
|
|
%v5 = load volatile <16 x i8>, ptr %ptr
|
|
%v6 = load volatile <16 x i8>, ptr %ptr
|
|
%v7 = load volatile <16 x i8>, ptr %ptr
|
|
%v8 = load volatile <16 x i8>, ptr %ptr
|
|
%v16 = load volatile <16 x i8>, ptr %ptr
|
|
%v17 = load volatile <16 x i8>, ptr %ptr
|
|
%v18 = load volatile <16 x i8>, ptr %ptr
|
|
%v19 = load volatile <16 x i8>, ptr %ptr
|
|
%v20 = load volatile <16 x i8>, ptr %ptr
|
|
%v21 = load volatile <16 x i8>, ptr %ptr
|
|
%v22 = load volatile <16 x i8>, ptr %ptr
|
|
%v23 = load volatile <16 x i8>, ptr %ptr
|
|
%v24 = load volatile <16 x i8>, ptr %ptr
|
|
%v25 = load volatile <16 x i8>, ptr %ptr
|
|
%v26 = load volatile <16 x i8>, ptr %ptr
|
|
%v27 = load volatile <16 x i8>, ptr %ptr
|
|
%v28 = load volatile <16 x i8>, ptr %ptr
|
|
%v29 = load volatile <16 x i8>, ptr %ptr
|
|
%v30 = load volatile <16 x i8>, ptr %ptr
|
|
%v31 = load volatile <16 x i8>, ptr %ptr
|
|
store volatile <16 x i8> %v31, ptr %ptr
|
|
store volatile <16 x i8> %v30, ptr %ptr
|
|
store volatile <16 x i8> %v29, ptr %ptr
|
|
store volatile <16 x i8> %v28, ptr %ptr
|
|
store volatile <16 x i8> %v27, ptr %ptr
|
|
store volatile <16 x i8> %v26, ptr %ptr
|
|
store volatile <16 x i8> %v25, ptr %ptr
|
|
store volatile <16 x i8> %v24, ptr %ptr
|
|
store volatile <16 x i8> %v23, ptr %ptr
|
|
store volatile <16 x i8> %v22, ptr %ptr
|
|
store volatile <16 x i8> %v21, ptr %ptr
|
|
store volatile <16 x i8> %v20, ptr %ptr
|
|
store volatile <16 x i8> %v19, ptr %ptr
|
|
store volatile <16 x i8> %v18, ptr %ptr
|
|
store volatile <16 x i8> %v17, ptr %ptr
|
|
store volatile <16 x i8> %v16, ptr %ptr
|
|
store volatile <16 x i8> %v8, ptr %ptr
|
|
store volatile <16 x i8> %v7, ptr %ptr
|
|
store volatile <16 x i8> %v6, ptr %ptr
|
|
store volatile <16 x i8> %v5, ptr %ptr
|
|
store volatile <16 x i8> %v4, ptr %ptr
|
|
store volatile <16 x i8> %v3, ptr %ptr
|
|
store volatile <16 x i8> %v2, ptr %ptr
|
|
store volatile <16 x i8> %v1, ptr %ptr
|
|
store volatile <16 x i8> %v0, ptr %ptr
|
|
ret void
|
|
}
|
|
|
|
; Like f2, but no registers should be saved.
|
|
define void @f4(ptr %ptr) {
|
|
; CHECK-LABEL: f4:
|
|
; CHECK-NOT: %r15
|
|
; CHECK: br %r14
|
|
%v0 = load volatile <16 x i8>, ptr %ptr
|
|
%v1 = load volatile <16 x i8>, ptr %ptr
|
|
%v2 = load volatile <16 x i8>, ptr %ptr
|
|
%v3 = load volatile <16 x i8>, ptr %ptr
|
|
%v4 = load volatile <16 x i8>, ptr %ptr
|
|
%v5 = load volatile <16 x i8>, ptr %ptr
|
|
%v6 = load volatile <16 x i8>, ptr %ptr
|
|
%v7 = load volatile <16 x i8>, ptr %ptr
|
|
%v16 = load volatile <16 x i8>, ptr %ptr
|
|
%v17 = load volatile <16 x i8>, ptr %ptr
|
|
%v18 = load volatile <16 x i8>, ptr %ptr
|
|
%v19 = load volatile <16 x i8>, ptr %ptr
|
|
%v20 = load volatile <16 x i8>, ptr %ptr
|
|
%v21 = load volatile <16 x i8>, ptr %ptr
|
|
%v22 = load volatile <16 x i8>, ptr %ptr
|
|
%v23 = load volatile <16 x i8>, ptr %ptr
|
|
%v24 = load volatile <16 x i8>, ptr %ptr
|
|
%v25 = load volatile <16 x i8>, ptr %ptr
|
|
%v26 = load volatile <16 x i8>, ptr %ptr
|
|
%v27 = load volatile <16 x i8>, ptr %ptr
|
|
%v28 = load volatile <16 x i8>, ptr %ptr
|
|
%v29 = load volatile <16 x i8>, ptr %ptr
|
|
%v30 = load volatile <16 x i8>, ptr %ptr
|
|
%v31 = load volatile <16 x i8>, ptr %ptr
|
|
store volatile <16 x i8> %v31, ptr %ptr
|
|
store volatile <16 x i8> %v30, ptr %ptr
|
|
store volatile <16 x i8> %v29, ptr %ptr
|
|
store volatile <16 x i8> %v28, ptr %ptr
|
|
store volatile <16 x i8> %v27, ptr %ptr
|
|
store volatile <16 x i8> %v26, ptr %ptr
|
|
store volatile <16 x i8> %v25, ptr %ptr
|
|
store volatile <16 x i8> %v24, ptr %ptr
|
|
store volatile <16 x i8> %v23, ptr %ptr
|
|
store volatile <16 x i8> %v22, ptr %ptr
|
|
store volatile <16 x i8> %v21, ptr %ptr
|
|
store volatile <16 x i8> %v20, ptr %ptr
|
|
store volatile <16 x i8> %v19, ptr %ptr
|
|
store volatile <16 x i8> %v18, ptr %ptr
|
|
store volatile <16 x i8> %v17, ptr %ptr
|
|
store volatile <16 x i8> %v16, ptr %ptr
|
|
store volatile <16 x i8> %v7, ptr %ptr
|
|
store volatile <16 x i8> %v6, ptr %ptr
|
|
store volatile <16 x i8> %v5, ptr %ptr
|
|
store volatile <16 x i8> %v4, ptr %ptr
|
|
store volatile <16 x i8> %v3, ptr %ptr
|
|
store volatile <16 x i8> %v2, ptr %ptr
|
|
store volatile <16 x i8> %v1, ptr %ptr
|
|
store volatile <16 x i8> %v0, ptr %ptr
|
|
ret void
|
|
}
|