[SLP]Propagate AssumptionCache where possible
[llvm-project.git] / clang / test / CodeGen / AArch64 / v8.2a-neon-intrinsics.c
blob1cce977b60e6b451b06a590c811a57e53046ff40
1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature
2 // RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -target-feature +fullfp16 -target-feature +v8.2a\
3 // RUN: -flax-vector-conversions=none -disable-O0-optnone -emit-llvm -o - %s \
4 // RUN: | opt -S -passes=mem2reg \
5 // RUN: | FileCheck %s
7 // REQUIRES: aarch64-registered-target
9 #include <arm_neon.h>
11 // CHECK-LABEL: define {{[^@]+}}@test_vabs_f16
12 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0:[0-9]+]] {
13 // CHECK-NEXT: entry:
14 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
15 // CHECK-NEXT: [[VABS1_I:%.*]] = call <4 x half> @llvm.fabs.v4f16(<4 x half> [[A]])
16 // CHECK-NEXT: ret <4 x half> [[VABS1_I]]
18 float16x4_t test_vabs_f16(float16x4_t a) {
19 return vabs_f16(a);
22 // CHECK-LABEL: define {{[^@]+}}@test_vabsq_f16
23 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
24 // CHECK-NEXT: entry:
25 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
26 // CHECK-NEXT: [[VABS1_I:%.*]] = call <8 x half> @llvm.fabs.v8f16(<8 x half> [[A]])
27 // CHECK-NEXT: ret <8 x half> [[VABS1_I]]
29 float16x8_t test_vabsq_f16(float16x8_t a) {
30 return vabsq_f16(a);
33 // CHECK-LABEL: define {{[^@]+}}@test_vceqz_f16
34 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
35 // CHECK-NEXT: entry:
36 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
37 // CHECK-NEXT: [[TMP1:%.*]] = fcmp oeq <4 x half> [[A]], zeroinitializer
38 // CHECK-NEXT: [[VCEQZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
39 // CHECK-NEXT: ret <4 x i16> [[VCEQZ_I]]
41 uint16x4_t test_vceqz_f16(float16x4_t a) {
42 return vceqz_f16(a);
45 // CHECK-LABEL: define {{[^@]+}}@test_vceqzq_f16
46 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
47 // CHECK-NEXT: entry:
48 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
49 // CHECK-NEXT: [[TMP1:%.*]] = fcmp oeq <8 x half> [[A]], zeroinitializer
50 // CHECK-NEXT: [[VCEQZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
51 // CHECK-NEXT: ret <8 x i16> [[VCEQZ_I]]
53 uint16x8_t test_vceqzq_f16(float16x8_t a) {
54 return vceqzq_f16(a);
57 // CHECK-LABEL: define {{[^@]+}}@test_vcgez_f16
58 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
59 // CHECK-NEXT: entry:
60 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
61 // CHECK-NEXT: [[TMP1:%.*]] = fcmp oge <4 x half> [[A]], zeroinitializer
62 // CHECK-NEXT: [[VCGEZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
63 // CHECK-NEXT: ret <4 x i16> [[VCGEZ_I]]
65 uint16x4_t test_vcgez_f16(float16x4_t a) {
66 return vcgez_f16(a);
69 // CHECK-LABEL: define {{[^@]+}}@test_vcgezq_f16
70 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
71 // CHECK-NEXT: entry:
72 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
73 // CHECK-NEXT: [[TMP1:%.*]] = fcmp oge <8 x half> [[A]], zeroinitializer
74 // CHECK-NEXT: [[VCGEZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
75 // CHECK-NEXT: ret <8 x i16> [[VCGEZ_I]]
77 uint16x8_t test_vcgezq_f16(float16x8_t a) {
78 return vcgezq_f16(a);
81 // CHECK-LABEL: define {{[^@]+}}@test_vcgtz_f16
82 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
83 // CHECK-NEXT: entry:
84 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
85 // CHECK-NEXT: [[TMP1:%.*]] = fcmp ogt <4 x half> [[A]], zeroinitializer
86 // CHECK-NEXT: [[VCGTZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
87 // CHECK-NEXT: ret <4 x i16> [[VCGTZ_I]]
89 uint16x4_t test_vcgtz_f16(float16x4_t a) {
90 return vcgtz_f16(a);
93 // CHECK-LABEL: define {{[^@]+}}@test_vcgtzq_f16
94 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
95 // CHECK-NEXT: entry:
96 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
97 // CHECK-NEXT: [[TMP1:%.*]] = fcmp ogt <8 x half> [[A]], zeroinitializer
98 // CHECK-NEXT: [[VCGTZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
99 // CHECK-NEXT: ret <8 x i16> [[VCGTZ_I]]
101 uint16x8_t test_vcgtzq_f16(float16x8_t a) {
102 return vcgtzq_f16(a);
105 // CHECK-LABEL: define {{[^@]+}}@test_vclez_f16
106 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
107 // CHECK-NEXT: entry:
108 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
109 // CHECK-NEXT: [[TMP1:%.*]] = fcmp ole <4 x half> [[A]], zeroinitializer
110 // CHECK-NEXT: [[VCLEZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
111 // CHECK-NEXT: ret <4 x i16> [[VCLEZ_I]]
113 uint16x4_t test_vclez_f16(float16x4_t a) {
114 return vclez_f16(a);
117 // CHECK-LABEL: define {{[^@]+}}@test_vclezq_f16
118 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
119 // CHECK-NEXT: entry:
120 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
121 // CHECK-NEXT: [[TMP1:%.*]] = fcmp ole <8 x half> [[A]], zeroinitializer
122 // CHECK-NEXT: [[VCLEZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
123 // CHECK-NEXT: ret <8 x i16> [[VCLEZ_I]]
125 uint16x8_t test_vclezq_f16(float16x8_t a) {
126 return vclezq_f16(a);
129 // CHECK-LABEL: define {{[^@]+}}@test_vcltz_f16
130 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
131 // CHECK-NEXT: entry:
132 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
133 // CHECK-NEXT: [[TMP1:%.*]] = fcmp olt <4 x half> [[A]], zeroinitializer
134 // CHECK-NEXT: [[VCLTZ_I:%.*]] = sext <4 x i1> [[TMP1]] to <4 x i16>
135 // CHECK-NEXT: ret <4 x i16> [[VCLTZ_I]]
137 uint16x4_t test_vcltz_f16(float16x4_t a) {
138 return vcltz_f16(a);
141 // CHECK-LABEL: define {{[^@]+}}@test_vcltzq_f16
142 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
143 // CHECK-NEXT: entry:
144 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
145 // CHECK-NEXT: [[TMP1:%.*]] = fcmp olt <8 x half> [[A]], zeroinitializer
146 // CHECK-NEXT: [[VCLTZ_I:%.*]] = sext <8 x i1> [[TMP1]] to <8 x i16>
147 // CHECK-NEXT: ret <8 x i16> [[VCLTZ_I]]
149 uint16x8_t test_vcltzq_f16(float16x8_t a) {
150 return vcltzq_f16(a);
153 // CHECK-LABEL: define {{[^@]+}}@test_vcvt_f16_s16
154 // CHECK-SAME: (<4 x i16> noundef [[A:%.*]]) #[[ATTR0]] {
155 // CHECK-NEXT: entry:
156 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i16> [[A]] to <8 x i8>
157 // CHECK-NEXT: [[VCVT_I:%.*]] = sitofp <4 x i16> [[A]] to <4 x half>
158 // CHECK-NEXT: ret <4 x half> [[VCVT_I]]
160 float16x4_t test_vcvt_f16_s16 (int16x4_t a) {
161 return vcvt_f16_s16(a);
164 // CHECK-LABEL: define {{[^@]+}}@test_vcvtq_f16_s16
165 // CHECK-SAME: (<8 x i16> noundef [[A:%.*]]) #[[ATTR0]] {
166 // CHECK-NEXT: entry:
167 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A]] to <16 x i8>
168 // CHECK-NEXT: [[VCVT_I:%.*]] = sitofp <8 x i16> [[A]] to <8 x half>
169 // CHECK-NEXT: ret <8 x half> [[VCVT_I]]
171 float16x8_t test_vcvtq_f16_s16 (int16x8_t a) {
172 return vcvtq_f16_s16(a);
175 // CHECK-LABEL: define {{[^@]+}}@test_vcvt_f16_u16
176 // CHECK-SAME: (<4 x i16> noundef [[A:%.*]]) #[[ATTR0]] {
177 // CHECK-NEXT: entry:
178 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i16> [[A]] to <8 x i8>
179 // CHECK-NEXT: [[VCVT_I:%.*]] = uitofp <4 x i16> [[A]] to <4 x half>
180 // CHECK-NEXT: ret <4 x half> [[VCVT_I]]
182 float16x4_t test_vcvt_f16_u16 (uint16x4_t a) {
183 return vcvt_f16_u16(a);
186 // CHECK-LABEL: define {{[^@]+}}@test_vcvtq_f16_u16
187 // CHECK-SAME: (<8 x i16> noundef [[A:%.*]]) #[[ATTR0]] {
188 // CHECK-NEXT: entry:
189 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A]] to <16 x i8>
190 // CHECK-NEXT: [[VCVT_I:%.*]] = uitofp <8 x i16> [[A]] to <8 x half>
191 // CHECK-NEXT: ret <8 x half> [[VCVT_I]]
193 float16x8_t test_vcvtq_f16_u16 (uint16x8_t a) {
194 return vcvtq_f16_u16(a);
197 // CHECK-LABEL: define {{[^@]+}}@test_vcvt_s16_f16
198 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
199 // CHECK-NEXT: entry:
200 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
201 // CHECK-NEXT: [[VCVTZ1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtzs.v4i16.v4f16(<4 x half> [[A]])
202 // CHECK-NEXT: ret <4 x i16> [[VCVTZ1_I]]
204 int16x4_t test_vcvt_s16_f16 (float16x4_t a) {
205 return vcvt_s16_f16(a);
208 // CHECK-LABEL: define {{[^@]+}}@test_vcvtq_s16_f16
209 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
210 // CHECK-NEXT: entry:
211 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
212 // CHECK-NEXT: [[VCVTZ1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtzs.v8i16.v8f16(<8 x half> [[A]])
213 // CHECK-NEXT: ret <8 x i16> [[VCVTZ1_I]]
215 int16x8_t test_vcvtq_s16_f16 (float16x8_t a) {
216 return vcvtq_s16_f16(a);
219 // CHECK-LABEL: define {{[^@]+}}@test_vcvt_u16_f16
220 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
221 // CHECK-NEXT: entry:
222 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
223 // CHECK-NEXT: [[VCVTZ1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtzu.v4i16.v4f16(<4 x half> [[A]])
224 // CHECK-NEXT: ret <4 x i16> [[VCVTZ1_I]]
226 uint16x4_t test_vcvt_u16_f16 (float16x4_t a) {
227 return vcvt_u16_f16(a);
230 // CHECK-LABEL: define {{[^@]+}}@test_vcvtq_u16_f16
231 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
232 // CHECK-NEXT: entry:
233 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
234 // CHECK-NEXT: [[VCVTZ1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtzu.v8i16.v8f16(<8 x half> [[A]])
235 // CHECK-NEXT: ret <8 x i16> [[VCVTZ1_I]]
237 uint16x8_t test_vcvtq_u16_f16 (float16x8_t a) {
238 return vcvtq_u16_f16(a);
241 // CHECK-LABEL: define {{[^@]+}}@test_vcvta_s16_f16
242 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
243 // CHECK-NEXT: entry:
244 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
245 // CHECK-NEXT: [[VCVTA1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtas.v4i16.v4f16(<4 x half> [[A]])
246 // CHECK-NEXT: ret <4 x i16> [[VCVTA1_I]]
248 int16x4_t test_vcvta_s16_f16 (float16x4_t a) {
249 return vcvta_s16_f16(a);
252 // CHECK-LABEL: define {{[^@]+}}@test_vcvta_u16_f16
253 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
254 // CHECK-NEXT: entry:
255 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
256 // CHECK-NEXT: [[VCVTA1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtau.v4i16.v4f16(<4 x half> [[A]])
257 // CHECK-NEXT: ret <4 x i16> [[VCVTA1_I]]
259 uint16x4_t test_vcvta_u16_f16 (float16x4_t a) {
260 return vcvta_u16_f16(a);
263 // CHECK-LABEL: define {{[^@]+}}@test_vcvtaq_s16_f16
264 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
265 // CHECK-NEXT: entry:
266 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
267 // CHECK-NEXT: [[VCVTA1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtas.v8i16.v8f16(<8 x half> [[A]])
268 // CHECK-NEXT: ret <8 x i16> [[VCVTA1_I]]
270 int16x8_t test_vcvtaq_s16_f16 (float16x8_t a) {
271 return vcvtaq_s16_f16(a);
274 // CHECK-LABEL: define {{[^@]+}}@test_vcvtm_s16_f16
275 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
276 // CHECK-NEXT: entry:
277 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
278 // CHECK-NEXT: [[VCVTM1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtms.v4i16.v4f16(<4 x half> [[A]])
279 // CHECK-NEXT: ret <4 x i16> [[VCVTM1_I]]
281 int16x4_t test_vcvtm_s16_f16 (float16x4_t a) {
282 return vcvtm_s16_f16(a);
285 // CHECK-LABEL: define {{[^@]+}}@test_vcvtmq_s16_f16
286 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
287 // CHECK-NEXT: entry:
288 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
289 // CHECK-NEXT: [[VCVTM1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtms.v8i16.v8f16(<8 x half> [[A]])
290 // CHECK-NEXT: ret <8 x i16> [[VCVTM1_I]]
292 int16x8_t test_vcvtmq_s16_f16 (float16x8_t a) {
293 return vcvtmq_s16_f16(a);
296 // CHECK-LABEL: define {{[^@]+}}@test_vcvtm_u16_f16
297 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
298 // CHECK-NEXT: entry:
299 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
300 // CHECK-NEXT: [[VCVTM1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtmu.v4i16.v4f16(<4 x half> [[A]])
301 // CHECK-NEXT: ret <4 x i16> [[VCVTM1_I]]
303 uint16x4_t test_vcvtm_u16_f16 (float16x4_t a) {
304 return vcvtm_u16_f16(a);
307 // CHECK-LABEL: define {{[^@]+}}@test_vcvtmq_u16_f16
308 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
309 // CHECK-NEXT: entry:
310 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
311 // CHECK-NEXT: [[VCVTM1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtmu.v8i16.v8f16(<8 x half> [[A]])
312 // CHECK-NEXT: ret <8 x i16> [[VCVTM1_I]]
314 uint16x8_t test_vcvtmq_u16_f16 (float16x8_t a) {
315 return vcvtmq_u16_f16(a);
318 // CHECK-LABEL: define {{[^@]+}}@test_vcvtn_s16_f16
319 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
320 // CHECK-NEXT: entry:
321 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
322 // CHECK-NEXT: [[VCVTN1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtns.v4i16.v4f16(<4 x half> [[A]])
323 // CHECK-NEXT: ret <4 x i16> [[VCVTN1_I]]
325 int16x4_t test_vcvtn_s16_f16 (float16x4_t a) {
326 return vcvtn_s16_f16(a);
329 // CHECK-LABEL: define {{[^@]+}}@test_vcvtnq_s16_f16
330 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
331 // CHECK-NEXT: entry:
332 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
333 // CHECK-NEXT: [[VCVTN1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtns.v8i16.v8f16(<8 x half> [[A]])
334 // CHECK-NEXT: ret <8 x i16> [[VCVTN1_I]]
336 int16x8_t test_vcvtnq_s16_f16 (float16x8_t a) {
337 return vcvtnq_s16_f16(a);
340 // CHECK-LABEL: define {{[^@]+}}@test_vcvtn_u16_f16
341 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
342 // CHECK-NEXT: entry:
343 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
344 // CHECK-NEXT: [[VCVTN1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtnu.v4i16.v4f16(<4 x half> [[A]])
345 // CHECK-NEXT: ret <4 x i16> [[VCVTN1_I]]
347 uint16x4_t test_vcvtn_u16_f16 (float16x4_t a) {
348 return vcvtn_u16_f16(a);
351 // CHECK-LABEL: define {{[^@]+}}@test_vcvtnq_u16_f16
352 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
353 // CHECK-NEXT: entry:
354 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
355 // CHECK-NEXT: [[VCVTN1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtnu.v8i16.v8f16(<8 x half> [[A]])
356 // CHECK-NEXT: ret <8 x i16> [[VCVTN1_I]]
358 uint16x8_t test_vcvtnq_u16_f16 (float16x8_t a) {
359 return vcvtnq_u16_f16(a);
362 // CHECK-LABEL: define {{[^@]+}}@test_vcvtp_s16_f16
363 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
364 // CHECK-NEXT: entry:
365 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
366 // CHECK-NEXT: [[VCVTP1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtps.v4i16.v4f16(<4 x half> [[A]])
367 // CHECK-NEXT: ret <4 x i16> [[VCVTP1_I]]
369 int16x4_t test_vcvtp_s16_f16 (float16x4_t a) {
370 return vcvtp_s16_f16(a);
373 // CHECK-LABEL: define {{[^@]+}}@test_vcvtpq_s16_f16
374 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
375 // CHECK-NEXT: entry:
376 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
377 // CHECK-NEXT: [[VCVTP1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtps.v8i16.v8f16(<8 x half> [[A]])
378 // CHECK-NEXT: ret <8 x i16> [[VCVTP1_I]]
380 int16x8_t test_vcvtpq_s16_f16 (float16x8_t a) {
381 return vcvtpq_s16_f16(a);
384 // CHECK-LABEL: define {{[^@]+}}@test_vcvtp_u16_f16
385 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
386 // CHECK-NEXT: entry:
387 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
388 // CHECK-NEXT: [[VCVTP1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.fcvtpu.v4i16.v4f16(<4 x half> [[A]])
389 // CHECK-NEXT: ret <4 x i16> [[VCVTP1_I]]
391 uint16x4_t test_vcvtp_u16_f16 (float16x4_t a) {
392 return vcvtp_u16_f16(a);
395 // CHECK-LABEL: define {{[^@]+}}@test_vcvtpq_u16_f16
396 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
397 // CHECK-NEXT: entry:
398 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
399 // CHECK-NEXT: [[VCVTP1_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.fcvtpu.v8i16.v8f16(<8 x half> [[A]])
400 // CHECK-NEXT: ret <8 x i16> [[VCVTP1_I]]
402 uint16x8_t test_vcvtpq_u16_f16 (float16x8_t a) {
403 return vcvtpq_u16_f16(a);
406 // FIXME: Fix the zero constant when fp16 non-storage-only type becomes available.
407 // CHECK-LABEL: define {{[^@]+}}@test_vneg_f16
408 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
409 // CHECK-NEXT: entry:
410 // CHECK-NEXT: [[FNEG_I:%.*]] = fneg <4 x half> [[A]]
411 // CHECK-NEXT: ret <4 x half> [[FNEG_I]]
413 float16x4_t test_vneg_f16(float16x4_t a) {
414 return vneg_f16(a);
417 // CHECK-LABEL: define {{[^@]+}}@test_vnegq_f16
418 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
419 // CHECK-NEXT: entry:
420 // CHECK-NEXT: [[FNEG_I:%.*]] = fneg <8 x half> [[A]]
421 // CHECK-NEXT: ret <8 x half> [[FNEG_I]]
423 float16x8_t test_vnegq_f16(float16x8_t a) {
424 return vnegq_f16(a);
427 // CHECK-LABEL: define {{[^@]+}}@test_vrecpe_f16
428 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
429 // CHECK-NEXT: entry:
430 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
431 // CHECK-NEXT: [[VRECPE_V1_I:%.*]] = call <4 x half> @llvm.aarch64.neon.frecpe.v4f16(<4 x half> [[A]])
432 // CHECK-NEXT: ret <4 x half> [[VRECPE_V1_I]]
434 float16x4_t test_vrecpe_f16(float16x4_t a) {
435 return vrecpe_f16(a);
438 // CHECK-LABEL: define {{[^@]+}}@test_vrecpeq_f16
439 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
440 // CHECK-NEXT: entry:
441 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
442 // CHECK-NEXT: [[VRECPEQ_V1_I:%.*]] = call <8 x half> @llvm.aarch64.neon.frecpe.v8f16(<8 x half> [[A]])
443 // CHECK-NEXT: ret <8 x half> [[VRECPEQ_V1_I]]
445 float16x8_t test_vrecpeq_f16(float16x8_t a) {
446 return vrecpeq_f16(a);
449 // CHECK-LABEL: define {{[^@]+}}@test_vrnd_f16
450 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
451 // CHECK-NEXT: entry:
452 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
453 // CHECK-NEXT: [[VRNDZ1_I:%.*]] = call <4 x half> @llvm.trunc.v4f16(<4 x half> [[A]])
454 // CHECK-NEXT: ret <4 x half> [[VRNDZ1_I]]
456 float16x4_t test_vrnd_f16(float16x4_t a) {
457 return vrnd_f16(a);
460 // CHECK-LABEL: define {{[^@]+}}@test_vrndq_f16
461 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
462 // CHECK-NEXT: entry:
463 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
464 // CHECK-NEXT: [[VRNDZ1_I:%.*]] = call <8 x half> @llvm.trunc.v8f16(<8 x half> [[A]])
465 // CHECK-NEXT: ret <8 x half> [[VRNDZ1_I]]
467 float16x8_t test_vrndq_f16(float16x8_t a) {
468 return vrndq_f16(a);
471 // CHECK-LABEL: define {{[^@]+}}@test_vrnda_f16
472 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
473 // CHECK-NEXT: entry:
474 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
475 // CHECK-NEXT: [[VRNDA1_I:%.*]] = call <4 x half> @llvm.round.v4f16(<4 x half> [[A]])
476 // CHECK-NEXT: ret <4 x half> [[VRNDA1_I]]
478 float16x4_t test_vrnda_f16(float16x4_t a) {
479 return vrnda_f16(a);
482 // CHECK-LABEL: define {{[^@]+}}@test_vrndaq_f16
483 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
484 // CHECK-NEXT: entry:
485 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
486 // CHECK-NEXT: [[VRNDA1_I:%.*]] = call <8 x half> @llvm.round.v8f16(<8 x half> [[A]])
487 // CHECK-NEXT: ret <8 x half> [[VRNDA1_I]]
489 float16x8_t test_vrndaq_f16(float16x8_t a) {
490 return vrndaq_f16(a);
493 // CHECK-LABEL: define {{[^@]+}}@test_vrndi_f16
494 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
495 // CHECK-NEXT: entry:
496 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
497 // CHECK-NEXT: [[VRNDI_V1_I:%.*]] = call <4 x half> @llvm.nearbyint.v4f16(<4 x half> [[A]])
498 // CHECK-NEXT: ret <4 x half> [[VRNDI_V1_I]]
500 float16x4_t test_vrndi_f16(float16x4_t a) {
501 return vrndi_f16(a);
504 // CHECK-LABEL: define {{[^@]+}}@test_vrndiq_f16
505 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
506 // CHECK-NEXT: entry:
507 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
508 // CHECK-NEXT: [[VRNDIQ_V1_I:%.*]] = call <8 x half> @llvm.nearbyint.v8f16(<8 x half> [[A]])
509 // CHECK-NEXT: ret <8 x half> [[VRNDIQ_V1_I]]
511 float16x8_t test_vrndiq_f16(float16x8_t a) {
512 return vrndiq_f16(a);
515 // CHECK-LABEL: define {{[^@]+}}@test_vrndm_f16
516 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
517 // CHECK-NEXT: entry:
518 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
519 // CHECK-NEXT: [[VRNDM1_I:%.*]] = call <4 x half> @llvm.floor.v4f16(<4 x half> [[A]])
520 // CHECK-NEXT: ret <4 x half> [[VRNDM1_I]]
522 float16x4_t test_vrndm_f16(float16x4_t a) {
523 return vrndm_f16(a);
526 // CHECK-LABEL: define {{[^@]+}}@test_vrndmq_f16
527 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
528 // CHECK-NEXT: entry:
529 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
530 // CHECK-NEXT: [[VRNDM1_I:%.*]] = call <8 x half> @llvm.floor.v8f16(<8 x half> [[A]])
531 // CHECK-NEXT: ret <8 x half> [[VRNDM1_I]]
533 float16x8_t test_vrndmq_f16(float16x8_t a) {
534 return vrndmq_f16(a);
537 // CHECK-LABEL: define {{[^@]+}}@test_vrndn_f16
538 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
539 // CHECK-NEXT: entry:
540 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
541 // CHECK-NEXT: [[VRNDN1_I:%.*]] = call <4 x half> @llvm.roundeven.v4f16(<4 x half> [[A]])
542 // CHECK-NEXT: ret <4 x half> [[VRNDN1_I]]
544 float16x4_t test_vrndn_f16(float16x4_t a) {
545 return vrndn_f16(a);
548 // CHECK-LABEL: define {{[^@]+}}@test_vrndnq_f16
549 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
550 // CHECK-NEXT: entry:
551 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
552 // CHECK-NEXT: [[VRNDN1_I:%.*]] = call <8 x half> @llvm.roundeven.v8f16(<8 x half> [[A]])
553 // CHECK-NEXT: ret <8 x half> [[VRNDN1_I]]
555 float16x8_t test_vrndnq_f16(float16x8_t a) {
556 return vrndnq_f16(a);
559 // CHECK-LABEL: define {{[^@]+}}@test_vrndp_f16
560 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
561 // CHECK-NEXT: entry:
562 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
563 // CHECK-NEXT: [[VRNDP1_I:%.*]] = call <4 x half> @llvm.ceil.v4f16(<4 x half> [[A]])
564 // CHECK-NEXT: ret <4 x half> [[VRNDP1_I]]
566 float16x4_t test_vrndp_f16(float16x4_t a) {
567 return vrndp_f16(a);
570 // CHECK-LABEL: define {{[^@]+}}@test_vrndpq_f16
571 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
572 // CHECK-NEXT: entry:
573 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
574 // CHECK-NEXT: [[VRNDP1_I:%.*]] = call <8 x half> @llvm.ceil.v8f16(<8 x half> [[A]])
575 // CHECK-NEXT: ret <8 x half> [[VRNDP1_I]]
577 float16x8_t test_vrndpq_f16(float16x8_t a) {
578 return vrndpq_f16(a);
581 // CHECK-LABEL: define {{[^@]+}}@test_vrndx_f16
582 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
583 // CHECK-NEXT: entry:
584 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
585 // CHECK-NEXT: [[VRNDX1_I:%.*]] = call <4 x half> @llvm.rint.v4f16(<4 x half> [[A]])
586 // CHECK-NEXT: ret <4 x half> [[VRNDX1_I]]
588 float16x4_t test_vrndx_f16(float16x4_t a) {
589 return vrndx_f16(a);
592 // CHECK-LABEL: define {{[^@]+}}@test_vrndxq_f16
593 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
594 // CHECK-NEXT: entry:
595 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
596 // CHECK-NEXT: [[VRNDX1_I:%.*]] = call <8 x half> @llvm.rint.v8f16(<8 x half> [[A]])
597 // CHECK-NEXT: ret <8 x half> [[VRNDX1_I]]
599 float16x8_t test_vrndxq_f16(float16x8_t a) {
600 return vrndxq_f16(a);
603 // CHECK-LABEL: define {{[^@]+}}@test_vrsqrte_f16
604 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
605 // CHECK-NEXT: entry:
606 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
607 // CHECK-NEXT: [[VRSQRTE_V1_I:%.*]] = call <4 x half> @llvm.aarch64.neon.frsqrte.v4f16(<4 x half> [[A]])
608 // CHECK-NEXT: ret <4 x half> [[VRSQRTE_V1_I]]
610 float16x4_t test_vrsqrte_f16(float16x4_t a) {
611 return vrsqrte_f16(a);
614 // CHECK-LABEL: define {{[^@]+}}@test_vrsqrteq_f16
615 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
616 // CHECK-NEXT: entry:
617 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
618 // CHECK-NEXT: [[VRSQRTEQ_V1_I:%.*]] = call <8 x half> @llvm.aarch64.neon.frsqrte.v8f16(<8 x half> [[A]])
619 // CHECK-NEXT: ret <8 x half> [[VRSQRTEQ_V1_I]]
621 float16x8_t test_vrsqrteq_f16(float16x8_t a) {
622 return vrsqrteq_f16(a);
625 // CHECK-LABEL: define {{[^@]+}}@test_vsqrt_f16
626 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
627 // CHECK-NEXT: entry:
628 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
629 // CHECK-NEXT: [[VSQRT_I:%.*]] = call <4 x half> @llvm.sqrt.v4f16(<4 x half> [[A]])
630 // CHECK-NEXT: ret <4 x half> [[VSQRT_I]]
632 float16x4_t test_vsqrt_f16(float16x4_t a) {
633 return vsqrt_f16(a);
636 // CHECK-LABEL: define {{[^@]+}}@test_vsqrtq_f16
637 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
638 // CHECK-NEXT: entry:
639 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
640 // CHECK-NEXT: [[VSQRT_I:%.*]] = call <8 x half> @llvm.sqrt.v8f16(<8 x half> [[A]])
641 // CHECK-NEXT: ret <8 x half> [[VSQRT_I]]
643 float16x8_t test_vsqrtq_f16(float16x8_t a) {
644 return vsqrtq_f16(a);
647 // CHECK-LABEL: define {{[^@]+}}@test_vadd_f16
648 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
649 // CHECK-NEXT: entry:
650 // CHECK-NEXT: [[ADD_I:%.*]] = fadd <4 x half> [[A]], [[B]]
651 // CHECK-NEXT: ret <4 x half> [[ADD_I]]
653 float16x4_t test_vadd_f16(float16x4_t a, float16x4_t b) {
654 return vadd_f16(a, b);
657 // CHECK-LABEL: define {{[^@]+}}@test_vaddq_f16
658 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
659 // CHECK-NEXT: entry:
660 // CHECK-NEXT: [[ADD_I:%.*]] = fadd <8 x half> [[A]], [[B]]
661 // CHECK-NEXT: ret <8 x half> [[ADD_I]]
663 float16x8_t test_vaddq_f16(float16x8_t a, float16x8_t b) {
664 return vaddq_f16(a, b);
667 // CHECK-LABEL: define {{[^@]+}}@test_vabd_f16
668 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
669 // CHECK-NEXT: entry:
670 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
671 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
672 // CHECK-NEXT: [[VABD2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fabd.v4f16(<4 x half> [[A]], <4 x half> [[B]])
673 // CHECK-NEXT: ret <4 x half> [[VABD2_I]]
675 float16x4_t test_vabd_f16(float16x4_t a, float16x4_t b) {
676 return vabd_f16(a, b);
679 // CHECK-LABEL: define {{[^@]+}}@test_vabdq_f16
680 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
681 // CHECK-NEXT: entry:
682 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
683 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
684 // CHECK-NEXT: [[VABD2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fabd.v8f16(<8 x half> [[A]], <8 x half> [[B]])
685 // CHECK-NEXT: ret <8 x half> [[VABD2_I]]
687 float16x8_t test_vabdq_f16(float16x8_t a, float16x8_t b) {
688 return vabdq_f16(a, b);
691 // CHECK-LABEL: define {{[^@]+}}@test_vcage_f16
692 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
693 // CHECK-NEXT: entry:
694 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
695 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
696 // CHECK-NEXT: [[VCAGE_V2_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.facge.v4i16.v4f16(<4 x half> [[A]], <4 x half> [[B]])
697 // CHECK-NEXT: ret <4 x i16> [[VCAGE_V2_I]]
699 uint16x4_t test_vcage_f16(float16x4_t a, float16x4_t b) {
700 return vcage_f16(a, b);
703 // CHECK-LABEL: define {{[^@]+}}@test_vcageq_f16
704 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
705 // CHECK-NEXT: entry:
706 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
707 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
708 // CHECK-NEXT: [[VCAGEQ_V2_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.facge.v8i16.v8f16(<8 x half> [[A]], <8 x half> [[B]])
709 // CHECK-NEXT: ret <8 x i16> [[VCAGEQ_V2_I]]
711 uint16x8_t test_vcageq_f16(float16x8_t a, float16x8_t b) {
712 return vcageq_f16(a, b);
715 // CHECK-LABEL: define {{[^@]+}}@test_vcagt_f16
716 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
717 // CHECK-NEXT: entry:
718 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
719 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
720 // CHECK-NEXT: [[VCAGT_V2_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.facgt.v4i16.v4f16(<4 x half> [[A]], <4 x half> [[B]])
721 // CHECK-NEXT: ret <4 x i16> [[VCAGT_V2_I]]
723 uint16x4_t test_vcagt_f16(float16x4_t a, float16x4_t b) {
724 return vcagt_f16(a, b);
727 // CHECK-LABEL: define {{[^@]+}}@test_vcagtq_f16
728 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
729 // CHECK-NEXT: entry:
730 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
731 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
732 // CHECK-NEXT: [[VCAGTQ_V2_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.facgt.v8i16.v8f16(<8 x half> [[A]], <8 x half> [[B]])
733 // CHECK-NEXT: ret <8 x i16> [[VCAGTQ_V2_I]]
735 uint16x8_t test_vcagtq_f16(float16x8_t a, float16x8_t b) {
736 return vcagtq_f16(a, b);
739 // CHECK-LABEL: define {{[^@]+}}@test_vcale_f16
740 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
741 // CHECK-NEXT: entry:
742 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
743 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
744 // CHECK-NEXT: [[VCALE_V2_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.facge.v4i16.v4f16(<4 x half> [[B]], <4 x half> [[A]])
745 // CHECK-NEXT: ret <4 x i16> [[VCALE_V2_I]]
747 uint16x4_t test_vcale_f16(float16x4_t a, float16x4_t b) {
748 return vcale_f16(a, b);
751 // CHECK-LABEL: define {{[^@]+}}@test_vcaleq_f16
752 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
753 // CHECK-NEXT: entry:
754 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
755 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
756 // CHECK-NEXT: [[VCALEQ_V2_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.facge.v8i16.v8f16(<8 x half> [[B]], <8 x half> [[A]])
757 // CHECK-NEXT: ret <8 x i16> [[VCALEQ_V2_I]]
759 uint16x8_t test_vcaleq_f16(float16x8_t a, float16x8_t b) {
760 return vcaleq_f16(a, b);
763 // CHECK-LABEL: define {{[^@]+}}@test_vcalt_f16
764 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
765 // CHECK-NEXT: entry:
766 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
767 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
768 // CHECK-NEXT: [[VCALT_V2_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.facgt.v4i16.v4f16(<4 x half> [[B]], <4 x half> [[A]])
769 // CHECK-NEXT: ret <4 x i16> [[VCALT_V2_I]]
771 uint16x4_t test_vcalt_f16(float16x4_t a, float16x4_t b) {
772 return vcalt_f16(a, b);
775 // CHECK-LABEL: define {{[^@]+}}@test_vcaltq_f16
776 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
777 // CHECK-NEXT: entry:
778 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
779 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
780 // CHECK-NEXT: [[VCALTQ_V2_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.facgt.v8i16.v8f16(<8 x half> [[B]], <8 x half> [[A]])
781 // CHECK-NEXT: ret <8 x i16> [[VCALTQ_V2_I]]
783 uint16x8_t test_vcaltq_f16(float16x8_t a, float16x8_t b) {
784 return vcaltq_f16(a, b);
787 // CHECK-LABEL: define {{[^@]+}}@test_vceq_f16
788 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
789 // CHECK-NEXT: entry:
790 // CHECK-NEXT: [[CMP_I:%.*]] = fcmp oeq <4 x half> [[A]], [[B]]
791 // CHECK-NEXT: [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
792 // CHECK-NEXT: ret <4 x i16> [[SEXT_I]]
794 uint16x4_t test_vceq_f16(float16x4_t a, float16x4_t b) {
795 return vceq_f16(a, b);
798 // CHECK-LABEL: define {{[^@]+}}@test_vceqq_f16
799 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
800 // CHECK-NEXT: entry:
801 // CHECK-NEXT: [[CMP_I:%.*]] = fcmp oeq <8 x half> [[A]], [[B]]
802 // CHECK-NEXT: [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i16>
803 // CHECK-NEXT: ret <8 x i16> [[SEXT_I]]
805 uint16x8_t test_vceqq_f16(float16x8_t a, float16x8_t b) {
806 return vceqq_f16(a, b);
809 // CHECK-LABEL: define {{[^@]+}}@test_vcge_f16
810 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
811 // CHECK-NEXT: entry:
812 // CHECK-NEXT: [[CMP_I:%.*]] = fcmp oge <4 x half> [[A]], [[B]]
813 // CHECK-NEXT: [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
814 // CHECK-NEXT: ret <4 x i16> [[SEXT_I]]
816 uint16x4_t test_vcge_f16(float16x4_t a, float16x4_t b) {
817 return vcge_f16(a, b);
820 // CHECK-LABEL: define {{[^@]+}}@test_vcgeq_f16
821 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
822 // CHECK-NEXT: entry:
823 // CHECK-NEXT: [[CMP_I:%.*]] = fcmp oge <8 x half> [[A]], [[B]]
824 // CHECK-NEXT: [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i16>
825 // CHECK-NEXT: ret <8 x i16> [[SEXT_I]]
827 uint16x8_t test_vcgeq_f16(float16x8_t a, float16x8_t b) {
828 return vcgeq_f16(a, b);
831 // CHECK-LABEL: define {{[^@]+}}@test_vcgt_f16
832 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
833 // CHECK-NEXT: entry:
834 // CHECK-NEXT: [[CMP_I:%.*]] = fcmp ogt <4 x half> [[A]], [[B]]
835 // CHECK-NEXT: [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
836 // CHECK-NEXT: ret <4 x i16> [[SEXT_I]]
838 uint16x4_t test_vcgt_f16(float16x4_t a, float16x4_t b) {
839 return vcgt_f16(a, b);
842 // CHECK-LABEL: define {{[^@]+}}@test_vcgtq_f16
843 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
844 // CHECK-NEXT: entry:
845 // CHECK-NEXT: [[CMP_I:%.*]] = fcmp ogt <8 x half> [[A]], [[B]]
846 // CHECK-NEXT: [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i16>
847 // CHECK-NEXT: ret <8 x i16> [[SEXT_I]]
849 uint16x8_t test_vcgtq_f16(float16x8_t a, float16x8_t b) {
850 return vcgtq_f16(a, b);
853 // CHECK-LABEL: define {{[^@]+}}@test_vcle_f16
854 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
855 // CHECK-NEXT: entry:
856 // CHECK-NEXT: [[CMP_I:%.*]] = fcmp ole <4 x half> [[A]], [[B]]
857 // CHECK-NEXT: [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
858 // CHECK-NEXT: ret <4 x i16> [[SEXT_I]]
860 uint16x4_t test_vcle_f16(float16x4_t a, float16x4_t b) {
861 return vcle_f16(a, b);
864 // CHECK-LABEL: define {{[^@]+}}@test_vcleq_f16
865 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
866 // CHECK-NEXT: entry:
867 // CHECK-NEXT: [[CMP_I:%.*]] = fcmp ole <8 x half> [[A]], [[B]]
868 // CHECK-NEXT: [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i16>
869 // CHECK-NEXT: ret <8 x i16> [[SEXT_I]]
871 uint16x8_t test_vcleq_f16(float16x8_t a, float16x8_t b) {
872 return vcleq_f16(a, b);
875 // CHECK-LABEL: define {{[^@]+}}@test_vclt_f16
876 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
877 // CHECK-NEXT: entry:
878 // CHECK-NEXT: [[CMP_I:%.*]] = fcmp olt <4 x half> [[A]], [[B]]
879 // CHECK-NEXT: [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
880 // CHECK-NEXT: ret <4 x i16> [[SEXT_I]]
882 uint16x4_t test_vclt_f16(float16x4_t a, float16x4_t b) {
883 return vclt_f16(a, b);
886 // CHECK-LABEL: define {{[^@]+}}@test_vcltq_f16
887 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
888 // CHECK-NEXT: entry:
889 // CHECK-NEXT: [[CMP_I:%.*]] = fcmp olt <8 x half> [[A]], [[B]]
890 // CHECK-NEXT: [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i16>
891 // CHECK-NEXT: ret <8 x i16> [[SEXT_I]]
893 uint16x8_t test_vcltq_f16(float16x8_t a, float16x8_t b) {
894 return vcltq_f16(a, b);
897 // CHECK-LABEL: define {{[^@]+}}@test_vcvt_n_f16_s16
898 // CHECK-SAME: (<4 x i16> noundef [[A:%.*]]) #[[ATTR0]] {
899 // CHECK-NEXT: entry:
900 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i16> [[A]] to <8 x i8>
901 // CHECK-NEXT: [[VCVT_N:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16>
902 // CHECK-NEXT: [[VCVT_N1:%.*]] = call <4 x half> @llvm.aarch64.neon.vcvtfxs2fp.v4f16.v4i16(<4 x i16> [[VCVT_N]], i32 2)
903 // CHECK-NEXT: ret <4 x half> [[VCVT_N1]]
905 float16x4_t test_vcvt_n_f16_s16(int16x4_t a) {
906 return vcvt_n_f16_s16(a, 2);
909 // CHECK-LABEL: define {{[^@]+}}@test_vcvtq_n_f16_s16
910 // CHECK-SAME: (<8 x i16> noundef [[A:%.*]]) #[[ATTR0]] {
911 // CHECK-NEXT: entry:
912 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A]] to <16 x i8>
913 // CHECK-NEXT: [[VCVT_N:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16>
914 // CHECK-NEXT: [[VCVT_N1:%.*]] = call <8 x half> @llvm.aarch64.neon.vcvtfxs2fp.v8f16.v8i16(<8 x i16> [[VCVT_N]], i32 2)
915 // CHECK-NEXT: ret <8 x half> [[VCVT_N1]]
917 float16x8_t test_vcvtq_n_f16_s16(int16x8_t a) {
918 return vcvtq_n_f16_s16(a, 2);
921 // CHECK-LABEL: define {{[^@]+}}@test_vcvt_n_f16_u16
922 // CHECK-SAME: (<4 x i16> noundef [[A:%.*]]) #[[ATTR0]] {
923 // CHECK-NEXT: entry:
924 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i16> [[A]] to <8 x i8>
925 // CHECK-NEXT: [[VCVT_N:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16>
926 // CHECK-NEXT: [[VCVT_N1:%.*]] = call <4 x half> @llvm.aarch64.neon.vcvtfxu2fp.v4f16.v4i16(<4 x i16> [[VCVT_N]], i32 2)
927 // CHECK-NEXT: ret <4 x half> [[VCVT_N1]]
929 float16x4_t test_vcvt_n_f16_u16(uint16x4_t a) {
930 return vcvt_n_f16_u16(a, 2);
933 // CHECK-LABEL: define {{[^@]+}}@test_vcvtq_n_f16_u16
934 // CHECK-SAME: (<8 x i16> noundef [[A:%.*]]) #[[ATTR0]] {
935 // CHECK-NEXT: entry:
936 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A]] to <16 x i8>
937 // CHECK-NEXT: [[VCVT_N:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16>
938 // CHECK-NEXT: [[VCVT_N1:%.*]] = call <8 x half> @llvm.aarch64.neon.vcvtfxu2fp.v8f16.v8i16(<8 x i16> [[VCVT_N]], i32 2)
939 // CHECK-NEXT: ret <8 x half> [[VCVT_N1]]
941 float16x8_t test_vcvtq_n_f16_u16(uint16x8_t a) {
942 return vcvtq_n_f16_u16(a, 2);
945 // CHECK-LABEL: define {{[^@]+}}@test_vcvt_n_s16_f16
946 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
947 // CHECK-NEXT: entry:
948 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
949 // CHECK-NEXT: [[VCVT_N:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
950 // CHECK-NEXT: [[VCVT_N1:%.*]] = call <4 x i16> @llvm.aarch64.neon.vcvtfp2fxs.v4i16.v4f16(<4 x half> [[VCVT_N]], i32 2)
951 // CHECK-NEXT: ret <4 x i16> [[VCVT_N1]]
953 int16x4_t test_vcvt_n_s16_f16(float16x4_t a) {
954 return vcvt_n_s16_f16(a, 2);
957 // CHECK-LABEL: define {{[^@]+}}@test_vcvtq_n_s16_f16
958 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
959 // CHECK-NEXT: entry:
960 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
961 // CHECK-NEXT: [[VCVT_N:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
962 // CHECK-NEXT: [[VCVT_N1:%.*]] = call <8 x i16> @llvm.aarch64.neon.vcvtfp2fxs.v8i16.v8f16(<8 x half> [[VCVT_N]], i32 2)
963 // CHECK-NEXT: ret <8 x i16> [[VCVT_N1]]
965 int16x8_t test_vcvtq_n_s16_f16(float16x8_t a) {
966 return vcvtq_n_s16_f16(a, 2);
969 // CHECK-LABEL: define {{[^@]+}}@test_vcvt_n_u16_f16
970 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
971 // CHECK-NEXT: entry:
972 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
973 // CHECK-NEXT: [[VCVT_N:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
974 // CHECK-NEXT: [[VCVT_N1:%.*]] = call <4 x i16> @llvm.aarch64.neon.vcvtfp2fxu.v4i16.v4f16(<4 x half> [[VCVT_N]], i32 2)
975 // CHECK-NEXT: ret <4 x i16> [[VCVT_N1]]
977 uint16x4_t test_vcvt_n_u16_f16(float16x4_t a) {
978 return vcvt_n_u16_f16(a, 2);
981 // CHECK-LABEL: define {{[^@]+}}@test_vcvtq_n_u16_f16
982 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
983 // CHECK-NEXT: entry:
984 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
985 // CHECK-NEXT: [[VCVT_N:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
986 // CHECK-NEXT: [[VCVT_N1:%.*]] = call <8 x i16> @llvm.aarch64.neon.vcvtfp2fxu.v8i16.v8f16(<8 x half> [[VCVT_N]], i32 2)
987 // CHECK-NEXT: ret <8 x i16> [[VCVT_N1]]
989 uint16x8_t test_vcvtq_n_u16_f16(float16x8_t a) {
990 return vcvtq_n_u16_f16(a, 2);
993 // CHECK-LABEL: define {{[^@]+}}@test_vdiv_f16
994 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
995 // CHECK-NEXT: entry:
996 // CHECK-NEXT: [[DIV_I:%.*]] = fdiv <4 x half> [[A]], [[B]]
997 // CHECK-NEXT: ret <4 x half> [[DIV_I]]
999 float16x4_t test_vdiv_f16(float16x4_t a, float16x4_t b) {
1000 return vdiv_f16(a, b);
1003 // CHECK-LABEL: define {{[^@]+}}@test_vdivq_f16
1004 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1005 // CHECK-NEXT: entry:
1006 // CHECK-NEXT: [[DIV_I:%.*]] = fdiv <8 x half> [[A]], [[B]]
1007 // CHECK-NEXT: ret <8 x half> [[DIV_I]]
1009 float16x8_t test_vdivq_f16(float16x8_t a, float16x8_t b) {
1010 return vdivq_f16(a, b);
1013 // CHECK-LABEL: define {{[^@]+}}@test_vmax_f16
1014 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1015 // CHECK-NEXT: entry:
1016 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1017 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1018 // CHECK-NEXT: [[VMAX2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fmax.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1019 // CHECK-NEXT: ret <4 x half> [[VMAX2_I]]
1021 float16x4_t test_vmax_f16(float16x4_t a, float16x4_t b) {
1022 return vmax_f16(a, b);
1025 // CHECK-LABEL: define {{[^@]+}}@test_vmaxq_f16
1026 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1027 // CHECK-NEXT: entry:
1028 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1029 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1030 // CHECK-NEXT: [[VMAX2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fmax.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1031 // CHECK-NEXT: ret <8 x half> [[VMAX2_I]]
1033 float16x8_t test_vmaxq_f16(float16x8_t a, float16x8_t b) {
1034 return vmaxq_f16(a, b);
1037 // CHECK-LABEL: define {{[^@]+}}@test_vmaxnm_f16
1038 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1039 // CHECK-NEXT: entry:
1040 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1041 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1042 // CHECK-NEXT: [[VMAXNM2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fmaxnm.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1043 // CHECK-NEXT: ret <4 x half> [[VMAXNM2_I]]
1045 float16x4_t test_vmaxnm_f16(float16x4_t a, float16x4_t b) {
1046 return vmaxnm_f16(a, b);
1049 // CHECK-LABEL: define {{[^@]+}}@test_vmaxnmq_f16
1050 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1051 // CHECK-NEXT: entry:
1052 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1053 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1054 // CHECK-NEXT: [[VMAXNM2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fmaxnm.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1055 // CHECK-NEXT: ret <8 x half> [[VMAXNM2_I]]
1057 float16x8_t test_vmaxnmq_f16(float16x8_t a, float16x8_t b) {
1058 return vmaxnmq_f16(a, b);
1061 // CHECK-LABEL: define {{[^@]+}}@test_vmin_f16
1062 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1063 // CHECK-NEXT: entry:
1064 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1065 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1066 // CHECK-NEXT: [[VMIN2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fmin.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1067 // CHECK-NEXT: ret <4 x half> [[VMIN2_I]]
1069 float16x4_t test_vmin_f16(float16x4_t a, float16x4_t b) {
1070 return vmin_f16(a, b);
1073 // CHECK-LABEL: define {{[^@]+}}@test_vminq_f16
1074 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1075 // CHECK-NEXT: entry:
1076 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1077 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1078 // CHECK-NEXT: [[VMIN2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fmin.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1079 // CHECK-NEXT: ret <8 x half> [[VMIN2_I]]
1081 float16x8_t test_vminq_f16(float16x8_t a, float16x8_t b) {
1082 return vminq_f16(a, b);
1085 // CHECK-LABEL: define {{[^@]+}}@test_vminnm_f16
1086 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1087 // CHECK-NEXT: entry:
1088 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1089 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1090 // CHECK-NEXT: [[VMINNM2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fminnm.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1091 // CHECK-NEXT: ret <4 x half> [[VMINNM2_I]]
1093 float16x4_t test_vminnm_f16(float16x4_t a, float16x4_t b) {
1094 return vminnm_f16(a, b);
1097 // CHECK-LABEL: define {{[^@]+}}@test_vminnmq_f16
1098 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1099 // CHECK-NEXT: entry:
1100 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1101 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1102 // CHECK-NEXT: [[VMINNM2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fminnm.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1103 // CHECK-NEXT: ret <8 x half> [[VMINNM2_I]]
1105 float16x8_t test_vminnmq_f16(float16x8_t a, float16x8_t b) {
1106 return vminnmq_f16(a, b);
1109 // CHECK-LABEL: define {{[^@]+}}@test_vmul_f16
1110 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1111 // CHECK-NEXT: entry:
1112 // CHECK-NEXT: [[MUL_I:%.*]] = fmul <4 x half> [[A]], [[B]]
1113 // CHECK-NEXT: ret <4 x half> [[MUL_I]]
1115 float16x4_t test_vmul_f16(float16x4_t a, float16x4_t b) {
1116 return vmul_f16(a, b);
1119 // CHECK-LABEL: define {{[^@]+}}@test_vmulq_f16
1120 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1121 // CHECK-NEXT: entry:
1122 // CHECK-NEXT: [[MUL_I:%.*]] = fmul <8 x half> [[A]], [[B]]
1123 // CHECK-NEXT: ret <8 x half> [[MUL_I]]
1125 float16x8_t test_vmulq_f16(float16x8_t a, float16x8_t b) {
1126 return vmulq_f16(a, b);
1129 // CHECK-LABEL: define {{[^@]+}}@test_vmulx_f16
1130 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1131 // CHECK-NEXT: entry:
1132 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1133 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1134 // CHECK-NEXT: [[VMULX2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fmulx.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1135 // CHECK-NEXT: ret <4 x half> [[VMULX2_I]]
1137 float16x4_t test_vmulx_f16(float16x4_t a, float16x4_t b) {
1138 return vmulx_f16(a, b);
1141 // CHECK-LABEL: define {{[^@]+}}@test_vmulxq_f16
1142 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1143 // CHECK-NEXT: entry:
1144 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1145 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1146 // CHECK-NEXT: [[VMULX2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fmulx.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1147 // CHECK-NEXT: ret <8 x half> [[VMULX2_I]]
1149 float16x8_t test_vmulxq_f16(float16x8_t a, float16x8_t b) {
1150 return vmulxq_f16(a, b);
1153 // CHECK-LABEL: define {{[^@]+}}@test_vpadd_f16
1154 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1155 // CHECK-NEXT: entry:
1156 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1157 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1158 // CHECK-NEXT: [[VPADD_V2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.faddp.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1159 // CHECK-NEXT: [[VPADD_V3_I:%.*]] = bitcast <4 x half> [[VPADD_V2_I]] to <8 x i8>
1160 // CHECK-NEXT: ret <4 x half> [[VPADD_V2_I]]
1162 float16x4_t test_vpadd_f16(float16x4_t a, float16x4_t b) {
1163 return vpadd_f16(a, b);
1166 // CHECK-LABEL: define {{[^@]+}}@test_vpaddq_f16
1167 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1168 // CHECK-NEXT: entry:
1169 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1170 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1171 // CHECK-NEXT: [[VPADDQ_V2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.faddp.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1172 // CHECK-NEXT: [[VPADDQ_V3_I:%.*]] = bitcast <8 x half> [[VPADDQ_V2_I]] to <16 x i8>
1173 // CHECK-NEXT: ret <8 x half> [[VPADDQ_V2_I]]
1175 float16x8_t test_vpaddq_f16(float16x8_t a, float16x8_t b) {
1176 return vpaddq_f16(a, b);
1179 // CHECK-LABEL: define {{[^@]+}}@test_vpmax_f16
1180 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1181 // CHECK-NEXT: entry:
1182 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1183 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1184 // CHECK-NEXT: [[VPMAX2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fmaxp.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1185 // CHECK-NEXT: ret <4 x half> [[VPMAX2_I]]
1187 float16x4_t test_vpmax_f16(float16x4_t a, float16x4_t b) {
1188 return vpmax_f16(a, b);
1191 // CHECK-LABEL: define {{[^@]+}}@test_vpmaxq_f16
1192 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1193 // CHECK-NEXT: entry:
1194 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1195 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1196 // CHECK-NEXT: [[VPMAX2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fmaxp.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1197 // CHECK-NEXT: ret <8 x half> [[VPMAX2_I]]
1199 float16x8_t test_vpmaxq_f16(float16x8_t a, float16x8_t b) {
1200 return vpmaxq_f16(a, b);
1203 // CHECK-LABEL: define {{[^@]+}}@test_vpmaxnm_f16
1204 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1205 // CHECK-NEXT: entry:
1206 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1207 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1208 // CHECK-NEXT: [[VPMAXNM2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fmaxnmp.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1209 // CHECK-NEXT: ret <4 x half> [[VPMAXNM2_I]]
1211 float16x4_t test_vpmaxnm_f16(float16x4_t a, float16x4_t b) {
1212 return vpmaxnm_f16(a, b);
1215 // CHECK-LABEL: define {{[^@]+}}@test_vpmaxnmq_f16
1216 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1217 // CHECK-NEXT: entry:
1218 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1219 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1220 // CHECK-NEXT: [[VPMAXNM2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fmaxnmp.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1221 // CHECK-NEXT: ret <8 x half> [[VPMAXNM2_I]]
1223 float16x8_t test_vpmaxnmq_f16(float16x8_t a, float16x8_t b) {
1224 return vpmaxnmq_f16(a, b);
1227 // CHECK-LABEL: define {{[^@]+}}@test_vpmin_f16
1228 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1229 // CHECK-NEXT: entry:
1230 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1231 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1232 // CHECK-NEXT: [[VPMIN2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fminp.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1233 // CHECK-NEXT: ret <4 x half> [[VPMIN2_I]]
1235 float16x4_t test_vpmin_f16(float16x4_t a, float16x4_t b) {
1236 return vpmin_f16(a, b);
1239 // CHECK-LABEL: define {{[^@]+}}@test_vpminq_f16
1240 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1241 // CHECK-NEXT: entry:
1242 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1243 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1244 // CHECK-NEXT: [[VPMIN2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fminp.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1245 // CHECK-NEXT: ret <8 x half> [[VPMIN2_I]]
1247 float16x8_t test_vpminq_f16(float16x8_t a, float16x8_t b) {
1248 return vpminq_f16(a, b);
1251 // CHECK-LABEL: define {{[^@]+}}@test_vpminnm_f16
1252 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1253 // CHECK-NEXT: entry:
1254 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1255 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1256 // CHECK-NEXT: [[VPMINNM2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fminnmp.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1257 // CHECK-NEXT: ret <4 x half> [[VPMINNM2_I]]
1259 float16x4_t test_vpminnm_f16(float16x4_t a, float16x4_t b) {
1260 return vpminnm_f16(a, b);
1263 // CHECK-LABEL: define {{[^@]+}}@test_vpminnmq_f16
1264 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1265 // CHECK-NEXT: entry:
1266 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1267 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1268 // CHECK-NEXT: [[VPMINNM2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fminnmp.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1269 // CHECK-NEXT: ret <8 x half> [[VPMINNM2_I]]
1271 float16x8_t test_vpminnmq_f16(float16x8_t a, float16x8_t b) {
1272 return vpminnmq_f16(a, b);
1275 // CHECK-LABEL: define {{[^@]+}}@test_vrecps_f16
1276 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1277 // CHECK-NEXT: entry:
1278 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1279 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1280 // CHECK-NEXT: [[VRECPS_V2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.frecps.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1281 // CHECK-NEXT: [[VRECPS_V3_I:%.*]] = bitcast <4 x half> [[VRECPS_V2_I]] to <8 x i8>
1282 // CHECK-NEXT: ret <4 x half> [[VRECPS_V2_I]]
1284 float16x4_t test_vrecps_f16(float16x4_t a, float16x4_t b) {
1285 return vrecps_f16(a, b);
1288 // CHECK-LABEL: define {{[^@]+}}@test_vrecpsq_f16
1289 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1290 // CHECK-NEXT: entry:
1291 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1292 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1293 // CHECK-NEXT: [[VRECPSQ_V2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.frecps.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1294 // CHECK-NEXT: [[VRECPSQ_V3_I:%.*]] = bitcast <8 x half> [[VRECPSQ_V2_I]] to <16 x i8>
1295 // CHECK-NEXT: ret <8 x half> [[VRECPSQ_V2_I]]
1297 float16x8_t test_vrecpsq_f16(float16x8_t a, float16x8_t b) {
1298 return vrecpsq_f16(a, b);
1301 // CHECK-LABEL: define {{[^@]+}}@test_vrsqrts_f16
1302 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1303 // CHECK-NEXT: entry:
1304 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1305 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1306 // CHECK-NEXT: [[VRSQRTS_V2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.frsqrts.v4f16(<4 x half> [[A]], <4 x half> [[B]])
1307 // CHECK-NEXT: [[VRSQRTS_V3_I:%.*]] = bitcast <4 x half> [[VRSQRTS_V2_I]] to <8 x i8>
1308 // CHECK-NEXT: ret <4 x half> [[VRSQRTS_V2_I]]
1310 float16x4_t test_vrsqrts_f16(float16x4_t a, float16x4_t b) {
1311 return vrsqrts_f16(a, b);
1314 // CHECK-LABEL: define {{[^@]+}}@test_vrsqrtsq_f16
1315 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1316 // CHECK-NEXT: entry:
1317 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1318 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1319 // CHECK-NEXT: [[VRSQRTSQ_V2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.frsqrts.v8f16(<8 x half> [[A]], <8 x half> [[B]])
1320 // CHECK-NEXT: [[VRSQRTSQ_V3_I:%.*]] = bitcast <8 x half> [[VRSQRTSQ_V2_I]] to <16 x i8>
1321 // CHECK-NEXT: ret <8 x half> [[VRSQRTSQ_V2_I]]
1323 float16x8_t test_vrsqrtsq_f16(float16x8_t a, float16x8_t b) {
1324 return vrsqrtsq_f16(a, b);
1327 // CHECK-LABEL: define {{[^@]+}}@test_vsub_f16
1328 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1329 // CHECK-NEXT: entry:
1330 // CHECK-NEXT: [[SUB_I:%.*]] = fsub <4 x half> [[A]], [[B]]
1331 // CHECK-NEXT: ret <4 x half> [[SUB_I]]
1333 float16x4_t test_vsub_f16(float16x4_t a, float16x4_t b) {
1334 return vsub_f16(a, b);
1337 // CHECK-LABEL: define {{[^@]+}}@test_vsubq_f16
1338 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1339 // CHECK-NEXT: entry:
1340 // CHECK-NEXT: [[SUB_I:%.*]] = fsub <8 x half> [[A]], [[B]]
1341 // CHECK-NEXT: ret <8 x half> [[SUB_I]]
1343 float16x8_t test_vsubq_f16(float16x8_t a, float16x8_t b) {
1344 return vsubq_f16(a, b);
1347 // CHECK-LABEL: define {{[^@]+}}@test_vfma_f16
1348 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]], <4 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1349 // CHECK-NEXT: entry:
1350 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1351 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1352 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x half> [[C]] to <8 x i8>
1353 // CHECK-NEXT: [[TMP3:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[B]], <4 x half> [[C]], <4 x half> [[A]])
1354 // CHECK-NEXT: ret <4 x half> [[TMP3]]
1356 float16x4_t test_vfma_f16(float16x4_t a, float16x4_t b, float16x4_t c) {
1357 return vfma_f16(a, b, c);
1360 // CHECK-LABEL: define {{[^@]+}}@test_vfmaq_f16
1361 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]], <8 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1362 // CHECK-NEXT: entry:
1363 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1364 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1365 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x half> [[C]] to <16 x i8>
1366 // CHECK-NEXT: [[TMP3:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[B]], <8 x half> [[C]], <8 x half> [[A]])
1367 // CHECK-NEXT: ret <8 x half> [[TMP3]]
1369 float16x8_t test_vfmaq_f16(float16x8_t a, float16x8_t b, float16x8_t c) {
1370 return vfmaq_f16(a, b, c);
1373 // CHECK-LABEL: define {{[^@]+}}@test_vfms_f16
1374 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]], <4 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1375 // CHECK-NEXT: entry:
1376 // CHECK-NEXT: [[FNEG_I:%.*]] = fneg <4 x half> [[B]]
1377 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1378 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[FNEG_I]] to <8 x i8>
1379 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x half> [[C]] to <8 x i8>
1380 // CHECK-NEXT: [[TMP3:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[FNEG_I]], <4 x half> [[C]], <4 x half> [[A]])
1381 // CHECK-NEXT: ret <4 x half> [[TMP3]]
1383 float16x4_t test_vfms_f16(float16x4_t a, float16x4_t b, float16x4_t c) {
1384 return vfms_f16(a, b, c);
1387 // CHECK-LABEL: define {{[^@]+}}@test_vfmsq_f16
1388 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]], <8 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1389 // CHECK-NEXT: entry:
1390 // CHECK-NEXT: [[FNEG_I:%.*]] = fneg <8 x half> [[B]]
1391 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1392 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[FNEG_I]] to <16 x i8>
1393 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x half> [[C]] to <16 x i8>
1394 // CHECK-NEXT: [[TMP3:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[FNEG_I]], <8 x half> [[C]], <8 x half> [[A]])
1395 // CHECK-NEXT: ret <8 x half> [[TMP3]]
1397 float16x8_t test_vfmsq_f16(float16x8_t a, float16x8_t b, float16x8_t c) {
1398 return vfmsq_f16(a, b, c);
1401 // CHECK-LABEL: define {{[^@]+}}@test_vfma_lane_f16
1402 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]], <4 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1403 // CHECK-NEXT: entry:
1404 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1405 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1406 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x half> [[C]] to <8 x i8>
1407 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x half>
1408 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <4 x half> [[TMP3]], <4 x half> [[TMP3]], <4 x i32> <i32 3, i32 3, i32 3, i32 3>
1409 // CHECK-NEXT: [[FMLA:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half>
1410 // CHECK-NEXT: [[FMLA1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1411 // CHECK-NEXT: [[FMLA2:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[FMLA]], <4 x half> [[LANE]], <4 x half> [[FMLA1]])
1412 // CHECK-NEXT: ret <4 x half> [[FMLA2]]
1414 float16x4_t test_vfma_lane_f16(float16x4_t a, float16x4_t b, float16x4_t c) {
1415 return vfma_lane_f16(a, b, c, 3);
1418 // CHECK-LABEL: define {{[^@]+}}@test_vfmaq_lane_f16
1419 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]], <4 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1420 // CHECK-NEXT: entry:
1421 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1422 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1423 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x half> [[C]] to <8 x i8>
1424 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x half>
1425 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <4 x half> [[TMP3]], <4 x half> [[TMP3]], <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1426 // CHECK-NEXT: [[FMLA:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half>
1427 // CHECK-NEXT: [[FMLA1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
1428 // CHECK-NEXT: [[FMLA2:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[FMLA]], <8 x half> [[LANE]], <8 x half> [[FMLA1]])
1429 // CHECK-NEXT: ret <8 x half> [[FMLA2]]
1431 float16x8_t test_vfmaq_lane_f16(float16x8_t a, float16x8_t b, float16x4_t c) {
1432 return vfmaq_lane_f16(a, b, c, 3);
1435 // CHECK-LABEL: define {{[^@]+}}@test_vfma_laneq_f16
1436 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]], <8 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1437 // CHECK-NEXT: entry:
1438 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1439 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1440 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x half> [[C]] to <16 x i8>
1441 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1442 // CHECK-NEXT: [[TMP4:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half>
1443 // CHECK-NEXT: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP2]] to <8 x half>
1444 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <8 x half> [[TMP5]], <8 x half> [[TMP5]], <4 x i32> <i32 7, i32 7, i32 7, i32 7>
1445 // CHECK-NEXT: [[TMP6:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[LANE]], <4 x half> [[TMP4]], <4 x half> [[TMP3]])
1446 // CHECK-NEXT: ret <4 x half> [[TMP6]]
1448 float16x4_t test_vfma_laneq_f16(float16x4_t a, float16x4_t b, float16x8_t c) {
1449 return vfma_laneq_f16(a, b, c, 7);
1452 // CHECK-LABEL: define {{[^@]+}}@test_vfmaq_laneq_f16
1453 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]], <8 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1454 // CHECK-NEXT: entry:
1455 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1456 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1457 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x half> [[C]] to <16 x i8>
1458 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
1459 // CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half>
1460 // CHECK-NEXT: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP2]] to <8 x half>
1461 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <8 x half> [[TMP5]], <8 x half> [[TMP5]], <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
1462 // CHECK-NEXT: [[TMP6:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[LANE]], <8 x half> [[TMP4]], <8 x half> [[TMP3]])
1463 // CHECK-NEXT: ret <8 x half> [[TMP6]]
1465 float16x8_t test_vfmaq_laneq_f16(float16x8_t a, float16x8_t b, float16x8_t c) {
1466 return vfmaq_laneq_f16(a, b, c, 7);
1469 // CHECK-LABEL: define {{[^@]+}}@test_vfma_n_f16
1470 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]], half noundef [[C:%.*]]) #[[ATTR0]] {
1471 // CHECK-NEXT: entry:
1472 // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <4 x half> poison, half [[C]], i32 0
1473 // CHECK-NEXT: [[VECINIT1:%.*]] = insertelement <4 x half> [[VECINIT]], half [[C]], i32 1
1474 // CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <4 x half> [[VECINIT1]], half [[C]], i32 2
1475 // CHECK-NEXT: [[VECINIT3:%.*]] = insertelement <4 x half> [[VECINIT2]], half [[C]], i32 3
1476 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1477 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1478 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x half> [[VECINIT3]] to <8 x i8>
1479 // CHECK-NEXT: [[TMP3:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[B]], <4 x half> [[VECINIT3]], <4 x half> [[A]])
1480 // CHECK-NEXT: ret <4 x half> [[TMP3]]
1482 float16x4_t test_vfma_n_f16(float16x4_t a, float16x4_t b, float16_t c) {
1483 return vfma_n_f16(a, b, c);
1486 // CHECK-LABEL: define {{[^@]+}}@test_vfmaq_n_f16
1487 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]], half noundef [[C:%.*]]) #[[ATTR0]] {
1488 // CHECK-NEXT: entry:
1489 // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <8 x half> poison, half [[C]], i32 0
1490 // CHECK-NEXT: [[VECINIT1:%.*]] = insertelement <8 x half> [[VECINIT]], half [[C]], i32 1
1491 // CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <8 x half> [[VECINIT1]], half [[C]], i32 2
1492 // CHECK-NEXT: [[VECINIT3:%.*]] = insertelement <8 x half> [[VECINIT2]], half [[C]], i32 3
1493 // CHECK-NEXT: [[VECINIT4:%.*]] = insertelement <8 x half> [[VECINIT3]], half [[C]], i32 4
1494 // CHECK-NEXT: [[VECINIT5:%.*]] = insertelement <8 x half> [[VECINIT4]], half [[C]], i32 5
1495 // CHECK-NEXT: [[VECINIT6:%.*]] = insertelement <8 x half> [[VECINIT5]], half [[C]], i32 6
1496 // CHECK-NEXT: [[VECINIT7:%.*]] = insertelement <8 x half> [[VECINIT6]], half [[C]], i32 7
1497 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1498 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1499 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x half> [[VECINIT7]] to <16 x i8>
1500 // CHECK-NEXT: [[TMP3:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[B]], <8 x half> [[VECINIT7]], <8 x half> [[A]])
1501 // CHECK-NEXT: ret <8 x half> [[TMP3]]
1503 float16x8_t test_vfmaq_n_f16(float16x8_t a, float16x8_t b, float16_t c) {
1504 return vfmaq_n_f16(a, b, c);
1507 // CHECK-LABEL: define {{[^@]+}}@test_vfmah_lane_f16
1508 // CHECK-SAME: (half noundef [[A:%.*]], half noundef [[B:%.*]], <4 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1509 // CHECK-NEXT: entry:
1510 // CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <4 x half> [[C]], i32 3
1511 // CHECK-NEXT: [[TMP0:%.*]] = call half @llvm.fma.f16(half [[B]], half [[EXTRACT]], half [[A]])
1512 // CHECK-NEXT: ret half [[TMP0]]
1514 float16_t test_vfmah_lane_f16(float16_t a, float16_t b, float16x4_t c) {
1515 return vfmah_lane_f16(a, b, c, 3);
1518 // CHECK-LABEL: define {{[^@]+}}@test_vfmah_laneq_f16
1519 // CHECK-SAME: (half noundef [[A:%.*]], half noundef [[B:%.*]], <8 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1520 // CHECK-NEXT: entry:
1521 // CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <8 x half> [[C]], i32 7
1522 // CHECK-NEXT: [[TMP0:%.*]] = call half @llvm.fma.f16(half [[B]], half [[EXTRACT]], half [[A]])
1523 // CHECK-NEXT: ret half [[TMP0]]
1525 float16_t test_vfmah_laneq_f16(float16_t a, float16_t b, float16x8_t c) {
1526 return vfmah_laneq_f16(a, b, c, 7);
1529 // CHECK-LABEL: define {{[^@]+}}@test_vfms_lane_f16
1530 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]], <4 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1531 // CHECK-NEXT: entry:
1532 // CHECK-NEXT: [[FNEG:%.*]] = fneg <4 x half> [[B]]
1533 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1534 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[FNEG]] to <8 x i8>
1535 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x half> [[C]] to <8 x i8>
1536 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x half>
1537 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <4 x half> [[TMP3]], <4 x half> [[TMP3]], <4 x i32> <i32 3, i32 3, i32 3, i32 3>
1538 // CHECK-NEXT: [[FMLA:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half>
1539 // CHECK-NEXT: [[FMLA1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1540 // CHECK-NEXT: [[FMLA2:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[FMLA]], <4 x half> [[LANE]], <4 x half> [[FMLA1]])
1541 // CHECK-NEXT: ret <4 x half> [[FMLA2]]
1543 float16x4_t test_vfms_lane_f16(float16x4_t a, float16x4_t b, float16x4_t c) {
1544 return vfms_lane_f16(a, b, c, 3);
1547 // CHECK-LABEL: define {{[^@]+}}@test_vfmsq_lane_f16
1548 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]], <4 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1549 // CHECK-NEXT: entry:
1550 // CHECK-NEXT: [[FNEG:%.*]] = fneg <8 x half> [[B]]
1551 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1552 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[FNEG]] to <16 x i8>
1553 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x half> [[C]] to <8 x i8>
1554 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP2]] to <4 x half>
1555 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <4 x half> [[TMP3]], <4 x half> [[TMP3]], <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1556 // CHECK-NEXT: [[FMLA:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half>
1557 // CHECK-NEXT: [[FMLA1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
1558 // CHECK-NEXT: [[FMLA2:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[FMLA]], <8 x half> [[LANE]], <8 x half> [[FMLA1]])
1559 // CHECK-NEXT: ret <8 x half> [[FMLA2]]
1561 float16x8_t test_vfmsq_lane_f16(float16x8_t a, float16x8_t b, float16x4_t c) {
1562 return vfmsq_lane_f16(a, b, c, 3);
1565 // CHECK-LABEL: define {{[^@]+}}@test_vfms_laneq_f16
1566 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]], <8 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1567 // CHECK-NEXT: entry:
1568 // CHECK-NEXT: [[FNEG:%.*]] = fneg <4 x half> [[B]]
1569 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1570 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[FNEG]] to <8 x i8>
1571 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x half> [[C]] to <16 x i8>
1572 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1573 // CHECK-NEXT: [[TMP4:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half>
1574 // CHECK-NEXT: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP2]] to <8 x half>
1575 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <8 x half> [[TMP5]], <8 x half> [[TMP5]], <4 x i32> <i32 7, i32 7, i32 7, i32 7>
1576 // CHECK-NEXT: [[TMP6:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[LANE]], <4 x half> [[TMP4]], <4 x half> [[TMP3]])
1577 // CHECK-NEXT: ret <4 x half> [[TMP6]]
1579 float16x4_t test_vfms_laneq_f16(float16x4_t a, float16x4_t b, float16x8_t c) {
1580 return vfms_laneq_f16(a, b, c, 7);
1583 // CHECK-LABEL: define {{[^@]+}}@test_vfmsq_laneq_f16
1584 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]], <8 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1585 // CHECK-NEXT: entry:
1586 // CHECK-NEXT: [[FNEG:%.*]] = fneg <8 x half> [[B]]
1587 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1588 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[FNEG]] to <16 x i8>
1589 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x half> [[C]] to <16 x i8>
1590 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
1591 // CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half>
1592 // CHECK-NEXT: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP2]] to <8 x half>
1593 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <8 x half> [[TMP5]], <8 x half> [[TMP5]], <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
1594 // CHECK-NEXT: [[TMP6:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[LANE]], <8 x half> [[TMP4]], <8 x half> [[TMP3]])
1595 // CHECK-NEXT: ret <8 x half> [[TMP6]]
1597 float16x8_t test_vfmsq_laneq_f16(float16x8_t a, float16x8_t b, float16x8_t c) {
1598 return vfmsq_laneq_f16(a, b, c, 7);
1601 // CHECK-LABEL: define {{[^@]+}}@test_vfms_n_f16
1602 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]], half noundef [[C:%.*]]) #[[ATTR0]] {
1603 // CHECK-NEXT: entry:
1604 // CHECK-NEXT: [[FNEG:%.*]] = fneg <4 x half> [[B]]
1605 // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <4 x half> poison, half [[C]], i32 0
1606 // CHECK-NEXT: [[VECINIT1:%.*]] = insertelement <4 x half> [[VECINIT]], half [[C]], i32 1
1607 // CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <4 x half> [[VECINIT1]], half [[C]], i32 2
1608 // CHECK-NEXT: [[VECINIT3:%.*]] = insertelement <4 x half> [[VECINIT2]], half [[C]], i32 3
1609 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1610 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[FNEG]] to <8 x i8>
1611 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x half> [[VECINIT3]] to <8 x i8>
1612 // CHECK-NEXT: [[TMP3:%.*]] = call <4 x half> @llvm.fma.v4f16(<4 x half> [[FNEG]], <4 x half> [[VECINIT3]], <4 x half> [[A]])
1613 // CHECK-NEXT: ret <4 x half> [[TMP3]]
1615 float16x4_t test_vfms_n_f16(float16x4_t a, float16x4_t b, float16_t c) {
1616 return vfms_n_f16(a, b, c);
1619 // CHECK-LABEL: define {{[^@]+}}@test_vfmsq_n_f16
1620 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]], half noundef [[C:%.*]]) #[[ATTR0]] {
1621 // CHECK-NEXT: entry:
1622 // CHECK-NEXT: [[FNEG:%.*]] = fneg <8 x half> [[B]]
1623 // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <8 x half> poison, half [[C]], i32 0
1624 // CHECK-NEXT: [[VECINIT1:%.*]] = insertelement <8 x half> [[VECINIT]], half [[C]], i32 1
1625 // CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <8 x half> [[VECINIT1]], half [[C]], i32 2
1626 // CHECK-NEXT: [[VECINIT3:%.*]] = insertelement <8 x half> [[VECINIT2]], half [[C]], i32 3
1627 // CHECK-NEXT: [[VECINIT4:%.*]] = insertelement <8 x half> [[VECINIT3]], half [[C]], i32 4
1628 // CHECK-NEXT: [[VECINIT5:%.*]] = insertelement <8 x half> [[VECINIT4]], half [[C]], i32 5
1629 // CHECK-NEXT: [[VECINIT6:%.*]] = insertelement <8 x half> [[VECINIT5]], half [[C]], i32 6
1630 // CHECK-NEXT: [[VECINIT7:%.*]] = insertelement <8 x half> [[VECINIT6]], half [[C]], i32 7
1631 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1632 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[FNEG]] to <16 x i8>
1633 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x half> [[VECINIT7]] to <16 x i8>
1634 // CHECK-NEXT: [[TMP3:%.*]] = call <8 x half> @llvm.fma.v8f16(<8 x half> [[FNEG]], <8 x half> [[VECINIT7]], <8 x half> [[A]])
1635 // CHECK-NEXT: ret <8 x half> [[TMP3]]
1637 float16x8_t test_vfmsq_n_f16(float16x8_t a, float16x8_t b, float16_t c) {
1638 return vfmsq_n_f16(a, b, c);
1641 // CHECK-LABEL: define {{[^@]+}}@test_vfmsh_lane_f16
1642 // CHECK-SAME: (half noundef [[A:%.*]], half noundef [[B:%.*]], <4 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1643 // CHECK-NEXT: entry:
1644 // CHECK-NEXT: [[CONV:%.*]] = fpext half [[B]] to float
1645 // CHECK-NEXT: [[FNEG:%.*]] = fneg float [[CONV]]
1646 // CHECK-NEXT: [[TMP0:%.*]] = fptrunc float [[FNEG]] to half
1647 // CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <4 x half> [[C]], i32 3
1648 // CHECK-NEXT: [[TMP1:%.*]] = call half @llvm.fma.f16(half [[TMP0]], half [[EXTRACT]], half [[A]])
1649 // CHECK-NEXT: ret half [[TMP1]]
1651 float16_t test_vfmsh_lane_f16(float16_t a, float16_t b, float16x4_t c) {
1652 return vfmsh_lane_f16(a, b, c, 3);
1655 // CHECK-LABEL: define {{[^@]+}}@test_vfmsh_laneq_f16
1656 // CHECK-SAME: (half noundef [[A:%.*]], half noundef [[B:%.*]], <8 x half> noundef [[C:%.*]]) #[[ATTR0]] {
1657 // CHECK-NEXT: entry:
1658 // CHECK-NEXT: [[CONV:%.*]] = fpext half [[B]] to float
1659 // CHECK-NEXT: [[FNEG:%.*]] = fneg float [[CONV]]
1660 // CHECK-NEXT: [[TMP0:%.*]] = fptrunc float [[FNEG]] to half
1661 // CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <8 x half> [[C]], i32 7
1662 // CHECK-NEXT: [[TMP1:%.*]] = call half @llvm.fma.f16(half [[TMP0]], half [[EXTRACT]], half [[A]])
1663 // CHECK-NEXT: ret half [[TMP1]]
1665 float16_t test_vfmsh_laneq_f16(float16_t a, float16_t b, float16x8_t c) {
1666 return vfmsh_laneq_f16(a, b, c, 7);
1669 // CHECK-LABEL: define {{[^@]+}}@test_vmul_lane_f16
1670 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1671 // CHECK-NEXT: entry:
1672 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1673 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1674 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <4 x half> [[TMP1]], <4 x half> [[TMP1]], <4 x i32> <i32 3, i32 3, i32 3, i32 3>
1675 // CHECK-NEXT: [[MUL:%.*]] = fmul <4 x half> [[A]], [[LANE]]
1676 // CHECK-NEXT: ret <4 x half> [[MUL]]
1678 float16x4_t test_vmul_lane_f16(float16x4_t a, float16x4_t b) {
1679 return vmul_lane_f16(a, b, 3);
1682 // CHECK-LABEL: define {{[^@]+}}@test_vmulq_lane_f16
1683 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1684 // CHECK-NEXT: entry:
1685 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1686 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1687 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <4 x half> [[TMP1]], <4 x half> [[TMP1]], <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1688 // CHECK-NEXT: [[MUL:%.*]] = fmul <8 x half> [[A]], [[LANE]]
1689 // CHECK-NEXT: ret <8 x half> [[MUL]]
1691 float16x8_t test_vmulq_lane_f16(float16x8_t a, float16x4_t b) {
1692 return vmulq_lane_f16(a, b, 3);
1695 // CHECK-LABEL: define {{[^@]+}}@test_vmul_laneq_f16
1696 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1697 // CHECK-NEXT: entry:
1698 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1699 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
1700 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <8 x half> [[TMP1]], <8 x half> [[TMP1]], <4 x i32> <i32 7, i32 7, i32 7, i32 7>
1701 // CHECK-NEXT: [[MUL:%.*]] = fmul <4 x half> [[A]], [[LANE]]
1702 // CHECK-NEXT: ret <4 x half> [[MUL]]
1704 float16x4_t test_vmul_laneq_f16(float16x4_t a, float16x8_t b) {
1705 return vmul_laneq_f16(a, b, 7);
1708 // CHECK-LABEL: define {{[^@]+}}@test_vmulq_laneq_f16
1709 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1710 // CHECK-NEXT: entry:
1711 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1712 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
1713 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <8 x half> [[TMP1]], <8 x half> [[TMP1]], <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
1714 // CHECK-NEXT: [[MUL:%.*]] = fmul <8 x half> [[A]], [[LANE]]
1715 // CHECK-NEXT: ret <8 x half> [[MUL]]
1717 float16x8_t test_vmulq_laneq_f16(float16x8_t a, float16x8_t b) {
1718 return vmulq_laneq_f16(a, b, 7);
1721 // CHECK-LABEL: define {{[^@]+}}@test_vmul_n_f16
1722 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], half noundef [[B:%.*]]) #[[ATTR0]] {
1723 // CHECK-NEXT: entry:
1724 // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <4 x half> poison, half [[B]], i32 0
1725 // CHECK-NEXT: [[VECINIT1:%.*]] = insertelement <4 x half> [[VECINIT]], half [[B]], i32 1
1726 // CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <4 x half> [[VECINIT1]], half [[B]], i32 2
1727 // CHECK-NEXT: [[VECINIT3:%.*]] = insertelement <4 x half> [[VECINIT2]], half [[B]], i32 3
1728 // CHECK-NEXT: [[MUL:%.*]] = fmul <4 x half> [[A]], [[VECINIT3]]
1729 // CHECK-NEXT: ret <4 x half> [[MUL]]
1731 float16x4_t test_vmul_n_f16(float16x4_t a, float16_t b) {
1732 return vmul_n_f16(a, b);
1735 // CHECK-LABEL: define {{[^@]+}}@test_vmulq_n_f16
1736 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], half noundef [[B:%.*]]) #[[ATTR0]] {
1737 // CHECK-NEXT: entry:
1738 // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <8 x half> poison, half [[B]], i32 0
1739 // CHECK-NEXT: [[VECINIT1:%.*]] = insertelement <8 x half> [[VECINIT]], half [[B]], i32 1
1740 // CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <8 x half> [[VECINIT1]], half [[B]], i32 2
1741 // CHECK-NEXT: [[VECINIT3:%.*]] = insertelement <8 x half> [[VECINIT2]], half [[B]], i32 3
1742 // CHECK-NEXT: [[VECINIT4:%.*]] = insertelement <8 x half> [[VECINIT3]], half [[B]], i32 4
1743 // CHECK-NEXT: [[VECINIT5:%.*]] = insertelement <8 x half> [[VECINIT4]], half [[B]], i32 5
1744 // CHECK-NEXT: [[VECINIT6:%.*]] = insertelement <8 x half> [[VECINIT5]], half [[B]], i32 6
1745 // CHECK-NEXT: [[VECINIT7:%.*]] = insertelement <8 x half> [[VECINIT6]], half [[B]], i32 7
1746 // CHECK-NEXT: [[MUL:%.*]] = fmul <8 x half> [[A]], [[VECINIT7]]
1747 // CHECK-NEXT: ret <8 x half> [[MUL]]
1749 float16x8_t test_vmulq_n_f16(float16x8_t a, float16_t b) {
1750 return vmulq_n_f16(a, b);
1753 // FIXME: Fix it when fp16 non-storage-only type becomes available.
1754 // CHECK-LABEL: define {{[^@]+}}@test_vmulh_lane_f16
1755 // CHECK-SAME: (half noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1756 // CHECK-NEXT: entry:
1757 // CHECK-NEXT: [[__REINT_847:%.*]] = alloca <4 x half>, align 8
1758 // CHECK-NEXT: [[__REINT1_847:%.*]] = alloca i16, align 2
1759 // CHECK-NEXT: [[CONV:%.*]] = fpext half [[A]] to float
1760 // CHECK-NEXT: store <4 x half> [[B]], ptr [[__REINT_847]], align 8
1761 // CHECK-NEXT: [[TMP0:%.*]] = load <4 x i16>, ptr [[__REINT_847]], align 8
1762 // CHECK-NEXT: [[VGET_LANE:%.*]] = extractelement <4 x i16> [[TMP0]], i32 3
1763 // CHECK-NEXT: store i16 [[VGET_LANE]], ptr [[__REINT1_847]], align 2
1764 // CHECK-NEXT: [[TMP1:%.*]] = load half, ptr [[__REINT1_847]], align 2
1765 // CHECK-NEXT: [[CONV2:%.*]] = fpext half [[TMP1]] to float
1766 // CHECK-NEXT: [[MUL:%.*]] = fmul float [[CONV]], [[CONV2]]
1767 // CHECK-NEXT: [[TMP2:%.*]] = fptrunc float [[MUL]] to half
1768 // CHECK-NEXT: ret half [[TMP2]]
1770 float16_t test_vmulh_lane_f16(float16_t a, float16x4_t b) {
1771 return vmulh_lane_f16(a, b, 3);
1774 // CHECK-LABEL: define {{[^@]+}}@test_vmulh_laneq_f16
1775 // CHECK-SAME: (half noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1776 // CHECK-NEXT: entry:
1777 // CHECK-NEXT: [[__REINT_850:%.*]] = alloca <8 x half>, align 16
1778 // CHECK-NEXT: [[__REINT1_850:%.*]] = alloca i16, align 2
1779 // CHECK-NEXT: [[CONV:%.*]] = fpext half [[A]] to float
1780 // CHECK-NEXT: store <8 x half> [[B]], ptr [[__REINT_850]], align 16
1781 // CHECK-NEXT: [[TMP0:%.*]] = load <8 x i16>, ptr [[__REINT_850]], align 16
1782 // CHECK-NEXT: [[VGETQ_LANE:%.*]] = extractelement <8 x i16> [[TMP0]], i32 7
1783 // CHECK-NEXT: store i16 [[VGETQ_LANE]], ptr [[__REINT1_850]], align 2
1784 // CHECK-NEXT: [[TMP1:%.*]] = load half, ptr [[__REINT1_850]], align 2
1785 // CHECK-NEXT: [[CONV2:%.*]] = fpext half [[TMP1]] to float
1786 // CHECK-NEXT: [[MUL:%.*]] = fmul float [[CONV]], [[CONV2]]
1787 // CHECK-NEXT: [[TMP2:%.*]] = fptrunc float [[MUL]] to half
1788 // CHECK-NEXT: ret half [[TMP2]]
1790 float16_t test_vmulh_laneq_f16(float16_t a, float16x8_t b) {
1791 return vmulh_laneq_f16(a, b, 7);
1794 // CHECK-LABEL: define {{[^@]+}}@test_vmulx_lane_f16
1795 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1796 // CHECK-NEXT: entry:
1797 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1798 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1799 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <4 x half> [[TMP1]], <4 x half> [[TMP1]], <4 x i32> <i32 3, i32 3, i32 3, i32 3>
1800 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1801 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <4 x half> [[LANE]] to <8 x i8>
1802 // CHECK-NEXT: [[VMULX2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fmulx.v4f16(<4 x half> [[A]], <4 x half> [[LANE]])
1803 // CHECK-NEXT: ret <4 x half> [[VMULX2_I]]
1805 float16x4_t test_vmulx_lane_f16(float16x4_t a, float16x4_t b) {
1806 return vmulx_lane_f16(a, b, 3);
1809 // CHECK-LABEL: define {{[^@]+}}@test_vmulxq_lane_f16
1810 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1811 // CHECK-NEXT: entry:
1812 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[B]] to <8 x i8>
1813 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1814 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <4 x half> [[TMP1]], <4 x half> [[TMP1]], <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1815 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1816 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x half> [[LANE]] to <16 x i8>
1817 // CHECK-NEXT: [[VMULX2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fmulx.v8f16(<8 x half> [[A]], <8 x half> [[LANE]])
1818 // CHECK-NEXT: ret <8 x half> [[VMULX2_I]]
1820 float16x8_t test_vmulxq_lane_f16(float16x8_t a, float16x4_t b) {
1821 return vmulxq_lane_f16(a, b, 3);
1824 // CHECK-LABEL: define {{[^@]+}}@test_vmulx_laneq_f16
1825 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1826 // CHECK-NEXT: entry:
1827 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1828 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
1829 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <8 x half> [[TMP1]], <8 x half> [[TMP1]], <4 x i32> <i32 7, i32 7, i32 7, i32 7>
1830 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1831 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <4 x half> [[LANE]] to <8 x i8>
1832 // CHECK-NEXT: [[VMULX2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fmulx.v4f16(<4 x half> [[A]], <4 x half> [[LANE]])
1833 // CHECK-NEXT: ret <4 x half> [[VMULX2_I]]
1835 float16x4_t test_vmulx_laneq_f16(float16x4_t a, float16x8_t b) {
1836 return vmulx_laneq_f16(a, b, 7);
1839 // CHECK-LABEL: define {{[^@]+}}@test_vmulxq_laneq_f16
1840 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1841 // CHECK-NEXT: entry:
1842 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[B]] to <16 x i8>
1843 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
1844 // CHECK-NEXT: [[LANE:%.*]] = shufflevector <8 x half> [[TMP1]], <8 x half> [[TMP1]], <8 x i32> <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
1845 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1846 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x half> [[LANE]] to <16 x i8>
1847 // CHECK-NEXT: [[VMULX2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fmulx.v8f16(<8 x half> [[A]], <8 x half> [[LANE]])
1848 // CHECK-NEXT: ret <8 x half> [[VMULX2_I]]
1850 float16x8_t test_vmulxq_laneq_f16(float16x8_t a, float16x8_t b) {
1851 return vmulxq_laneq_f16(a, b, 7);
1854 // CHECK-LABEL: define {{[^@]+}}@test_vmulx_n_f16
1855 // CHECK-SAME: (<4 x half> noundef [[A:%.*]], half noundef [[B:%.*]]) #[[ATTR0]] {
1856 // CHECK-NEXT: entry:
1857 // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <4 x half> poison, half [[B]], i32 0
1858 // CHECK-NEXT: [[VECINIT1:%.*]] = insertelement <4 x half> [[VECINIT]], half [[B]], i32 1
1859 // CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <4 x half> [[VECINIT1]], half [[B]], i32 2
1860 // CHECK-NEXT: [[VECINIT3:%.*]] = insertelement <4 x half> [[VECINIT2]], half [[B]], i32 3
1861 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1862 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x half> [[VECINIT3]] to <8 x i8>
1863 // CHECK-NEXT: [[VMULX2_I:%.*]] = call <4 x half> @llvm.aarch64.neon.fmulx.v4f16(<4 x half> [[A]], <4 x half> [[VECINIT3]])
1864 // CHECK-NEXT: ret <4 x half> [[VMULX2_I]]
1866 float16x4_t test_vmulx_n_f16(float16x4_t a, float16_t b) {
1867 return vmulx_n_f16(a, b);
1870 // CHECK-LABEL: define {{[^@]+}}@test_vmulxq_n_f16
1871 // CHECK-SAME: (<8 x half> noundef [[A:%.*]], half noundef [[B:%.*]]) #[[ATTR0]] {
1872 // CHECK-NEXT: entry:
1873 // CHECK-NEXT: [[VECINIT:%.*]] = insertelement <8 x half> poison, half [[B]], i32 0
1874 // CHECK-NEXT: [[VECINIT1:%.*]] = insertelement <8 x half> [[VECINIT]], half [[B]], i32 1
1875 // CHECK-NEXT: [[VECINIT2:%.*]] = insertelement <8 x half> [[VECINIT1]], half [[B]], i32 2
1876 // CHECK-NEXT: [[VECINIT3:%.*]] = insertelement <8 x half> [[VECINIT2]], half [[B]], i32 3
1877 // CHECK-NEXT: [[VECINIT4:%.*]] = insertelement <8 x half> [[VECINIT3]], half [[B]], i32 4
1878 // CHECK-NEXT: [[VECINIT5:%.*]] = insertelement <8 x half> [[VECINIT4]], half [[B]], i32 5
1879 // CHECK-NEXT: [[VECINIT6:%.*]] = insertelement <8 x half> [[VECINIT5]], half [[B]], i32 6
1880 // CHECK-NEXT: [[VECINIT7:%.*]] = insertelement <8 x half> [[VECINIT6]], half [[B]], i32 7
1881 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1882 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x half> [[VECINIT7]] to <16 x i8>
1883 // CHECK-NEXT: [[VMULX2_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fmulx.v8f16(<8 x half> [[A]], <8 x half> [[VECINIT7]])
1884 // CHECK-NEXT: ret <8 x half> [[VMULX2_I]]
1886 float16x8_t test_vmulxq_n_f16(float16x8_t a, float16_t b) {
1887 return vmulxq_n_f16(a, b);
1890 // CHECK-LABEL: define {{[^@]+}}@test_vmulxh_lane_f16
1891 // CHECK-SAME: (half noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1892 // CHECK-NEXT: entry:
1893 // CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <4 x half> [[B]], i32 3
1894 // CHECK-NEXT: [[VMULX:%.*]] = call half @llvm.aarch64.neon.fmulx.f16(half [[A]], half [[EXTRACT]])
1895 // CHECK-NEXT: ret half [[VMULX]]
1897 float16_t test_vmulxh_lane_f16(float16_t a, float16x4_t b) {
1898 return vmulxh_lane_f16(a, b, 3);
1901 // CHECK-LABEL: define {{[^@]+}}@test_vmulxh_laneq_f16
1902 // CHECK-SAME: (half noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
1903 // CHECK-NEXT: entry:
1904 // CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <8 x half> [[B]], i32 7
1905 // CHECK-NEXT: [[VMULX:%.*]] = call half @llvm.aarch64.neon.fmulx.f16(half [[A]], half [[EXTRACT]])
1906 // CHECK-NEXT: ret half [[VMULX]]
1908 float16_t test_vmulxh_laneq_f16(float16_t a, float16x8_t b) {
1909 return vmulxh_laneq_f16(a, b, 7);
1912 // CHECK-LABEL: define {{[^@]+}}@test_vmaxv_f16
1913 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
1914 // CHECK-NEXT: entry:
1915 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1916 // CHECK-NEXT: [[VMAXV:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1917 // CHECK-NEXT: [[VMAXV1:%.*]] = call half @llvm.aarch64.neon.fmaxv.f16.v4f16(<4 x half> [[VMAXV]])
1918 // CHECK-NEXT: ret half [[VMAXV1]]
1920 float16_t test_vmaxv_f16(float16x4_t a) {
1921 return vmaxv_f16(a);
1924 // CHECK-LABEL: define {{[^@]+}}@test_vmaxvq_f16
1925 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
1926 // CHECK-NEXT: entry:
1927 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1928 // CHECK-NEXT: [[VMAXV:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
1929 // CHECK-NEXT: [[VMAXV1:%.*]] = call half @llvm.aarch64.neon.fmaxv.f16.v8f16(<8 x half> [[VMAXV]])
1930 // CHECK-NEXT: ret half [[VMAXV1]]
1932 float16_t test_vmaxvq_f16(float16x8_t a) {
1933 return vmaxvq_f16(a);
1936 // CHECK-LABEL: define {{[^@]+}}@test_vminv_f16
1937 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
1938 // CHECK-NEXT: entry:
1939 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1940 // CHECK-NEXT: [[VMINV:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1941 // CHECK-NEXT: [[VMINV1:%.*]] = call half @llvm.aarch64.neon.fminv.f16.v4f16(<4 x half> [[VMINV]])
1942 // CHECK-NEXT: ret half [[VMINV1]]
1944 float16_t test_vminv_f16(float16x4_t a) {
1945 return vminv_f16(a);
1948 // CHECK-LABEL: define {{[^@]+}}@test_vminvq_f16
1949 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
1950 // CHECK-NEXT: entry:
1951 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1952 // CHECK-NEXT: [[VMINV:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
1953 // CHECK-NEXT: [[VMINV1:%.*]] = call half @llvm.aarch64.neon.fminv.f16.v8f16(<8 x half> [[VMINV]])
1954 // CHECK-NEXT: ret half [[VMINV1]]
1956 float16_t test_vminvq_f16(float16x8_t a) {
1957 return vminvq_f16(a);
1960 // CHECK-LABEL: define {{[^@]+}}@test_vmaxnmv_f16
1961 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
1962 // CHECK-NEXT: entry:
1963 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1964 // CHECK-NEXT: [[VMAXNMV:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1965 // CHECK-NEXT: [[VMAXNMV1:%.*]] = call half @llvm.aarch64.neon.fmaxnmv.f16.v4f16(<4 x half> [[VMAXNMV]])
1966 // CHECK-NEXT: ret half [[VMAXNMV1]]
1968 float16_t test_vmaxnmv_f16(float16x4_t a) {
1969 return vmaxnmv_f16(a);
1972 // CHECK-LABEL: define {{[^@]+}}@test_vmaxnmvq_f16
1973 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
1974 // CHECK-NEXT: entry:
1975 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
1976 // CHECK-NEXT: [[VMAXNMV:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
1977 // CHECK-NEXT: [[VMAXNMV1:%.*]] = call half @llvm.aarch64.neon.fmaxnmv.f16.v8f16(<8 x half> [[VMAXNMV]])
1978 // CHECK-NEXT: ret half [[VMAXNMV1]]
1980 float16_t test_vmaxnmvq_f16(float16x8_t a) {
1981 return vmaxnmvq_f16(a);
1984 // CHECK-LABEL: define {{[^@]+}}@test_vminnmv_f16
1985 // CHECK-SAME: (<4 x half> noundef [[A:%.*]]) #[[ATTR0]] {
1986 // CHECK-NEXT: entry:
1987 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[A]] to <8 x i8>
1988 // CHECK-NEXT: [[VMINNMV:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x half>
1989 // CHECK-NEXT: [[VMINNMV1:%.*]] = call half @llvm.aarch64.neon.fminnmv.f16.v4f16(<4 x half> [[VMINNMV]])
1990 // CHECK-NEXT: ret half [[VMINNMV1]]
1992 float16_t test_vminnmv_f16(float16x4_t a) {
1993 return vminnmv_f16(a);
1996 // CHECK-LABEL: define {{[^@]+}}@test_vminnmvq_f16
1997 // CHECK-SAME: (<8 x half> noundef [[A:%.*]]) #[[ATTR0]] {
1998 // CHECK-NEXT: entry:
1999 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A]] to <16 x i8>
2000 // CHECK-NEXT: [[VMINNMV:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x half>
2001 // CHECK-NEXT: [[VMINNMV1:%.*]] = call half @llvm.aarch64.neon.fminnmv.f16.v8f16(<8 x half> [[VMINNMV]])
2002 // CHECK-NEXT: ret half [[VMINNMV1]]
2004 float16_t test_vminnmvq_f16(float16x8_t a) {
2005 return vminnmvq_f16(a);