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