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