xref: /llvm-project/clang/test/CodeGen/AArch64/sve-intrinsics/acle_sve_get2.c (revision 207e5ccceec8d3cc3f32723e78f2a142bc61b07d)
1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2 // REQUIRES: aarch64-registered-target
3 // RUN: %clang_cc1 -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s
4 // RUN: %clang_cc1 -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK
5 // RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s
6 // RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK
7 // RUN: %clang_cc1 -triple aarch64 -target-feature +sve -S -disable-O0-optnone -Werror -Wall -o /dev/null %s
8 // RUN: %clang_cc1 -triple aarch64 -target-feature +sme -S -disable-O0-optnone -Werror -Wall -o /dev/null %s
9 // RUN: %clang_cc1 -triple aarch64 -target-feature +sve -target-feature +sme -S -disable-O0-optnone -Werror -Wall -o /dev/null %s
10 
11 #include <arm_sve.h>
12 
13 #ifdef SVE_OVERLOADED_FORMS
14 // A simple used,unused... macro, long enough to represent any SVE builtin.
15 #define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3
16 #else
17 #define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4
18 #endif
19 
20 #ifdef __ARM_FEATURE_SME
21 #define ATTR __arm_streaming
22 #else
23 #define ATTR
24 #endif
25 
26 // CHECK-LABEL: @test_svget2_s8(
27 // CHECK-NEXT:  entry:
28 // CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[TUPLE_COERCE0:%.*]], 0
29 // CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[TUPLE_COERCE1:%.*]], 1
30 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]], 0
31 // CHECK-NEXT:    ret <vscale x 16 x i8> [[TMP2]]
32 //
33 // CPP-CHECK-LABEL: @_Z14test_svget2_s810svint8x2_t(
34 // CPP-CHECK-NEXT:  entry:
35 // CPP-CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[TUPLE_COERCE0:%.*]], 0
36 // CPP-CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[TUPLE_COERCE1:%.*]], 1
37 // CPP-CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]], 0
38 // CPP-CHECK-NEXT:    ret <vscale x 16 x i8> [[TMP2]]
39 //
40 svint8_t test_svget2_s8(svint8x2_t tuple) ATTR
41 {
42   return SVE_ACLE_FUNC(svget2,_s8,,)(tuple, 0);
43 }
44 
45 // CHECK-LABEL: @test_svget2_s16(
46 // CHECK-NEXT:  entry:
47 // CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[TUPLE_COERCE0:%.*]], 0
48 // CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[TUPLE_COERCE1:%.*]], 1
49 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]], 1
50 // CHECK-NEXT:    ret <vscale x 8 x i16> [[TMP2]]
51 //
52 // CPP-CHECK-LABEL: @_Z15test_svget2_s1611svint16x2_t(
53 // CPP-CHECK-NEXT:  entry:
54 // CPP-CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[TUPLE_COERCE0:%.*]], 0
55 // CPP-CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[TUPLE_COERCE1:%.*]], 1
56 // CPP-CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]], 1
57 // CPP-CHECK-NEXT:    ret <vscale x 8 x i16> [[TMP2]]
58 //
59 svint16_t test_svget2_s16(svint16x2_t tuple) ATTR
60 {
61   return SVE_ACLE_FUNC(svget2,_s16,,)(tuple, 1);
62 }
63 
64 // CHECK-LABEL: @test_svget2_s32(
65 // CHECK-NEXT:  entry:
66 // CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[TUPLE_COERCE0:%.*]], 0
67 // CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[TUPLE_COERCE1:%.*]], 1
68 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]], 0
69 // CHECK-NEXT:    ret <vscale x 4 x i32> [[TMP2]]
70 //
71 // CPP-CHECK-LABEL: @_Z15test_svget2_s3211svint32x2_t(
72 // CPP-CHECK-NEXT:  entry:
73 // CPP-CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[TUPLE_COERCE0:%.*]], 0
74 // CPP-CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[TUPLE_COERCE1:%.*]], 1
75 // CPP-CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]], 0
76 // CPP-CHECK-NEXT:    ret <vscale x 4 x i32> [[TMP2]]
77 //
78 svint32_t test_svget2_s32(svint32x2_t tuple) ATTR
79 {
80   return SVE_ACLE_FUNC(svget2,_s32,,)(tuple, 0);
81 }
82 
83 // CHECK-LABEL: @test_svget2_s64(
84 // CHECK-NEXT:  entry:
85 // CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[TUPLE_COERCE0:%.*]], 0
86 // CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[TUPLE_COERCE1:%.*]], 1
87 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]], 1
88 // CHECK-NEXT:    ret <vscale x 2 x i64> [[TMP2]]
89 //
90 // CPP-CHECK-LABEL: @_Z15test_svget2_s6411svint64x2_t(
91 // CPP-CHECK-NEXT:  entry:
92 // CPP-CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[TUPLE_COERCE0:%.*]], 0
93 // CPP-CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[TUPLE_COERCE1:%.*]], 1
94 // CPP-CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]], 1
95 // CPP-CHECK-NEXT:    ret <vscale x 2 x i64> [[TMP2]]
96 //
97 svint64_t test_svget2_s64(svint64x2_t tuple) ATTR
98 {
99   return SVE_ACLE_FUNC(svget2,_s64,,)(tuple, 1);
100 }
101 
102 // CHECK-LABEL: @test_svget2_u8(
103 // CHECK-NEXT:  entry:
104 // CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[TUPLE_COERCE0:%.*]], 0
105 // CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[TUPLE_COERCE1:%.*]], 1
106 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]], 0
107 // CHECK-NEXT:    ret <vscale x 16 x i8> [[TMP2]]
108 //
109 // CPP-CHECK-LABEL: @_Z14test_svget2_u811svuint8x2_t(
110 // CPP-CHECK-NEXT:  entry:
111 // CPP-CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[TUPLE_COERCE0:%.*]], 0
112 // CPP-CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[TUPLE_COERCE1:%.*]], 1
113 // CPP-CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]], 0
114 // CPP-CHECK-NEXT:    ret <vscale x 16 x i8> [[TMP2]]
115 //
116 svuint8_t test_svget2_u8(svuint8x2_t tuple) ATTR
117 {
118   return SVE_ACLE_FUNC(svget2,_u8,,)(tuple, 0);
119 }
120 
121 // CHECK-LABEL: @test_svget2_u16(
122 // CHECK-NEXT:  entry:
123 // CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[TUPLE_COERCE0:%.*]], 0
124 // CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[TUPLE_COERCE1:%.*]], 1
125 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]], 1
126 // CHECK-NEXT:    ret <vscale x 8 x i16> [[TMP2]]
127 //
128 // CPP-CHECK-LABEL: @_Z15test_svget2_u1612svuint16x2_t(
129 // CPP-CHECK-NEXT:  entry:
130 // CPP-CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[TUPLE_COERCE0:%.*]], 0
131 // CPP-CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[TUPLE_COERCE1:%.*]], 1
132 // CPP-CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]], 1
133 // CPP-CHECK-NEXT:    ret <vscale x 8 x i16> [[TMP2]]
134 //
135 svuint16_t test_svget2_u16(svuint16x2_t tuple) ATTR
136 {
137   return SVE_ACLE_FUNC(svget2,_u16,,)(tuple, 1);
138 }
139 
140 // CHECK-LABEL: @test_svget2_u32(
141 // CHECK-NEXT:  entry:
142 // CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[TUPLE_COERCE0:%.*]], 0
143 // CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[TUPLE_COERCE1:%.*]], 1
144 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]], 0
145 // CHECK-NEXT:    ret <vscale x 4 x i32> [[TMP2]]
146 //
147 // CPP-CHECK-LABEL: @_Z15test_svget2_u3212svuint32x2_t(
148 // CPP-CHECK-NEXT:  entry:
149 // CPP-CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[TUPLE_COERCE0:%.*]], 0
150 // CPP-CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[TUPLE_COERCE1:%.*]], 1
151 // CPP-CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]], 0
152 // CPP-CHECK-NEXT:    ret <vscale x 4 x i32> [[TMP2]]
153 //
154 svuint32_t test_svget2_u32(svuint32x2_t tuple) ATTR
155 {
156   return SVE_ACLE_FUNC(svget2,_u32,,)(tuple, 0);
157 }
158 
159 // CHECK-LABEL: @test_svget2_u64(
160 // CHECK-NEXT:  entry:
161 // CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[TUPLE_COERCE0:%.*]], 0
162 // CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[TUPLE_COERCE1:%.*]], 1
163 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]], 1
164 // CHECK-NEXT:    ret <vscale x 2 x i64> [[TMP2]]
165 //
166 // CPP-CHECK-LABEL: @_Z15test_svget2_u6412svuint64x2_t(
167 // CPP-CHECK-NEXT:  entry:
168 // CPP-CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[TUPLE_COERCE0:%.*]], 0
169 // CPP-CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[TUPLE_COERCE1:%.*]], 1
170 // CPP-CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]], 1
171 // CPP-CHECK-NEXT:    ret <vscale x 2 x i64> [[TMP2]]
172 //
173 svuint64_t test_svget2_u64(svuint64x2_t tuple) ATTR
174 {
175   return SVE_ACLE_FUNC(svget2,_u64,,)(tuple, 1);
176 }
177 
178 // CHECK-LABEL: @test_svget2_f16(
179 // CHECK-NEXT:  entry:
180 // CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } poison, <vscale x 8 x half> [[TUPLE_COERCE0:%.*]], 0
181 // CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP0]], <vscale x 8 x half> [[TUPLE_COERCE1:%.*]], 1
182 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP1]], 0
183 // CHECK-NEXT:    ret <vscale x 8 x half> [[TMP2]]
184 //
185 // CPP-CHECK-LABEL: @_Z15test_svget2_f1613svfloat16x2_t(
186 // CPP-CHECK-NEXT:  entry:
187 // CPP-CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } poison, <vscale x 8 x half> [[TUPLE_COERCE0:%.*]], 0
188 // CPP-CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP0]], <vscale x 8 x half> [[TUPLE_COERCE1:%.*]], 1
189 // CPP-CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP1]], 0
190 // CPP-CHECK-NEXT:    ret <vscale x 8 x half> [[TMP2]]
191 //
192 svfloat16_t test_svget2_f16(svfloat16x2_t tuple) ATTR
193 {
194   return SVE_ACLE_FUNC(svget2,_f16,,)(tuple, 0);
195 }
196 
197 // CHECK-LABEL: @test_svget2_f32(
198 // CHECK-NEXT:  entry:
199 // CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } poison, <vscale x 4 x float> [[TUPLE_COERCE0:%.*]], 0
200 // CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP0]], <vscale x 4 x float> [[TUPLE_COERCE1:%.*]], 1
201 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP1]], 1
202 // CHECK-NEXT:    ret <vscale x 4 x float> [[TMP2]]
203 //
204 // CPP-CHECK-LABEL: @_Z15test_svget2_f3213svfloat32x2_t(
205 // CPP-CHECK-NEXT:  entry:
206 // CPP-CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } poison, <vscale x 4 x float> [[TUPLE_COERCE0:%.*]], 0
207 // CPP-CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP0]], <vscale x 4 x float> [[TUPLE_COERCE1:%.*]], 1
208 // CPP-CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP1]], 1
209 // CPP-CHECK-NEXT:    ret <vscale x 4 x float> [[TMP2]]
210 //
211 svfloat32_t test_svget2_f32(svfloat32x2_t tuple) ATTR
212 {
213   return SVE_ACLE_FUNC(svget2,_f32,,)(tuple, 1);
214 }
215 
216 // CHECK-LABEL: @test_svget2_f64(
217 // CHECK-NEXT:  entry:
218 // CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } poison, <vscale x 2 x double> [[TUPLE_COERCE0:%.*]], 0
219 // CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP0]], <vscale x 2 x double> [[TUPLE_COERCE1:%.*]], 1
220 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP1]], 0
221 // CHECK-NEXT:    ret <vscale x 2 x double> [[TMP2]]
222 //
223 // CPP-CHECK-LABEL: @_Z15test_svget2_f6413svfloat64x2_t(
224 // CPP-CHECK-NEXT:  entry:
225 // CPP-CHECK-NEXT:    [[TMP0:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } poison, <vscale x 2 x double> [[TUPLE_COERCE0:%.*]], 0
226 // CPP-CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP0]], <vscale x 2 x double> [[TUPLE_COERCE1:%.*]], 1
227 // CPP-CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP1]], 0
228 // CPP-CHECK-NEXT:    ret <vscale x 2 x double> [[TMP2]]
229 //
230 svfloat64_t test_svget2_f64(svfloat64x2_t tuple) ATTR
231 {
232   return SVE_ACLE_FUNC(svget2,_f64,,)(tuple, 0);
233 }
234