[C++20][Modules][Serialization] Add an additional test case for #120277. (#126349)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / zeroing-forms-fcvt-bfcvt.ll
blob855bf9a3b3c4914fa7e9b66f559f14780387e585
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc -mattr=+sve,+bf16    < %s | FileCheck %s
3 ; RUN: llc -mattr=+sve2p2,+bf16 < %s | FileCheck %s -check-prefix CHECK-2p2
5 ; RUN: llc -mattr=+sme,+bf16    -force-streaming < %s | FileCheck %s
6 ; RUN: llc -mattr=+sme2p2,+bf16 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2
8 target triple = "aarch64-linux"
10 define <vscale x 8 x half> @test_svcvt_f16_f32_x_1(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {
11 ; CHECK-LABEL: test_svcvt_f16_f32_x_1:
12 ; CHECK:       // %bb.0: // %entry
13 ; CHECK-NEXT:    fcvt z0.h, p0/m, z0.s
14 ; CHECK-NEXT:    ret
16 ; CHECK-2p2-LABEL: test_svcvt_f16_f32_x_1:
17 ; CHECK-2p2:       // %bb.0: // %entry
18 ; CHECK-2p2-NEXT:    fcvt z0.h, p0/z, z0.s
19 ; CHECK-2p2-NEXT:    ret
20 entry:
21   %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f32(<vscale x 8 x half> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
22   ret <vscale x 8 x half> %0
25 define <vscale x 8 x half> @test_svcvt_f16_f32_x_2(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x float> %x) {
26 ; CHECK-LABEL: test_svcvt_f16_f32_x_2:
27 ; CHECK:       // %bb.0: // %entry
28 ; CHECK-NEXT:    fcvt z0.h, p0/m, z1.s
29 ; CHECK-NEXT:    ret
31 ; CHECK-2p2-LABEL: test_svcvt_f16_f32_x_2:
32 ; CHECK-2p2:       // %bb.0: // %entry
33 ; CHECK-2p2-NEXT:    fcvt z0.h, p0/z, z1.s
34 ; CHECK-2p2-NEXT:    ret
35 entry:
36   %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f32(<vscale x 8 x half> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
37   ret <vscale x 8 x half> %0
40 define <vscale x 8 x half> @test_svcvt_f16_f32_z(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x float> %x) {
41 ; CHECK-LABEL: test_svcvt_f16_f32_z:
42 ; CHECK:       // %bb.0: // %entry
43 ; CHECK-NEXT:    mov z0.h, #0 // =0x0
44 ; CHECK-NEXT:    fcvt z0.h, p0/m, z1.s
45 ; CHECK-NEXT:    ret
47 ; CHECK-2p2-LABEL: test_svcvt_f16_f32_z:
48 ; CHECK-2p2:       // %bb.0: // %entry
49 ; CHECK-2p2-NEXT:    fcvt z0.h, p0/z, z1.s
50 ; CHECK-2p2-NEXT:    ret
51 entry:
52   %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f32(<vscale x 8 x half> zeroinitializer, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
53   ret <vscale x 8 x half> %0
56 define <vscale x 8 x bfloat> @test_svcvt_bf16_f32_x_1(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {
57 ; CHECK-LABEL: test_svcvt_bf16_f32_x_1:
58 ; CHECK:       // %bb.0: // %entry
59 ; CHECK-NEXT:    bfcvt z0.h, p0/m, z0.s
60 ; CHECK-NEXT:    ret
62 ; CHECK-2p2-LABEL: test_svcvt_bf16_f32_x_1:
63 ; CHECK-2p2:       // %bb.0: // %entry
64 ; CHECK-2p2-NEXT:    bfcvt z0.h, p0/z, z0.s
65 ; CHECK-2p2-NEXT:    ret
66 entry:
67   %0 = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32.v2(<vscale x 8 x bfloat> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
68   ret <vscale x 8 x bfloat> %0
71 define <vscale x 8 x bfloat> @test_svcvt_bf16_f32_x_2(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x float> %x) {
72 ; CHECK-LABEL: test_svcvt_bf16_f32_x_2:
73 ; CHECK:       // %bb.0: // %entry
74 ; CHECK-NEXT:    bfcvt z0.h, p0/m, z1.s
75 ; CHECK-NEXT:    ret
77 ; CHECK-2p2-LABEL: test_svcvt_bf16_f32_x_2:
78 ; CHECK-2p2:       // %bb.0: // %entry
79 ; CHECK-2p2-NEXT:    bfcvt z0.h, p0/z, z1.s
80 ; CHECK-2p2-NEXT:    ret
81 entry:
82   %0 = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32.v2(<vscale x 8 x bfloat> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
83   ret <vscale x 8 x bfloat> %0
86 define <vscale x 8 x bfloat> @test_svcvt_bf16_f32_z(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x float> %x) {
87 ; CHECK-LABEL: test_svcvt_bf16_f32_z:
88 ; CHECK:       // %bb.0: // %entry
89 ; CHECK-NEXT:    mov z0.h, #0 // =0x0
90 ; CHECK-NEXT:    bfcvt z0.h, p0/m, z1.s
91 ; CHECK-NEXT:    ret
93 ; CHECK-2p2-LABEL: test_svcvt_bf16_f32_z:
94 ; CHECK-2p2:       // %bb.0: // %entry
95 ; CHECK-2p2-NEXT:    bfcvt z0.h, p0/z, z1.s
96 ; CHECK-2p2-NEXT:    ret
97 entry:
98   %0 = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32.v2(<vscale x 8 x bfloat> zeroinitializer, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
99   ret <vscale x 8 x bfloat> %0
102 define <vscale x 8 x half> @test_svcvt_f16_f64_x_1(<vscale x 2 x i1> %pg, <vscale x 2 x double> %x) {
103 ; CHECK-LABEL: test_svcvt_f16_f64_x_1:
104 ; CHECK:       // %bb.0: // %entry
105 ; CHECK-NEXT:    fcvt z0.h, p0/m, z0.d
106 ; CHECK-NEXT:    ret
108 ; CHECK-2p2-LABEL: test_svcvt_f16_f64_x_1:
109 ; CHECK-2p2:       // %bb.0: // %entry
110 ; CHECK-2p2-NEXT:    fcvt z0.h, p0/z, z0.d
111 ; CHECK-2p2-NEXT:    ret
112 entry:
113   %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f64(<vscale x 8 x half> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
114   ret <vscale x 8 x half> %0
117 define <vscale x 8 x half> @test_svcvt_f16_f64_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x double> %x) {
118 ; CHECK-LABEL: test_svcvt_f16_f64_x_2:
119 ; CHECK:       // %bb.0: // %entry
120 ; CHECK-NEXT:    fcvt z0.h, p0/m, z1.d
121 ; CHECK-NEXT:    ret
123 ; CHECK-2p2-LABEL: test_svcvt_f16_f64_x_2:
124 ; CHECK-2p2:       // %bb.0: // %entry
125 ; CHECK-2p2-NEXT:    fcvt z0.h, p0/z, z1.d
126 ; CHECK-2p2-NEXT:    ret
127 entry:
128   %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f64(<vscale x 8 x half> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
129   ret <vscale x 8 x half> %0
132 define <vscale x 8 x half> @test_svcvt_f16_f64_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x double> %x) {
133 ; CHECK-LABEL: test_svcvt_f16_f64_z:
134 ; CHECK:       // %bb.0: // %entry
135 ; CHECK-NEXT:    mov z0.h, #0 // =0x0
136 ; CHECK-NEXT:    fcvt z0.h, p0/m, z1.d
137 ; CHECK-NEXT:    ret
139 ; CHECK-2p2-LABEL: test_svcvt_f16_f64_z:
140 ; CHECK-2p2:       // %bb.0: // %entry
141 ; CHECK-2p2-NEXT:    fcvt z0.h, p0/z, z1.d
142 ; CHECK-2p2-NEXT:    ret
143 entry:
144   %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f64(<vscale x 8 x half> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
145   ret <vscale x 8 x half> %0
148 define <vscale x 4 x float> @test_svcvt_f32_f64_x_1(<vscale x 2 x i1> %pg, <vscale x 2 x double> %x) {
149 ; CHECK-LABEL: test_svcvt_f32_f64_x_1:
150 ; CHECK:       // %bb.0: // %entry
151 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.d
152 ; CHECK-NEXT:    ret
154 ; CHECK-2p2-LABEL: test_svcvt_f32_f64_x_1:
155 ; CHECK-2p2:       // %bb.0: // %entry
156 ; CHECK-2p2-NEXT:    fcvt z0.s, p0/z, z0.d
157 ; CHECK-2p2-NEXT:    ret
158 entry:
159   %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f64(<vscale x 4 x float> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
160   ret <vscale x 4 x float> %0
163 define <vscale x 4 x float> @test_svcvt_f32_f64_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x double> %x) {
164 ; CHECK-LABEL: test_svcvt_f32_f64_x_2:
165 ; CHECK:       // %bb.0: // %entry
166 ; CHECK-NEXT:    fcvt z0.s, p0/m, z1.d
167 ; CHECK-NEXT:    ret
169 ; CHECK-2p2-LABEL: test_svcvt_f32_f64_x_2:
170 ; CHECK-2p2:       // %bb.0: // %entry
171 ; CHECK-2p2-NEXT:    fcvt z0.s, p0/z, z1.d
172 ; CHECK-2p2-NEXT:    ret
173 entry:
174   %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f64(<vscale x 4 x float> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
175   ret <vscale x 4 x float> %0
178 define <vscale x 4 x float> @test_svcvt_f32_f64_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x double> %x) {
179 ; CHECK-LABEL: test_svcvt_f32_f64_z:
180 ; CHECK:       // %bb.0: // %entry
181 ; CHECK-NEXT:    mov z0.s, #0 // =0x0
182 ; CHECK-NEXT:    fcvt z0.s, p0/m, z1.d
183 ; CHECK-NEXT:    ret
185 ; CHECK-2p2-LABEL: test_svcvt_f32_f64_z:
186 ; CHECK-2p2:       // %bb.0: // %entry
187 ; CHECK-2p2-NEXT:    fcvt z0.s, p0/z, z1.d
188 ; CHECK-2p2-NEXT:    ret
189 entry:
190   %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f64(<vscale x 4 x float> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
191   ret <vscale x 4 x float> %0
194 define <vscale x 4 x float> @test_svcvt_f32_f16_x_1(<vscale x 4 x i1> %pg, <vscale x 8 x half> %x) {
195 ; CHECK-LABEL: test_svcvt_f32_f16_x_1:
196 ; CHECK:       // %bb.0: // %entry
197 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.h
198 ; CHECK-NEXT:    ret
200 ; CHECK-2p2-LABEL: test_svcvt_f32_f16_x_1:
201 ; CHECK-2p2:       // %bb.0: // %entry
202 ; CHECK-2p2-NEXT:    fcvt z0.s, p0/z, z0.h
203 ; CHECK-2p2-NEXT:    ret
204 entry:
205   %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f16(<vscale x 4 x float> poison, <vscale x 4 x i1> %pg, <vscale x 8 x half> %x)
206   ret <vscale x 4 x float> %0
209 define <vscale x 4 x float> @test_svcvt_f32_f16_x_2(<vscale x 4 x i1> %pg, double %z0, <vscale x 8 x half> %x) {
210 ; CHECK-LABEL: test_svcvt_f32_f16_x_2:
211 ; CHECK:       // %bb.0: // %entry
212 ; CHECK-NEXT:    fcvt z0.s, p0/m, z1.h
213 ; CHECK-NEXT:    ret
215 ; CHECK-2p2-LABEL: test_svcvt_f32_f16_x_2:
216 ; CHECK-2p2:       // %bb.0: // %entry
217 ; CHECK-2p2-NEXT:    fcvt z0.s, p0/z, z1.h
218 ; CHECK-2p2-NEXT:    ret
219 entry:
220   %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f16(<vscale x 4 x float> poison, <vscale x 4 x i1> %pg, <vscale x 8 x half> %x)
221   ret <vscale x 4 x float> %0
224 define <vscale x 4 x float> @test_svcvt_f32_f16_z(<vscale x 4 x i1> %pg, double %z0, <vscale x 8 x half> %x) {
225 ; CHECK-LABEL: test_svcvt_f32_f16_z:
226 ; CHECK:       // %bb.0: // %entry
227 ; CHECK-NEXT:    mov z0.s, #0 // =0x0
228 ; CHECK-NEXT:    fcvt z0.s, p0/m, z1.h
229 ; CHECK-NEXT:    ret
231 ; CHECK-2p2-LABEL: test_svcvt_f32_f16_z:
232 ; CHECK-2p2:       // %bb.0: // %entry
233 ; CHECK-2p2-NEXT:    fcvt z0.s, p0/z, z1.h
234 ; CHECK-2p2-NEXT:    ret
235 entry:
236   %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f16(<vscale x 4 x float> zeroinitializer, <vscale x 4 x i1> %pg, <vscale x 8 x half> %x)
237   ret <vscale x 4 x float> %0
240 define <vscale x 2 x double> @test_svcvt_f64_f16_x_1(<vscale x 2 x i1> %pg, <vscale x 8 x half> %x) {
241 ; CHECK-LABEL: test_svcvt_f64_f16_x_1:
242 ; CHECK:       // %bb.0: // %entry
243 ; CHECK-NEXT:    fcvt z0.d, p0/m, z0.h
244 ; CHECK-NEXT:    ret
246 ; CHECK-2p2-LABEL: test_svcvt_f64_f16_x_1:
247 ; CHECK-2p2:       // %bb.0: // %entry
248 ; CHECK-2p2-NEXT:    fcvt z0.d, p0/z, z0.h
249 ; CHECK-2p2-NEXT:    ret
250 entry:
251   %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f16(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 8 x half> %x)
252   ret <vscale x 2 x double> %0
255 define <vscale x 2 x double> @test_svcvt_f64_f16_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 8 x half> %x) {
256 ; CHECK-LABEL: test_svcvt_f64_f16_x_2:
257 ; CHECK:       // %bb.0: // %entry
258 ; CHECK-NEXT:    fcvt z0.d, p0/m, z1.h
259 ; CHECK-NEXT:    ret
261 ; CHECK-2p2-LABEL: test_svcvt_f64_f16_x_2:
262 ; CHECK-2p2:       // %bb.0: // %entry
263 ; CHECK-2p2-NEXT:    fcvt z0.d, p0/z, z1.h
264 ; CHECK-2p2-NEXT:    ret
265 entry:
266   %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f16(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 8 x half> %x)
267   ret <vscale x 2 x double> %0
270 define <vscale x 2 x double> @test_svcvt_f64_f16_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 8 x half> %x) {
271 ; CHECK-LABEL: test_svcvt_f64_f16_z:
272 ; CHECK:       // %bb.0: // %entry
273 ; CHECK-NEXT:    mov z0.d, #0 // =0x0
274 ; CHECK-NEXT:    fcvt z0.d, p0/m, z1.h
275 ; CHECK-NEXT:    ret
277 ; CHECK-2p2-LABEL: test_svcvt_f64_f16_z:
278 ; CHECK-2p2:       // %bb.0: // %entry
279 ; CHECK-2p2-NEXT:    fcvt z0.d, p0/z, z1.h
280 ; CHECK-2p2-NEXT:    ret
281 entry:
282   %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f16(<vscale x 2 x double> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 8 x half> %x)
283   ret <vscale x 2 x double> %0
286 define <vscale x 2 x double> @test_svcvt_f64_f32_x_1(<vscale x 2 x i1> %pg, <vscale x 4 x float> %x) {
287 ; CHECK-LABEL: test_svcvt_f64_f32_x_1:
288 ; CHECK:       // %bb.0: // %entry
289 ; CHECK-NEXT:    fcvt z0.d, p0/m, z0.s
290 ; CHECK-NEXT:    ret
292 ; CHECK-2p2-LABEL: test_svcvt_f64_f32_x_1:
293 ; CHECK-2p2:       // %bb.0: // %entry
294 ; CHECK-2p2-NEXT:    fcvt z0.d, p0/z, z0.s
295 ; CHECK-2p2-NEXT:    ret
296 entry:
297   %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f32(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 4 x float> %x)
298   ret <vscale x 2 x double> %0
301 define <vscale x 2 x double> @test_svcvt_f64_f32_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 4 x float> %x) {
302 ; CHECK-LABEL: test_svcvt_f64_f32_x_2:
303 ; CHECK:       // %bb.0: // %entry
304 ; CHECK-NEXT:    fcvt z0.d, p0/m, z1.s
305 ; CHECK-NEXT:    ret
307 ; CHECK-2p2-LABEL: test_svcvt_f64_f32_x_2:
308 ; CHECK-2p2:       // %bb.0: // %entry
309 ; CHECK-2p2-NEXT:    fcvt z0.d, p0/z, z1.s
310 ; CHECK-2p2-NEXT:    ret
311 entry:
312   %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f32(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 4 x float> %x)
313   ret <vscale x 2 x double> %0
316 define <vscale x 2 x double> @test_svcvt_f64_f32_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 4 x float> %x) {
317 ; CHECK-LABEL: test_svcvt_f64_f32_z:
318 ; CHECK:       // %bb.0: // %entry
319 ; CHECK-NEXT:    mov z0.d, #0 // =0x0
320 ; CHECK-NEXT:    fcvt z0.d, p0/m, z1.s
321 ; CHECK-NEXT:    ret
323 ; CHECK-2p2-LABEL: test_svcvt_f64_f32_z:
324 ; CHECK-2p2:       // %bb.0: // %entry
325 ; CHECK-2p2-NEXT:    fcvt z0.d, p0/z, z1.s
326 ; CHECK-2p2-NEXT:    ret
327 entry:
328   %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f32(<vscale x 2 x double> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 4 x float> %x)
329   ret <vscale x 2 x double> %0
332 define <vscale x 8 x half> @test_svcvt_f16_f32_ptrue_u(double %z0, <vscale x 4 x float> %x) {
333 ; CHECK-LABEL: test_svcvt_f16_f32_ptrue_u:
334 ; CHECK:       // %bb.0: // %entry
335 ; CHECK-NEXT:    ptrue p0.s
336 ; CHECK-NEXT:    fcvt z0.h, p0/m, z1.s
337 ; CHECK-NEXT:    ret
339 ; CHECK-2p2-LABEL: test_svcvt_f16_f32_ptrue_u:
340 ; CHECK-2p2:       // %bb.0: // %entry
341 ; CHECK-2p2-NEXT:    ptrue p0.s
342 ; CHECK-2p2-NEXT:    fcvt z0.h, p0/z, z1.s
343 ; CHECK-2p2-NEXT:    ret
344 entry:
345   %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
346   %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f32(<vscale x 8 x half> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
347   ret <vscale x 8 x half> %0
350 define <vscale x 8 x half> @test_svcvt_f16_f32_ptrue(double %z0, <vscale x 8 x half> %x, <vscale x 4 x float> %y ) {
351 ; CHECK-LABEL: test_svcvt_f16_f32_ptrue:
352 ; CHECK:       // %bb.0: // %entry
353 ; CHECK-NEXT:    mov z0.d, z1.d
354 ; CHECK-NEXT:    ptrue p0.s
355 ; CHECK-NEXT:    fcvt z0.h, p0/m, z2.s
356 ; CHECK-NEXT:    ret
358 ; CHECK-2p2-LABEL: test_svcvt_f16_f32_ptrue:
359 ; CHECK-2p2:       // %bb.0: // %entry
360 ; CHECK-2p2-NEXT:    ptrue p0.s
361 ; CHECK-2p2-NEXT:    fcvt z0.h, p0/z, z2.s
362 ; CHECK-2p2-NEXT:    ret
363 entry:
364   %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
365   %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f32(<vscale x 8 x half> %x, <vscale x 4 x i1> %pg, <vscale x 4 x float> %y)
366   ret <vscale x 8 x half> %0
369 define <vscale x 8 x bfloat> @test_svcvt_bf16_f32_ptrue_u(double %z0, <vscale x 4 x float> %x) {
370 ; CHECK-LABEL: test_svcvt_bf16_f32_ptrue_u:
371 ; CHECK:       // %bb.0: // %entry
372 ; CHECK-NEXT:    ptrue p0.s
373 ; CHECK-NEXT:    bfcvt z0.h, p0/m, z1.s
374 ; CHECK-NEXT:    ret
376 ; CHECK-2p2-LABEL: test_svcvt_bf16_f32_ptrue_u:
377 ; CHECK-2p2:       // %bb.0: // %entry
378 ; CHECK-2p2-NEXT:    ptrue p0.s
379 ; CHECK-2p2-NEXT:    bfcvt z0.h, p0/z, z1.s
380 ; CHECK-2p2-NEXT:    ret
381 entry:
382   %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
383   %0 = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32.v2(<vscale x 8 x bfloat> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
384   ret <vscale x 8 x bfloat> %0
387 define <vscale x 8 x bfloat> @test_svcvt_bf16_f32_ptrue(double %z0, <vscale x 8 x bfloat> %x, <vscale x 4 x float> %y ) {
388 ; CHECK-LABEL: test_svcvt_bf16_f32_ptrue:
389 ; CHECK:       // %bb.0: // %entry
390 ; CHECK-NEXT:    mov z0.d, z1.d
391 ; CHECK-NEXT:    ptrue p0.s
392 ; CHECK-NEXT:    bfcvt z0.h, p0/m, z2.s
393 ; CHECK-NEXT:    ret
395 ; CHECK-2p2-LABEL: test_svcvt_bf16_f32_ptrue:
396 ; CHECK-2p2:       // %bb.0: // %entry
397 ; CHECK-2p2-NEXT:    ptrue p0.s
398 ; CHECK-2p2-NEXT:    bfcvt z0.h, p0/z, z2.s
399 ; CHECK-2p2-NEXT:    ret
400 entry:
401   %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
402   %0 = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.fcvt.bf16f32.v2(<vscale x 8 x bfloat> %x, <vscale x 4 x i1> %pg, <vscale x 4 x float> %y)
403   ret <vscale x 8 x bfloat> %0
406 define <vscale x 8 x half> @test_svcvt_f16_f64_ptrue_u(double %z0, <vscale x 2 x double> %x) {
407 ; CHECK-LABEL: test_svcvt_f16_f64_ptrue_u:
408 ; CHECK:       // %bb.0: // %entry
409 ; CHECK-NEXT:    ptrue p0.d
410 ; CHECK-NEXT:    fcvt z0.h, p0/m, z1.d
411 ; CHECK-NEXT:    ret
413 ; CHECK-2p2-LABEL: test_svcvt_f16_f64_ptrue_u:
414 ; CHECK-2p2:       // %bb.0: // %entry
415 ; CHECK-2p2-NEXT:    ptrue p0.d
416 ; CHECK-2p2-NEXT:    fcvt z0.h, p0/z, z1.d
417 ; CHECK-2p2-NEXT:    ret
418 entry:
419   %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
420   %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f64(<vscale x 8 x half> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
421   ret <vscale x 8 x half> %0
424 define <vscale x 8 x half> @test_svcvt_f16_f64_ptrue(double %z0, <vscale x 8 x half> %x, <vscale x 2 x double> %y ) {
425 ; CHECK-LABEL: test_svcvt_f16_f64_ptrue:
426 ; CHECK:       // %bb.0: // %entry
427 ; CHECK-NEXT:    mov z0.d, z1.d
428 ; CHECK-NEXT:    ptrue p0.d
429 ; CHECK-NEXT:    fcvt z0.h, p0/m, z2.d
430 ; CHECK-NEXT:    ret
432 ; CHECK-2p2-LABEL: test_svcvt_f16_f64_ptrue:
433 ; CHECK-2p2:       // %bb.0: // %entry
434 ; CHECK-2p2-NEXT:    ptrue p0.d
435 ; CHECK-2p2-NEXT:    fcvt z0.h, p0/z, z2.d
436 ; CHECK-2p2-NEXT:    ret
437 entry:
438   %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
439   %0 = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcvt.f16f64(<vscale x 8 x half> %x, <vscale x 2 x i1> %pg, <vscale x 2 x double> %y)
440   ret <vscale x 8 x half> %0
443 define <vscale x 4 x float> @test_svcvt_f32_f64_ptrue_u(double %z0, <vscale x 2 x double> %x) {
444 ; CHECK-LABEL: test_svcvt_f32_f64_ptrue_u:
445 ; CHECK:       // %bb.0: // %entry
446 ; CHECK-NEXT:    ptrue p0.d
447 ; CHECK-NEXT:    fcvt z0.s, p0/m, z1.d
448 ; CHECK-NEXT:    ret
450 ; CHECK-2p2-LABEL: test_svcvt_f32_f64_ptrue_u:
451 ; CHECK-2p2:       // %bb.0: // %entry
452 ; CHECK-2p2-NEXT:    ptrue p0.d
453 ; CHECK-2p2-NEXT:    fcvt z0.s, p0/z, z1.d
454 ; CHECK-2p2-NEXT:    ret
455 entry:
456   %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
457   %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f64(<vscale x 4 x float> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
458   ret <vscale x 4 x float> %0
461 define <vscale x 4 x float> @test_svcvt_f32_f64_ptrue(double %z0, <vscale x 4 x float> %x, <vscale x 2 x double> %y ) {
462 ; CHECK-LABEL: test_svcvt_f32_f64_ptrue:
463 ; CHECK:       // %bb.0: // %entry
464 ; CHECK-NEXT:    mov z0.d, z1.d
465 ; CHECK-NEXT:    ptrue p0.d
466 ; CHECK-NEXT:    fcvt z0.s, p0/m, z2.d
467 ; CHECK-NEXT:    ret
469 ; CHECK-2p2-LABEL: test_svcvt_f32_f64_ptrue:
470 ; CHECK-2p2:       // %bb.0: // %entry
471 ; CHECK-2p2-NEXT:    ptrue p0.d
472 ; CHECK-2p2-NEXT:    fcvt z0.s, p0/z, z2.d
473 ; CHECK-2p2-NEXT:    ret
474 entry:
475   %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
476   %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f64(<vscale x 4 x float> %x, <vscale x 2 x i1> %pg, <vscale x 2 x double> %y)
477   ret <vscale x 4 x float> %0
480 define <vscale x 4 x float> @test_svcvt_f32_f16_ptrue_u(double %z0, <vscale x 8 x half> %x) {
481 ; CHECK-LABEL: test_svcvt_f32_f16_ptrue_u:
482 ; CHECK:       // %bb.0: // %entry
483 ; CHECK-NEXT:    ptrue p0.s
484 ; CHECK-NEXT:    fcvt z0.s, p0/m, z1.h
485 ; CHECK-NEXT:    ret
487 ; CHECK-2p2-LABEL: test_svcvt_f32_f16_ptrue_u:
488 ; CHECK-2p2:       // %bb.0: // %entry
489 ; CHECK-2p2-NEXT:    ptrue p0.s
490 ; CHECK-2p2-NEXT:    fcvt z0.s, p0/z, z1.h
491 ; CHECK-2p2-NEXT:    ret
492 entry:
493   %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
494   %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f16(<vscale x 4 x float> poison, <vscale x 4 x i1> %pg, <vscale x 8 x half> %x)
495   ret <vscale x 4 x float> %0
498 define <vscale x 4 x float> @test_svcvt_f32_f16_ptrue(double %z0, <vscale x 4 x float> %x, <vscale x 8 x half> %y ) {
499 ; CHECK-LABEL: test_svcvt_f32_f16_ptrue:
500 ; CHECK:       // %bb.0: // %entry
501 ; CHECK-NEXT:    mov z0.d, z1.d
502 ; CHECK-NEXT:    ptrue p0.s
503 ; CHECK-NEXT:    fcvt z0.s, p0/m, z2.h
504 ; CHECK-NEXT:    ret
506 ; CHECK-2p2-LABEL: test_svcvt_f32_f16_ptrue:
507 ; CHECK-2p2:       // %bb.0: // %entry
508 ; CHECK-2p2-NEXT:    ptrue p0.s
509 ; CHECK-2p2-NEXT:    fcvt z0.s, p0/z, z2.h
510 ; CHECK-2p2-NEXT:    ret
511 entry:
512   %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
513   %0 = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcvt.f32f16(<vscale x 4 x float> %x, <vscale x 4 x i1> %pg, <vscale x 8 x half> %y)
514   ret <vscale x 4 x float> %0
517 define <vscale x 2 x double> @test_svcvt_f64_f16_ptrue_u(double %z0, <vscale x 8 x half> %x) {
518 ; CHECK-LABEL: test_svcvt_f64_f16_ptrue_u:
519 ; CHECK:       // %bb.0: // %entry
520 ; CHECK-NEXT:    ptrue p0.d
521 ; CHECK-NEXT:    fcvt z0.d, p0/m, z1.h
522 ; CHECK-NEXT:    ret
524 ; CHECK-2p2-LABEL: test_svcvt_f64_f16_ptrue_u:
525 ; CHECK-2p2:       // %bb.0: // %entry
526 ; CHECK-2p2-NEXT:    ptrue p0.d
527 ; CHECK-2p2-NEXT:    fcvt z0.d, p0/z, z1.h
528 ; CHECK-2p2-NEXT:    ret
529 entry:
530   %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
531   %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f16(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 8 x half> %x)
532   ret <vscale x 2 x double> %0
535 define <vscale x 2 x double> @test_svcvt_f64_f16_ptrue(double %z0, <vscale x 2 x double> %x, <vscale x 8 x half> %y ) {
536 ; CHECK-LABEL: test_svcvt_f64_f16_ptrue:
537 ; CHECK:       // %bb.0: // %entry
538 ; CHECK-NEXT:    mov z0.d, z1.d
539 ; CHECK-NEXT:    ptrue p0.d
540 ; CHECK-NEXT:    fcvt z0.d, p0/m, z2.h
541 ; CHECK-NEXT:    ret
543 ; CHECK-2p2-LABEL: test_svcvt_f64_f16_ptrue:
544 ; CHECK-2p2:       // %bb.0: // %entry
545 ; CHECK-2p2-NEXT:    ptrue p0.d
546 ; CHECK-2p2-NEXT:    fcvt z0.d, p0/z, z2.h
547 ; CHECK-2p2-NEXT:    ret
548 entry:
549   %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
550   %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f16(<vscale x 2 x double> %x, <vscale x 2 x i1> %pg, <vscale x 8 x half> %y)
551   ret <vscale x 2 x double> %0
554 define <vscale x 2 x double> @test_svcvt_f64_f32_ptrue_u(double %z0, <vscale x 4 x float> %x) {
555 ; CHECK-LABEL: test_svcvt_f64_f32_ptrue_u:
556 ; CHECK:       // %bb.0: // %entry
557 ; CHECK-NEXT:    ptrue p0.d
558 ; CHECK-NEXT:    fcvt z0.d, p0/m, z1.s
559 ; CHECK-NEXT:    ret
561 ; CHECK-2p2-LABEL: test_svcvt_f64_f32_ptrue_u:
562 ; CHECK-2p2:       // %bb.0: // %entry
563 ; CHECK-2p2-NEXT:    ptrue p0.d
564 ; CHECK-2p2-NEXT:    fcvt z0.d, p0/z, z1.s
565 ; CHECK-2p2-NEXT:    ret
566 entry:
567   %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
568   %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f32(<vscale x 2 x double> poison, <vscale x 2 x i1> %pg, <vscale x 4 x float> %x)
569   ret <vscale x 2 x double> %0
572 define <vscale x 2 x double> @test_svcvt_f64_f32_ptrue(double %z0, <vscale x 2 x double> %x, <vscale x 4 x float> %y ) {
573 ; CHECK-LABEL: test_svcvt_f64_f32_ptrue:
574 ; CHECK:       // %bb.0: // %entry
575 ; CHECK-NEXT:    mov z0.d, z1.d
576 ; CHECK-NEXT:    ptrue p0.d
577 ; CHECK-NEXT:    fcvt z0.d, p0/m, z2.s
578 ; CHECK-NEXT:    ret
580 ; CHECK-2p2-LABEL: test_svcvt_f64_f32_ptrue:
581 ; CHECK-2p2:       // %bb.0: // %entry
582 ; CHECK-2p2-NEXT:    ptrue p0.d
583 ; CHECK-2p2-NEXT:    fcvt z0.d, p0/z, z2.s
584 ; CHECK-2p2-NEXT:    ret
585 entry:
586   %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
587   %0 = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcvt.f64f32(<vscale x 2 x double> %x, <vscale x 2 x i1> %pg, <vscale x 4 x float> %y)
588   ret <vscale x 2 x double> %0