1 // REQUIRES: aarch64-registered-target
2 // 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
3 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - -x c++ %s | FileCheck %s
4 // 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
5 // 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 - -x c++ %s | FileCheck %s
6 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -o - %s >/dev/null
7 #include <arm_sve.h>
8 
9 #ifdef SVE_OVERLOADED_FORMS
10 // A simple used,unused... macro, long enough to represent any SVE builtin.
11 #define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3
12 #else
13 #define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4
14 #endif
15 
test_svprfb(svbool_t pg,const void * base)16 void test_svprfb(svbool_t pg, const void *base)
17 {
18   // CHECK-LABEL: test_svprfb
19   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 0)
20   return svprfb(pg, base, SV_PLDL1KEEP);
21 }
22 
test_svprfb_1(svbool_t pg,const void * base)23 void test_svprfb_1(svbool_t pg, const void *base)
24 {
25   // CHECK-LABEL: test_svprfb_1
26   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 1)
27   return svprfb(pg, base, SV_PLDL1STRM);
28 }
29 
test_svprfb_2(svbool_t pg,const void * base)30 void test_svprfb_2(svbool_t pg, const void *base)
31 {
32   // CHECK-LABEL: test_svprfb_2
33   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 2)
34   return svprfb(pg, base, SV_PLDL2KEEP);
35 }
36 
test_svprfb_3(svbool_t pg,const void * base)37 void test_svprfb_3(svbool_t pg, const void *base)
38 {
39   // CHECK-LABEL: test_svprfb_3
40   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 3)
41   return svprfb(pg, base, SV_PLDL2STRM);
42 }
43 
test_svprfb_4(svbool_t pg,const void * base)44 void test_svprfb_4(svbool_t pg, const void *base)
45 {
46   // CHECK-LABEL: test_svprfb_4
47   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 4)
48   return svprfb(pg, base, SV_PLDL3KEEP);
49 }
50 
test_svprfb_5(svbool_t pg,const void * base)51 void test_svprfb_5(svbool_t pg, const void *base)
52 {
53   // CHECK-LABEL: test_svprfb_5
54   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 5)
55   return svprfb(pg, base, SV_PLDL3STRM);
56 }
57 
test_svprfb_6(svbool_t pg,const void * base)58 void test_svprfb_6(svbool_t pg, const void *base)
59 {
60   // CHECK-LABEL: test_svprfb_6
61   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 8)
62   return svprfb(pg, base, SV_PSTL1KEEP);
63 }
64 
test_svprfb_7(svbool_t pg,const void * base)65 void test_svprfb_7(svbool_t pg, const void *base)
66 {
67   // CHECK-LABEL: test_svprfb_7
68   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 9)
69   return svprfb(pg, base, SV_PSTL1STRM);
70 }
71 
test_svprfb_8(svbool_t pg,const void * base)72 void test_svprfb_8(svbool_t pg, const void *base)
73 {
74   // CHECK-LABEL: test_svprfb_8
75   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 10)
76   return svprfb(pg, base, SV_PSTL2KEEP);
77 }
78 
test_svprfb_9(svbool_t pg,const void * base)79 void test_svprfb_9(svbool_t pg, const void *base)
80 {
81   // CHECK-LABEL: test_svprfb_9
82   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 11)
83   return svprfb(pg, base, SV_PSTL2STRM);
84 }
85 
test_svprfb_10(svbool_t pg,const void * base)86 void test_svprfb_10(svbool_t pg, const void *base)
87 {
88   // CHECK-LABEL: test_svprfb_10
89   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 12)
90   return svprfb(pg, base, SV_PSTL3KEEP);
91 }
92 
test_svprfb_11(svbool_t pg,const void * base)93 void test_svprfb_11(svbool_t pg, const void *base)
94 {
95   // CHECK-LABEL: test_svprfb_11
96   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 13)
97   return svprfb(pg, base, SV_PSTL3STRM);
98 }
99 
test_svprfb_vnum(svbool_t pg,const void * base,int64_t vnum)100 void test_svprfb_vnum(svbool_t pg, const void *base, int64_t vnum)
101 {
102   // CHECK-LABEL: test_svprfb_vnum
103   // CHECK: %[[BASE:.*]] = bitcast i8* %base to <vscale x 16 x i8>*
104   // CHECK: %[[GEP:.*]] = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %[[BASE]], i64 %vnum, i64 0
105   // CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %[[GEP]], i32 0)
106   return svprfb_vnum(pg, base, vnum, SV_PLDL1KEEP);
107 }
108 
test_svprfb_gather_u32base(svbool_t pg,svuint32_t bases)109 void test_svprfb_gather_u32base(svbool_t pg, svuint32_t bases)
110 {
111   // CHECK-LABEL: test_svprfb_gather_u32base
112   // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
113   // CHECK: call void @llvm.aarch64.sve.prfb.gather.scalar.offset.nxv4i32(<vscale x 4 x i1> %[[PG]], <vscale x 4 x i32> %bases, i64 0, i32 0)
114   // CHECK: ret void
115   return SVE_ACLE_FUNC(svprfb_gather,_u32base,,)(pg, bases, SV_PLDL1KEEP);
116 }
117 
test_svprfb_gather_u64base(svbool_t pg,svuint64_t bases)118 void test_svprfb_gather_u64base(svbool_t pg, svuint64_t bases)
119 {
120   // CHECK-LABEL: test_svprfb_gather_u64base
121   // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
122   // CHECK: call void @llvm.aarch64.sve.prfb.gather.scalar.offset.nxv2i64(<vscale x 2 x i1> %[[PG]], <vscale x 2 x i64> %bases, i64 0, i32 0)
123   // CHECK: ret void
124   return SVE_ACLE_FUNC(svprfb_gather,_u64base,,)(pg, bases, SV_PLDL1KEEP);
125 }
126 
test_svprfb_gather_s32offset(svbool_t pg,const void * base,svint32_t offsets)127 void test_svprfb_gather_s32offset(svbool_t pg, const void *base, svint32_t offsets)
128 {
129   // CHECK-LABEL: test_svprfb_gather_s32offset
130   // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
131   // CHECK: call void @llvm.aarch64.sve.prfb.gather.sxtw.index.nxv4i32(<vscale x 4 x i1> %[[PG]], i8* %base, <vscale x 4 x i32> %offsets, i32 0)
132   // CHECK: ret void
133   return SVE_ACLE_FUNC(svprfb_gather_,s32,offset,)(pg, base, offsets, SV_PLDL1KEEP);
134 }
135 
test_svprfb_gather_s64offset(svbool_t pg,const void * base,svint64_t offsets)136 void test_svprfb_gather_s64offset(svbool_t pg, const void *base, svint64_t offsets)
137 {
138   // CHECK-LABEL: test_svprfb_gather_s64offset
139   // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
140   // CHECK: call void @llvm.aarch64.sve.prfb.gather.index.nxv2i64(<vscale x 2 x i1> %[[PG]], i8* %base, <vscale x 2 x i64> %offsets, i32 0)
141   // CHECK: ret void
142   return SVE_ACLE_FUNC(svprfb_gather_,s64,offset,)(pg, base, offsets, SV_PLDL1KEEP);
143 }
144 
test_svprfb_gather_u32offset(svbool_t pg,const void * base,svuint32_t offsets)145 void test_svprfb_gather_u32offset(svbool_t pg, const void *base, svuint32_t offsets)
146 {
147   // CHECK-LABEL: test_svprfb_gather_u32offset
148   // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
149   // CHECK: call void @llvm.aarch64.sve.prfb.gather.uxtw.index.nxv4i32(<vscale x 4 x i1> %[[PG]], i8* %base, <vscale x 4 x i32> %offsets, i32 0)
150   // CHECK: ret void
151   return SVE_ACLE_FUNC(svprfb_gather_,u32,offset,)(pg, base, offsets, SV_PLDL1KEEP);
152 }
153 
test_svprfb_gather_u64offset(svbool_t pg,const void * base,svuint64_t offsets)154 void test_svprfb_gather_u64offset(svbool_t pg, const void *base, svuint64_t offsets)
155 {
156   // CHECK-LABEL: test_svprfb_gather_u64offset
157   // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
158   // CHECK: call void @llvm.aarch64.sve.prfb.gather.index.nxv2i64(<vscale x 2 x i1> %[[PG]], i8* %base, <vscale x 2 x i64> %offsets, i32 0)
159   // CHECK: ret void
160   return SVE_ACLE_FUNC(svprfb_gather_,u64,offset,)(pg, base, offsets, SV_PLDL1KEEP);
161 }
162 
test_svprfb_gather_u32base_offset(svbool_t pg,svuint32_t bases,int64_t offset)163 void test_svprfb_gather_u32base_offset(svbool_t pg, svuint32_t bases, int64_t offset)
164 {
165   // CHECK-LABEL: test_svprfb_gather_u32base_offset
166   // CHECK: %[[PG:.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> %pg)
167   // CHECK: call void @llvm.aarch64.sve.prfb.gather.scalar.offset.nxv4i32(<vscale x 4 x i1> %[[PG]], <vscale x 4 x i32> %bases, i64 %offset, i32 0)
168   // CHECK: ret void
169   return svprfb_gather_u32base_offset(pg, bases, offset, SV_PLDL1KEEP);
170   return SVE_ACLE_FUNC(svprfb_gather,_u32base,_offset,)(pg, bases, offset, SV_PLDL1KEEP);
171 }
172 
test_svprfb_gather_u64base_offset(svbool_t pg,svuint64_t bases,int64_t offset)173 void test_svprfb_gather_u64base_offset(svbool_t pg, svuint64_t bases, int64_t offset)
174 {
175   // CHECK-LABEL: test_svprfb_gather_u64base_offset
176   // CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg)
177   // CHECK: call void @llvm.aarch64.sve.prfb.gather.scalar.offset.nxv2i64(<vscale x 2 x i1> %[[PG]], <vscale x 2 x i64> %bases, i64 %offset, i32 0)
178   // CHECK: ret void
179   return SVE_ACLE_FUNC(svprfb_gather,_u64base,_offset,)(pg, bases, offset, SV_PLDL1KEEP);
180 }
181