[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / test / CodeGen / AArch64 / sve-calling-convention.ll
blobb1dabddee695f4752fa05d69e796d3fd871ba9cf
1 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -stop-after=finalize-isel < %s | FileCheck %s
3 ; CHECK-LABEL: name: nosve_signature
4 define i32 @nosve_signature() nounwind {
5   ret i32 42
8 ; CHECK-LABEL: name: sve_signature_ret_vec
9 define <vscale x 4 x i32> @sve_signature_ret_vec() nounwind {
10   ret <vscale x 4 x i32> undef
13 ; CHECK-LABEL: name: sve_signature_ret_pred
14 define <vscale x 4 x i1> @sve_signature_ret_pred() nounwind {
15   ret <vscale x 4 x i1> undef
18 ; CHECK-LABEL: name: sve_signature_arg_vec
19 define void @sve_signature_arg_vec(<vscale x 4 x i32> %arg) nounwind {
20   ret void
23 ; CHECK-LABEL: name: sve_signature_arg_pred
24 define void @sve_signature_arg_pred(<vscale x 4 x i1> %arg) nounwind {
25   ret void
28 ; CHECK-LABEL: name: caller_nosve_signature
29 ; CHECK: BL @nosve_signature, csr_aarch64_aapcs
30 define i32 @caller_nosve_signature() nounwind {
31   %res = call i32 @nosve_signature()
32   ret i32 %res
35 ; CHECK-LABEL: name: sve_signature_ret_vec_caller
36 ; CHECK: BL @sve_signature_ret_vec, csr_aarch64_sve_aapcs
37 define <vscale x 4 x i32>  @sve_signature_ret_vec_caller() nounwind {
38   %res = call <vscale x 4 x i32> @sve_signature_ret_vec()
39   ret <vscale x 4 x i32> %res
42 ; CHECK-LABEL: name: sve_signature_ret_pred_caller
43 ; CHECK: BL @sve_signature_ret_pred, csr_aarch64_sve_aapcs
44 define <vscale x 4 x i1>  @sve_signature_ret_pred_caller() nounwind {
45   %res = call <vscale x 4 x i1> @sve_signature_ret_pred()
46   ret <vscale x 4 x i1> %res
49 ; CHECK-LABEL: name: sve_signature_arg_vec_caller
50 ; CHECK: BL @sve_signature_arg_vec, csr_aarch64_sve_aapcs
51 define void @sve_signature_arg_vec_caller(<vscale x 4 x i32> %arg) nounwind {
52   call void @sve_signature_arg_vec(<vscale x 4 x i32> %arg)
53   ret void
56 ; CHECK-LABEL: name: sve_signature_arg_pred_caller
57 ; CHECK: BL @sve_signature_arg_pred, csr_aarch64_sve_aapcs
58 define void @sve_signature_arg_pred_caller(<vscale x 4 x i1> %arg) nounwind {
59   call void @sve_signature_arg_pred(<vscale x 4 x i1> %arg)
60   ret void
63 ; CHECK-LABEL: name: sve_signature_many_arg_vec
64 ; CHECK: [[RES:%[0-9]+]]:zpr = COPY $z7
65 ; CHECK: $z0 = COPY [[RES]]
66 ; CHECK: RET_ReallyLR implicit $z0
67 define <vscale x 4 x i32> @sve_signature_many_arg_vec(<vscale x 4 x i32> %arg1, <vscale x 4 x i32> %arg2, <vscale x 4 x i32> %arg3, <vscale x 4 x i32> %arg4, <vscale x 4 x i32> %arg5, <vscale x 4 x i32> %arg6, <vscale x 4 x i32> %arg7, <vscale x 4 x i32> %arg8) nounwind {
68   ret <vscale x 4 x i32> %arg8
71 ; CHECK-LABEL: name: sve_signature_many_arg_pred
72 ; CHECK: [[RES:%[0-9]+]]:ppr = COPY $p3
73 ; CHECK: $p0 = COPY [[RES]]
74 ; CHECK: RET_ReallyLR implicit $p0
75 define <vscale x 4 x i1> @sve_signature_many_arg_pred(<vscale x 4 x i1> %arg1, <vscale x 4 x i1> %arg2, <vscale x 4 x i1> %arg3, <vscale x 4 x i1> %arg4) nounwind {
76   ret <vscale x 4 x i1> %arg4
79 ; CHECK-LABEL: name: sve_signature_vec
80 ; CHECK: [[RES:%[0-9]+]]:zpr = COPY $z1
81 ; CHECK: $z0 = COPY [[RES]]
82 ; CHECK: RET_ReallyLR implicit $z0
83 define <vscale x 4 x i32> @sve_signature_vec(<vscale x 4 x i32> %arg1, <vscale x 4 x i32> %arg2) nounwind {
84  ret <vscale x 4 x i32> %arg2
87 ; CHECK-LABEL: name: sve_signature_pred
88 ; CHECK: [[RES:%[0-9]+]]:ppr = COPY $p1
89 ; CHECK: $p0 = COPY [[RES]]
90 ; CHECK: RET_ReallyLR implicit $p0
91 define <vscale x 4 x i1> @sve_signature_pred(<vscale x 4 x i1> %arg1, <vscale x 4 x i1> %arg2) nounwind {
92   ret <vscale x 4 x i1> %arg2
95 ; CHECK-LABEL: name: sve_signature_vec_caller
96 ; CHECK-DAG: [[ARG2:%[0-9]+]]:zpr = COPY $z1
97 ; CHECK-DAG: [[ARG1:%[0-9]+]]:zpr = COPY $z0
98 ; CHECK-DAG: $z0 = COPY [[ARG2]]
99 ; CHECK-DAG: $z1 = COPY [[ARG1]]
100 ; CHECK-NEXT: BL @sve_signature_vec, csr_aarch64_sve_aapcs
101 ; CHECK: [[RES:%[0-9]+]]:zpr = COPY $z0
102 ; CHECK: $z0 = COPY [[RES]]
103 ; CHECK: RET_ReallyLR implicit $z0
104 define <vscale x 4 x i32> @sve_signature_vec_caller(<vscale x 4 x i32> %arg1, <vscale x 4 x i32> %arg2) nounwind {
105   %res = call <vscale x 4 x i32> @sve_signature_vec(<vscale x 4 x i32> %arg2, <vscale x 4 x i32> %arg1)
106   ret <vscale x 4 x i32> %res
109 ; CHECK-LABEL: name: sve_signature_pred_caller
110 ; CHECK-DAG: [[ARG2:%[0-9]+]]:ppr = COPY $p1
111 ; CHECK-DAG: [[ARG1:%[0-9]+]]:ppr = COPY $p0
112 ; CHECK-DAG: $p0 = COPY [[ARG2]]
113 ; CHECK-DAG: $p1 = COPY [[ARG1]]
114 ; CHECK-NEXT: BL @sve_signature_pred, csr_aarch64_sve_aapcs
115 ; CHECK: [[RES:%[0-9]+]]:ppr = COPY $p0
116 ; CHECK: $p0 = COPY [[RES]]
117 ; CHECK: RET_ReallyLR implicit $p0
118 define <vscale x 4 x i1> @sve_signature_pred_caller(<vscale x 4 x i1> %arg1, <vscale x 4 x i1> %arg2) nounwind {
119   %res = call <vscale x 4 x i1> @sve_signature_pred(<vscale x 4 x i1> %arg2, <vscale x 4 x i1> %arg1)
120   ret <vscale x 4 x i1> %res