1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 2
2 // REQUIRES: aarch64-registered-target
3 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +sve2 -target-feature +sve2p1 -target-feature +bf16\
4 // RUN: -Werror -emit-llvm -disable-O0-optnone -o - %s | opt -S -p mem2reg,instcombine,tailcallelim | FileCheck %s
5 // RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +sve2 -target-feature +sve2p1 -target-feature +bf16\
6 // RUN: -Werror -emit-llvm -disable-O0-optnone -o - %s | opt -S -p mem2reg,instcombine,tailcallelim | FileCheck %s
7 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +sve2 -target-feature +sve2p1 -target-feature +bf16\
8 // RUN: -Werror -emit-llvm -disable-O0-optnone -o - -x c++ %s | opt -S -p mem2reg,instcombine,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK
9 // RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +sve2 -target-feature +sve2p1 -target-feature +bf16\
10 // RUN: -Werror -emit-llvm -disable-O0-optnone -o - -x c++ %s | opt -S -p mem2reg,instcombine,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK
11 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +sve2 -target-feature +sve2p1 -target-feature +bf16 -S -disable-O0-optnone -Werror -Wall -o /dev/null %s
16 #ifdef SVE_OVERLOADED_FORMS
17 // A simple used,unused... macro, long enough to represent any SVE builtin.
18 #define SVE_ACLE_FUNC(A1, A2_UNUSED) A1
20 #define SVE_ACLE_FUNC(A1, A2) A1##A2
23 // CHECK-LABEL: define dso_local <vscale x 16 x i8> @test_svdup_laneq_s8
24 // CHECK-SAME: (<vscale x 16 x i8> [[ZN:%.*]]) #[[ATTR0:[0-9]+]] {
26 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i8> @llvm.aarch64.sve.dup.laneq.nxv16i8(<vscale x 16 x i8> [[ZN]], i32 0)
27 // CHECK-NEXT: ret <vscale x 16 x i8> [[TMP0]]
29 // CPP-CHECK-LABEL: define dso_local <vscale x 16 x i8> @_Z19test_svdup_laneq_s8u10__SVInt8_t
30 // CPP-CHECK-SAME: (<vscale x 16 x i8> [[ZN:%.*]]) #[[ATTR0:[0-9]+]] {
31 // CPP-CHECK-NEXT: entry:
32 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i8> @llvm.aarch64.sve.dup.laneq.nxv16i8(<vscale x 16 x i8> [[ZN]], i32 0)
33 // CPP-CHECK-NEXT: ret <vscale x 16 x i8> [[TMP0]]
35 svint8_t
test_svdup_laneq_s8(svint8_t zn
) {
36 return SVE_ACLE_FUNC(svdup_laneq
, _s8
)(zn
, 0);
39 // CHECK-LABEL: define dso_local <vscale x 16 x i8> @test_svdup_laneq_u8
40 // CHECK-SAME: (<vscale x 16 x i8> [[ZN:%.*]]) #[[ATTR0]] {
42 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i8> @llvm.aarch64.sve.dup.laneq.nxv16i8(<vscale x 16 x i8> [[ZN]], i32 15)
43 // CHECK-NEXT: ret <vscale x 16 x i8> [[TMP0]]
45 // CPP-CHECK-LABEL: define dso_local <vscale x 16 x i8> @_Z19test_svdup_laneq_u8u11__SVUint8_t
46 // CPP-CHECK-SAME: (<vscale x 16 x i8> [[ZN:%.*]]) #[[ATTR0]] {
47 // CPP-CHECK-NEXT: entry:
48 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i8> @llvm.aarch64.sve.dup.laneq.nxv16i8(<vscale x 16 x i8> [[ZN]], i32 15)
49 // CPP-CHECK-NEXT: ret <vscale x 16 x i8> [[TMP0]]
51 svuint8_t
test_svdup_laneq_u8(svuint8_t zn
) {
52 return SVE_ACLE_FUNC(svdup_laneq
, _u8
)(zn
, 15);
55 // CHECK-LABEL: define dso_local <vscale x 8 x i16> @test_svdup_laneq_s16
56 // CHECK-SAME: (<vscale x 8 x i16> [[ZN:%.*]]) #[[ATTR0]] {
58 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i16> @llvm.aarch64.sve.dup.laneq.nxv8i16(<vscale x 8 x i16> [[ZN]], i32 1)
59 // CHECK-NEXT: ret <vscale x 8 x i16> [[TMP0]]
61 // CPP-CHECK-LABEL: define dso_local <vscale x 8 x i16> @_Z20test_svdup_laneq_s16u11__SVInt16_t
62 // CPP-CHECK-SAME: (<vscale x 8 x i16> [[ZN:%.*]]) #[[ATTR0]] {
63 // CPP-CHECK-NEXT: entry:
64 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i16> @llvm.aarch64.sve.dup.laneq.nxv8i16(<vscale x 8 x i16> [[ZN]], i32 1)
65 // CPP-CHECK-NEXT: ret <vscale x 8 x i16> [[TMP0]]
67 svint16_t
test_svdup_laneq_s16(svint16_t zn
) {
68 return SVE_ACLE_FUNC(svdup_laneq
, _s16
)(zn
, 1);
71 // CHECK-LABEL: define dso_local <vscale x 8 x i16> @test_svdup_laneq_u16
72 // CHECK-SAME: (<vscale x 8 x i16> [[ZN:%.*]]) #[[ATTR0]] {
74 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i16> @llvm.aarch64.sve.dup.laneq.nxv8i16(<vscale x 8 x i16> [[ZN]], i32 7)
75 // CHECK-NEXT: ret <vscale x 8 x i16> [[TMP0]]
77 // CPP-CHECK-LABEL: define dso_local <vscale x 8 x i16> @_Z20test_svdup_laneq_u16u12__SVUint16_t
78 // CPP-CHECK-SAME: (<vscale x 8 x i16> [[ZN:%.*]]) #[[ATTR0]] {
79 // CPP-CHECK-NEXT: entry:
80 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i16> @llvm.aarch64.sve.dup.laneq.nxv8i16(<vscale x 8 x i16> [[ZN]], i32 7)
81 // CPP-CHECK-NEXT: ret <vscale x 8 x i16> [[TMP0]]
83 svuint16_t
test_svdup_laneq_u16(svuint16_t zn
) {
84 return SVE_ACLE_FUNC(svdup_laneq
, _u16
)(zn
, 7);
87 // CHECK-LABEL: define dso_local <vscale x 4 x i32> @test_svdup_laneq_s32
88 // CHECK-SAME: (<vscale x 4 x i32> [[ZN:%.*]]) #[[ATTR0]] {
90 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x i32> @llvm.aarch64.sve.dup.laneq.nxv4i32(<vscale x 4 x i32> [[ZN]], i32 2)
91 // CHECK-NEXT: ret <vscale x 4 x i32> [[TMP0]]
93 // CPP-CHECK-LABEL: define dso_local <vscale x 4 x i32> @_Z20test_svdup_laneq_s32u11__SVInt32_t
94 // CPP-CHECK-SAME: (<vscale x 4 x i32> [[ZN:%.*]]) #[[ATTR0]] {
95 // CPP-CHECK-NEXT: entry:
96 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x i32> @llvm.aarch64.sve.dup.laneq.nxv4i32(<vscale x 4 x i32> [[ZN]], i32 2)
97 // CPP-CHECK-NEXT: ret <vscale x 4 x i32> [[TMP0]]
99 svint32_t
test_svdup_laneq_s32(svint32_t zn
) {
100 return SVE_ACLE_FUNC(svdup_laneq
, _s32
)(zn
, 2);
103 // CHECK-LABEL: define dso_local <vscale x 4 x i32> @test_svdup_laneq_u32
104 // CHECK-SAME: (<vscale x 4 x i32> [[ZN:%.*]]) #[[ATTR0]] {
105 // CHECK-NEXT: entry:
106 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x i32> @llvm.aarch64.sve.dup.laneq.nxv4i32(<vscale x 4 x i32> [[ZN]], i32 3)
107 // CHECK-NEXT: ret <vscale x 4 x i32> [[TMP0]]
109 // CPP-CHECK-LABEL: define dso_local <vscale x 4 x i32> @_Z20test_svdup_laneq_u32u12__SVUint32_t
110 // CPP-CHECK-SAME: (<vscale x 4 x i32> [[ZN:%.*]]) #[[ATTR0]] {
111 // CPP-CHECK-NEXT: entry:
112 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x i32> @llvm.aarch64.sve.dup.laneq.nxv4i32(<vscale x 4 x i32> [[ZN]], i32 3)
113 // CPP-CHECK-NEXT: ret <vscale x 4 x i32> [[TMP0]]
115 svuint32_t
test_svdup_laneq_u32(svuint32_t zn
) {
116 return SVE_ACLE_FUNC(svdup_laneq
, _u32
)(zn
, 3);
119 // CHECK-LABEL: define dso_local <vscale x 2 x i64> @test_svdup_laneq_s64
120 // CHECK-SAME: (<vscale x 2 x i64> [[ZN:%.*]]) #[[ATTR0]] {
121 // CHECK-NEXT: entry:
122 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x i64> @llvm.aarch64.sve.dup.laneq.nxv2i64(<vscale x 2 x i64> [[ZN]], i32 0)
123 // CHECK-NEXT: ret <vscale x 2 x i64> [[TMP0]]
125 // CPP-CHECK-LABEL: define dso_local <vscale x 2 x i64> @_Z20test_svdup_laneq_s64u11__SVInt64_t
126 // CPP-CHECK-SAME: (<vscale x 2 x i64> [[ZN:%.*]]) #[[ATTR0]] {
127 // CPP-CHECK-NEXT: entry:
128 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x i64> @llvm.aarch64.sve.dup.laneq.nxv2i64(<vscale x 2 x i64> [[ZN]], i32 0)
129 // CPP-CHECK-NEXT: ret <vscale x 2 x i64> [[TMP0]]
131 svint64_t
test_svdup_laneq_s64(svint64_t zn
) {
132 return SVE_ACLE_FUNC(svdup_laneq
, _s64
)(zn
, 0);
135 // CHECK-LABEL: define dso_local <vscale x 2 x i64> @test_svdup_laneq_u64
136 // CHECK-SAME: (<vscale x 2 x i64> [[ZN:%.*]]) #[[ATTR0]] {
137 // CHECK-NEXT: entry:
138 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x i64> @llvm.aarch64.sve.dup.laneq.nxv2i64(<vscale x 2 x i64> [[ZN]], i32 1)
139 // CHECK-NEXT: ret <vscale x 2 x i64> [[TMP0]]
141 // CPP-CHECK-LABEL: define dso_local <vscale x 2 x i64> @_Z20test_svdup_laneq_u64u12__SVUint64_t
142 // CPP-CHECK-SAME: (<vscale x 2 x i64> [[ZN:%.*]]) #[[ATTR0]] {
143 // CPP-CHECK-NEXT: entry:
144 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x i64> @llvm.aarch64.sve.dup.laneq.nxv2i64(<vscale x 2 x i64> [[ZN]], i32 1)
145 // CPP-CHECK-NEXT: ret <vscale x 2 x i64> [[TMP0]]
147 svuint64_t
test_svdup_laneq_u64(svuint64_t zn
) {
148 return SVE_ACLE_FUNC(svdup_laneq
, _u64
)(zn
, 1);
151 // CHECK-LABEL: define dso_local <vscale x 8 x half> @test_svdup_laneq_f16
152 // CHECK-SAME: (<vscale x 8 x half> [[ZN:%.*]]) #[[ATTR0]] {
153 // CHECK-NEXT: entry:
154 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.dup.laneq.nxv8f16(<vscale x 8 x half> [[ZN]], i32 4)
155 // CHECK-NEXT: ret <vscale x 8 x half> [[TMP0]]
157 // CPP-CHECK-LABEL: define dso_local <vscale x 8 x half> @_Z20test_svdup_laneq_f16u13__SVFloat16_t
158 // CPP-CHECK-SAME: (<vscale x 8 x half> [[ZN:%.*]]) #[[ATTR0]] {
159 // CPP-CHECK-NEXT: entry:
160 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.dup.laneq.nxv8f16(<vscale x 8 x half> [[ZN]], i32 4)
161 // CPP-CHECK-NEXT: ret <vscale x 8 x half> [[TMP0]]
163 svfloat16_t
test_svdup_laneq_f16(svfloat16_t zn
) {
164 return SVE_ACLE_FUNC(svdup_laneq
, _f16
)(zn
, 4);
167 // CHECK-LABEL: define dso_local <vscale x 4 x float> @test_svdup_laneq_f32
168 // CHECK-SAME: (<vscale x 4 x float> [[ZN:%.*]]) #[[ATTR0]] {
169 // CHECK-NEXT: entry:
170 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.dup.laneq.nxv4f32(<vscale x 4 x float> [[ZN]], i32 1)
171 // CHECK-NEXT: ret <vscale x 4 x float> [[TMP0]]
173 // CPP-CHECK-LABEL: define dso_local <vscale x 4 x float> @_Z20test_svdup_laneq_f32u13__SVFloat32_t
174 // CPP-CHECK-SAME: (<vscale x 4 x float> [[ZN:%.*]]) #[[ATTR0]] {
175 // CPP-CHECK-NEXT: entry:
176 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.dup.laneq.nxv4f32(<vscale x 4 x float> [[ZN]], i32 1)
177 // CPP-CHECK-NEXT: ret <vscale x 4 x float> [[TMP0]]
179 svfloat32_t
test_svdup_laneq_f32(svfloat32_t zn
) {
180 return SVE_ACLE_FUNC(svdup_laneq
, _f32
)(zn
, 1);
183 // CHECK-LABEL: define dso_local <vscale x 2 x double> @test_svdup_laneq_f64
184 // CHECK-SAME: (<vscale x 2 x double> [[ZN:%.*]]) #[[ATTR0]] {
185 // CHECK-NEXT: entry:
186 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x double> @llvm.aarch64.sve.dup.laneq.nxv2f64(<vscale x 2 x double> [[ZN]], i32 1)
187 // CHECK-NEXT: ret <vscale x 2 x double> [[TMP0]]
189 // CPP-CHECK-LABEL: define dso_local <vscale x 2 x double> @_Z20test_svdup_laneq_f64u13__SVFloat64_t
190 // CPP-CHECK-SAME: (<vscale x 2 x double> [[ZN:%.*]]) #[[ATTR0]] {
191 // CPP-CHECK-NEXT: entry:
192 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x double> @llvm.aarch64.sve.dup.laneq.nxv2f64(<vscale x 2 x double> [[ZN]], i32 1)
193 // CPP-CHECK-NEXT: ret <vscale x 2 x double> [[TMP0]]
195 svfloat64_t
test_svdup_laneq_f64(svfloat64_t zn
) {
196 return SVE_ACLE_FUNC(svdup_laneq
, _f64
)(zn
, 1);
199 // CHECK-LABEL: define dso_local <vscale x 8 x bfloat> @test_svdup_laneq_bf16
200 // CHECK-SAME: (<vscale x 8 x bfloat> [[ZN:%.*]]) #[[ATTR0]] {
201 // CHECK-NEXT: entry:
202 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.dup.laneq.nxv8bf16(<vscale x 8 x bfloat> [[ZN]], i32 3)
203 // CHECK-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
205 // CPP-CHECK-LABEL: define dso_local <vscale x 8 x bfloat> @_Z21test_svdup_laneq_bf16u14__SVBfloat16_t
206 // CPP-CHECK-SAME: (<vscale x 8 x bfloat> [[ZN:%.*]]) #[[ATTR0]] {
207 // CPP-CHECK-NEXT: entry:
208 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.dup.laneq.nxv8bf16(<vscale x 8 x bfloat> [[ZN]], i32 3)
209 // CPP-CHECK-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
211 svbfloat16_t
test_svdup_laneq_bf16(svbfloat16_t zn
) {
212 return SVE_ACLE_FUNC(svdup_laneq
, _bf16
)(zn
, 3);
215 // CHECK-LABEL: define dso_local <vscale x 16 x i8> @test_svdup_laneq_mf8
216 // CHECK-SAME: (<vscale x 16 x i8> [[ZN:%.*]]) #[[ATTR0]] {
217 // CHECK-NEXT: entry:
218 // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i8> @llvm.aarch64.sve.dup.laneq.nxv16i8(<vscale x 16 x i8> [[ZN]], i32 1)
219 // CHECK-NEXT: ret <vscale x 16 x i8> [[TMP0]]
221 // CPP-CHECK-LABEL: define dso_local <vscale x 16 x i8> @_Z20test_svdup_laneq_mf8u13__SVMfloat8_t
222 // CPP-CHECK-SAME: (<vscale x 16 x i8> [[ZN:%.*]]) #[[ATTR0]] {
223 // CPP-CHECK-NEXT: entry:
224 // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i8> @llvm.aarch64.sve.dup.laneq.nxv16i8(<vscale x 16 x i8> [[ZN]], i32 1)
225 // CPP-CHECK-NEXT: ret <vscale x 16 x i8> [[TMP0]]
227 svmfloat8_t
test_svdup_laneq_mf8(svmfloat8_t zn
) {
228 return SVE_ACLE_FUNC(svdup_laneq
, _mf8
)(zn
, 1);