1 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s
2 // RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s
3
4 #include <arm_sve.h>
5
6 #ifdef SVE_OVERLOADED_FORMS
7 // A simple used,unused... macro, long enough to represent any SVE builtin.
8 #define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3
9 #else
10 #define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4
11 #endif
12
test_svld4_s8(svbool_t pg,const int8_t * base)13 svint8x4_t test_svld4_s8(svbool_t pg, const int8_t *base)
14 {
15 // CHECK-LABEL: test_svld4_s8
16 // CHECK: %[[LOAD:.*]] = call <vscale x 64 x i8> @llvm.aarch64.sve.ld4.nxv64i8.nxv16i1(<vscale x 16 x i1> %pg, i8* %base)
17 // CHECK-NEXT: ret <vscale x 64 x i8> %[[LOAD]]
18 return SVE_ACLE_FUNC(svld4,_s8,,)(pg, base);
19 }
20
test_svld4_s16(svbool_t pg,const int16_t * base)21 svint16x4_t test_svld4_s16(svbool_t pg, const int16_t *base)
22 {
23 // CHECK-LABEL: test_svld4_s16
24 // CHECK: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
25 // CHECK: %[[LOAD:.*]] = call <vscale x 32 x i16> @llvm.aarch64.sve.ld4.nxv32i16.nxv8i1(<vscale x 8 x i1> %[[PG]], i16* %base)
26 // CHECK-NEXT: ret <vscale x 32 x i16> %[[LOAD]]
27 return SVE_ACLE_FUNC(svld4,_s16,,)(pg, base);
28 }
29
test_svld4_s32(svbool_t pg,const int32_t * base)30 svint32x4_t test_svld4_s32(svbool_t pg, const int32_t *base)
31 {
32 // CHECK-LABEL: test_svld4_s32
33 // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
34 // CHECK: %[[LOAD:.*]] = call <vscale x 16 x i32> @llvm.aarch64.sve.ld4.nxv16i32.nxv4i1(<vscale x 4 x i1> %[[PG]], i32* %base)
35 // CHECK-NEXT: ret <vscale x 16 x i32> %[[LOAD]]
36 return SVE_ACLE_FUNC(svld4,_s32,,)(pg, base);
37 }
38
test_svld4_s64(svbool_t pg,const int64_t * base)39 svint64x4_t test_svld4_s64(svbool_t pg, const int64_t *base)
40 {
41 // CHECK-LABEL: test_svld4_s64
42 // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
43 // CHECK: %[[LOAD:.*]] = call <vscale x 8 x i64> @llvm.aarch64.sve.ld4.nxv8i64.nxv2i1(<vscale x 2 x i1> %[[PG]], i64* %base)
44 // CHECK-NEXT: ret <vscale x 8 x i64> %[[LOAD]]
45 return SVE_ACLE_FUNC(svld4,_s64,,)(pg, base);
46 }
47
test_svld4_u8(svbool_t pg,const uint8_t * base)48 svuint8x4_t test_svld4_u8(svbool_t pg, const uint8_t *base)
49 {
50 // CHECK-LABEL: test_svld4_u8
51 // CHECK: %[[LOAD:.*]] = call <vscale x 64 x i8> @llvm.aarch64.sve.ld4.nxv64i8.nxv16i1(<vscale x 16 x i1> %pg, i8* %base)
52 // CHECK-NEXT: ret <vscale x 64 x i8> %[[LOAD]]
53 return SVE_ACLE_FUNC(svld4,_u8,,)(pg, base);
54 }
55
test_svld4_u16(svbool_t pg,const uint16_t * base)56 svuint16x4_t test_svld4_u16(svbool_t pg, const uint16_t *base)
57 {
58 // CHECK-LABEL: test_svld4_u16
59 // CHECK: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
60 // CHECK: %[[LOAD:.*]] = call <vscale x 32 x i16> @llvm.aarch64.sve.ld4.nxv32i16.nxv8i1(<vscale x 8 x i1> %[[PG]], i16* %base)
61 // CHECK-NEXT: ret <vscale x 32 x i16> %[[LOAD]]
62 return SVE_ACLE_FUNC(svld4,_u16,,)(pg, base);
63 }
64
test_svld4_u32(svbool_t pg,const uint32_t * base)65 svuint32x4_t test_svld4_u32(svbool_t pg, const uint32_t *base)
66 {
67 // CHECK-LABEL: test_svld4_u32
68 // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
69 // CHECK: %[[LOAD:.*]] = call <vscale x 16 x i32> @llvm.aarch64.sve.ld4.nxv16i32.nxv4i1(<vscale x 4 x i1> %[[PG]], i32* %base)
70 // CHECK-NEXT: ret <vscale x 16 x i32> %[[LOAD]]
71 return SVE_ACLE_FUNC(svld4,_u32,,)(pg, base);
72 }
73
test_svld4_u64(svbool_t pg,const uint64_t * base)74 svuint64x4_t test_svld4_u64(svbool_t pg, const uint64_t *base)
75 {
76 // CHECK-LABEL: test_svld4_u64
77 // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
78 // CHECK: %[[LOAD:.*]] = call <vscale x 8 x i64> @llvm.aarch64.sve.ld4.nxv8i64.nxv2i1(<vscale x 2 x i1> %[[PG]], i64* %base)
79 // CHECK-NEXT: ret <vscale x 8 x i64> %[[LOAD]]
80 return SVE_ACLE_FUNC(svld4,_u64,,)(pg, base);
81 }
82
test_svld4_f16(svbool_t pg,const float16_t * base)83 svfloat16x4_t test_svld4_f16(svbool_t pg, const float16_t *base)
84 {
85 // CHECK-LABEL: test_svld4_f16
86 // CHECK: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
87 // CHECK: %[[LOAD:.*]] = call <vscale x 32 x half> @llvm.aarch64.sve.ld4.nxv32f16.nxv8i1(<vscale x 8 x i1> %[[PG]], half* %base)
88 // CHECK-NEXT: ret <vscale x 32 x half> %[[LOAD]]
89 return SVE_ACLE_FUNC(svld4,_f16,,)(pg, base);
90 }
91
test_svld4_f32(svbool_t pg,const float32_t * base)92 svfloat32x4_t test_svld4_f32(svbool_t pg, const float32_t *base)
93 {
94 // CHECK-LABEL: test_svld4_f32
95 // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
96 // CHECK: %[[LOAD:.*]] = call <vscale x 16 x float> @llvm.aarch64.sve.ld4.nxv16f32.nxv4i1(<vscale x 4 x i1> %[[PG]], float* %base)
97 // CHECK-NEXT: ret <vscale x 16 x float> %[[LOAD]]
98 return SVE_ACLE_FUNC(svld4,_f32,,)(pg, base);
99 }
100
test_svld4_f64(svbool_t pg,const float64_t * base)101 svfloat64x4_t test_svld4_f64(svbool_t pg, const float64_t *base)
102 {
103 // CHECK-LABEL: test_svld4_f64
104 // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
105 // CHECK: %[[LOAD:.*]] = call <vscale x 8 x double> @llvm.aarch64.sve.ld4.nxv8f64.nxv2i1(<vscale x 2 x i1> %[[PG]], double* %base)
106 // CHECK-NEXT: ret <vscale x 8 x double> %[[LOAD]]
107 return SVE_ACLE_FUNC(svld4,_f64,,)(pg, base);
108 }
109
test_svld4_vnum_s8(svbool_t pg,const int8_t * base,int64_t vnum)110 svint8x4_t test_svld4_vnum_s8(svbool_t pg, const int8_t *base, int64_t vnum)
111 {
112 // CHECK-LABEL: test_svld4_vnum_s8
113 // CHECK: %[[BASE:.*]] = bitcast i8* %base to <vscale x 16 x i8>*
114 // CHECK: %[[GEP:.*]] = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %[[BASE]], i64 %vnum, i64 0
115 // CHECK: %[[LOAD:.*]] = call <vscale x 64 x i8> @llvm.aarch64.sve.ld4.nxv64i8.nxv16i1(<vscale x 16 x i1> %pg, i8* %[[GEP]])
116 // CHECK-NEXT: ret <vscale x 64 x i8> %[[LOAD]]
117 return SVE_ACLE_FUNC(svld4_vnum,_s8,,)(pg, base, vnum);
118 }
119
test_svld4_vnum_s16(svbool_t pg,const int16_t * base,int64_t vnum)120 svint16x4_t test_svld4_vnum_s16(svbool_t pg, const int16_t *base, int64_t vnum)
121 {
122 // CHECK-LABEL: test_svld4_vnum_s16
123 // CHECK-DAG: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
124 // CHECK-DAG: %[[BASE:.*]] = bitcast i16* %base to <vscale x 8 x i16>*
125 // CHECK-DAG: %[[GEP:.*]] = getelementptr <vscale x 8 x i16>, <vscale x 8 x i16>* %[[BASE]], i64 %vnum, i64 0
126 // CHECK: %[[LOAD:.*]] = call <vscale x 32 x i16> @llvm.aarch64.sve.ld4.nxv32i16.nxv8i1(<vscale x 8 x i1> %[[PG]], i16* %[[GEP]])
127 // CHECK-NEXT: ret <vscale x 32 x i16> %[[LOAD]]
128 return SVE_ACLE_FUNC(svld4_vnum,_s16,,)(pg, base, vnum);
129 }
130
test_svld4_vnum_s32(svbool_t pg,const int32_t * base,int64_t vnum)131 svint32x4_t test_svld4_vnum_s32(svbool_t pg, const int32_t *base, int64_t vnum)
132 {
133 // CHECK-LABEL: test_svld4_vnum_s32
134 // CHECK-DAG: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
135 // CHECK-DAG: %[[BASE:.*]] = bitcast i32* %base to <vscale x 4 x i32>*
136 // CHECK-DAG: %[[GEP:.*]] = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %[[BASE]], i64 %vnum, i64 0
137 // CHECK: %[[LOAD:.*]] = call <vscale x 16 x i32> @llvm.aarch64.sve.ld4.nxv16i32.nxv4i1(<vscale x 4 x i1> %[[PG]], i32* %[[GEP]])
138 // CHECK-NEXT: ret <vscale x 16 x i32> %[[LOAD]]
139 return SVE_ACLE_FUNC(svld4_vnum,_s32,,)(pg, base, vnum);
140 }
141
test_svld4_vnum_s64(svbool_t pg,const int64_t * base,int64_t vnum)142 svint64x4_t test_svld4_vnum_s64(svbool_t pg, const int64_t *base, int64_t vnum)
143 {
144 // CHECK-LABEL: test_svld4_vnum_s64
145 // CHECK-DAG: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
146 // CHECK-DAG: %[[BASE:.*]] = bitcast i64* %base to <vscale x 2 x i64>*
147 // CHECK-DAG: %[[GEP:.*]] = getelementptr <vscale x 2 x i64>, <vscale x 2 x i64>* %[[BASE]], i64 %vnum, i64 0
148 // CHECK: %[[LOAD:.*]] = call <vscale x 8 x i64> @llvm.aarch64.sve.ld4.nxv8i64.nxv2i1(<vscale x 2 x i1> %[[PG]], i64* %[[GEP]])
149 // CHECK-NEXT: ret <vscale x 8 x i64> %[[LOAD]]
150 return SVE_ACLE_FUNC(svld4_vnum,_s64,,)(pg, base, vnum);
151 }
152
test_svld4_vnum_u8(svbool_t pg,const uint8_t * base,int64_t vnum)153 svuint8x4_t test_svld4_vnum_u8(svbool_t pg, const uint8_t *base, int64_t vnum)
154 {
155 // CHECK-LABEL: test_svld4_vnum_u8
156 // CHECK: %[[BASE:.*]] = bitcast i8* %base to <vscale x 16 x i8>*
157 // CHECK: %[[GEP:.*]] = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %[[BASE]], i64 %vnum, i64 0
158 // CHECK: %[[LOAD:.*]] = call <vscale x 64 x i8> @llvm.aarch64.sve.ld4.nxv64i8.nxv16i1(<vscale x 16 x i1> %pg, i8* %[[GEP]])
159 // CHECK-NEXT: ret <vscale x 64 x i8> %[[LOAD]]
160 return SVE_ACLE_FUNC(svld4_vnum,_u8,,)(pg, base, vnum);
161 }
162
test_svld4_vnum_u16(svbool_t pg,const uint16_t * base,int64_t vnum)163 svuint16x4_t test_svld4_vnum_u16(svbool_t pg, const uint16_t *base, int64_t vnum)
164 {
165 // CHECK-LABEL: test_svld4_vnum_u16
166 // CHECK-DAG: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
167 // CHECK-DAG: %[[BASE:.*]] = bitcast i16* %base to <vscale x 8 x i16>*
168 // CHECK-DAG: %[[GEP:.*]] = getelementptr <vscale x 8 x i16>, <vscale x 8 x i16>* %[[BASE]], i64 %vnum, i64 0
169 // CHECK: %[[LOAD:.*]] = call <vscale x 32 x i16> @llvm.aarch64.sve.ld4.nxv32i16.nxv8i1(<vscale x 8 x i1> %[[PG]], i16* %[[GEP]])
170 // CHECK-NEXT: ret <vscale x 32 x i16> %[[LOAD]]
171 return SVE_ACLE_FUNC(svld4_vnum,_u16,,)(pg, base, vnum);
172 }
173
test_svld4_vnum_u32(svbool_t pg,const uint32_t * base,int64_t vnum)174 svuint32x4_t test_svld4_vnum_u32(svbool_t pg, const uint32_t *base, int64_t vnum)
175 {
176 // CHECK-LABEL: test_svld4_vnum_u32
177 // CHECK-DAG: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
178 // CHECK-DAG: %[[BASE:.*]] = bitcast i32* %base to <vscale x 4 x i32>*
179 // CHECK-DAG: %[[GEP:.*]] = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %[[BASE]], i64 %vnum, i64 0
180 // CHECK: %[[LOAD:.*]] = call <vscale x 16 x i32> @llvm.aarch64.sve.ld4.nxv16i32.nxv4i1(<vscale x 4 x i1> %[[PG]], i32* %[[GEP]])
181 // CHECK-NEXT: ret <vscale x 16 x i32> %[[LOAD]]
182 return SVE_ACLE_FUNC(svld4_vnum,_u32,,)(pg, base, vnum);
183 }
184
test_svld4_vnum_u64(svbool_t pg,const uint64_t * base,int64_t vnum)185 svuint64x4_t test_svld4_vnum_u64(svbool_t pg, const uint64_t *base, int64_t vnum)
186 {
187 // CHECK-LABEL: test_svld4_vnum_u64
188 // CHECK-DAG: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
189 // CHECK-DAG: %[[BASE:.*]] = bitcast i64* %base to <vscale x 2 x i64>*
190 // CHECK-DAG: %[[GEP:.*]] = getelementptr <vscale x 2 x i64>, <vscale x 2 x i64>* %[[BASE]], i64 %vnum, i64 0
191 // CHECK: %[[LOAD:.*]] = call <vscale x 8 x i64> @llvm.aarch64.sve.ld4.nxv8i64.nxv2i1(<vscale x 2 x i1> %[[PG]], i64* %[[GEP]])
192 // CHECK-NEXT: ret <vscale x 8 x i64> %[[LOAD]]
193 return SVE_ACLE_FUNC(svld4_vnum,_u64,,)(pg, base, vnum);
194 }
195
test_svld4_vnum_f16(svbool_t pg,const float16_t * base,int64_t vnum)196 svfloat16x4_t test_svld4_vnum_f16(svbool_t pg, const float16_t *base, int64_t vnum)
197 {
198 // CHECK-LABEL: test_svld4_vnum_f16
199 // CHECK-DAG: %[[PG:.*]] = call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> %pg)
200 // CHECK-DAG: %[[BASE:.*]] = bitcast half* %base to <vscale x 8 x half>*
201 // CHECK-DAG: %[[GEP:.*]] = getelementptr <vscale x 8 x half>, <vscale x 8 x half>* %[[BASE]], i64 %vnum, i64 0
202 // CHECK: %[[LOAD:.*]] = call <vscale x 32 x half> @llvm.aarch64.sve.ld4.nxv32f16.nxv8i1(<vscale x 8 x i1> %[[PG]], half* %[[GEP]])
203 // CHECK-NEXT: ret <vscale x 32 x half> %[[LOAD]]
204 return SVE_ACLE_FUNC(svld4_vnum,_f16,,)(pg, base, vnum);
205 }
206
test_svld4_vnum_f32(svbool_t pg,const float32_t * base,int64_t vnum)207 svfloat32x4_t test_svld4_vnum_f32(svbool_t pg, const float32_t *base, int64_t vnum)
208 {
209 // CHECK-LABEL: test_svld4_vnum_f32
210 // CHECK-DAG: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
211 // CHECK-DAG: %[[BASE:.*]] = bitcast float* %base to <vscale x 4 x float>*
212 // CHECK-DAG: %[[GEP:.*]] = getelementptr <vscale x 4 x float>, <vscale x 4 x float>* %[[BASE]], i64 %vnum, i64 0
213 // CHECK: %[[LOAD:.*]] = call <vscale x 16 x float> @llvm.aarch64.sve.ld4.nxv16f32.nxv4i1(<vscale x 4 x i1> %[[PG]], float* %[[GEP]])
214 // CHECK-NEXT: ret <vscale x 16 x float> %[[LOAD]]
215 return SVE_ACLE_FUNC(svld4_vnum,_f32,,)(pg, base, vnum);
216 }
217
test_svld4_vnum_f64(svbool_t pg,const float64_t * base,int64_t vnum)218 svfloat64x4_t test_svld4_vnum_f64(svbool_t pg, const float64_t *base, int64_t vnum)
219 {
220 // CHECK-LABEL: test_svld4_vnum_f64
221 // CHECK-DAG: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
222 // CHECK-DAG: %[[BASE:.*]] = bitcast double* %base to <vscale x 2 x double>*
223 // CHECK-DAG: %[[GEP:.*]] = getelementptr <vscale x 2 x double>, <vscale x 2 x double>* %[[BASE]], i64 %vnum, i64 0
224 // CHECK: %[[LOAD:.*]] = call <vscale x 8 x double> @llvm.aarch64.sve.ld4.nxv8f64.nxv2i1(<vscale x 2 x i1> %[[PG]], double* %[[GEP]])
225 // CHECK-NEXT: ret <vscale x 8 x double> %[[LOAD]]
226 return SVE_ACLE_FUNC(svld4_vnum,_f64,,)(pg, base, vnum);
227 }
228