1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc -mattr=+sve < %s | FileCheck %s
3 ; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2
5 ; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s
6 ; RUN: llc -mattr=+sme2p2 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2
8 target triple = "aarch64-linux"
10 define <vscale x 8 x i16> @test_svextb_s16_x_1(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %x) {
11 ; CHECK-LABEL: test_svextb_s16_x_1:
12 ; CHECK: // %bb.0: // %entry
13 ; CHECK-NEXT: sxtb z0.h, p0/m, z0.h
16 ; CHECK-2p2-LABEL: test_svextb_s16_x_1:
17 ; CHECK-2p2: // %bb.0: // %entry
18 ; CHECK-2p2-NEXT: sxtb z0.h, p0/z, z0.h
21 %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.sxtb.nxv8i16(<vscale x 8 x i16> poison, <vscale x 8 x i1> %pg, <vscale x 8 x i16> %x)
22 ret <vscale x 8 x i16> %0
25 define <vscale x 8 x i16> @test_svextb_s16_x_2(<vscale x 8 x i1> %pg, double %z0, <vscale x 8 x i16> %x) {
26 ; CHECK-LABEL: test_svextb_s16_x_2:
27 ; CHECK: // %bb.0: // %entry
28 ; CHECK-NEXT: movprfx z0, z1
29 ; CHECK-NEXT: sxtb z0.h, p0/m, z1.h
32 ; CHECK-2p2-LABEL: test_svextb_s16_x_2:
33 ; CHECK-2p2: // %bb.0: // %entry
34 ; CHECK-2p2-NEXT: sxtb z0.h, p0/z, z1.h
37 %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.sxtb.nxv8i16(<vscale x 8 x i16> poison, <vscale x 8 x i1> %pg, <vscale x 8 x i16> %x)
38 ret <vscale x 8 x i16> %0
41 define <vscale x 8 x i16> @test_svextb_s16_z(<vscale x 8 x i1> %pg, double %z0, <vscale x 8 x i16> %x) {
42 ; CHECK-LABEL: test_svextb_s16_z:
43 ; CHECK: // %bb.0: // %entry
44 ; CHECK-NEXT: mov z0.h, #0 // =0x0
45 ; CHECK-NEXT: sxtb z0.h, p0/m, z1.h
48 ; CHECK-2p2-LABEL: test_svextb_s16_z:
49 ; CHECK-2p2: // %bb.0: // %entry
50 ; CHECK-2p2-NEXT: sxtb z0.h, p0/z, z1.h
53 %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.sxtb.nxv8i16(<vscale x 8 x i16> zeroinitializer, <vscale x 8 x i1> %pg, <vscale x 8 x i16> %x)
54 ret <vscale x 8 x i16> %0
57 define <vscale x 4 x i32> @test_svextb_s32_x_1(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
58 ; CHECK-LABEL: test_svextb_s32_x_1:
59 ; CHECK: // %bb.0: // %entry
60 ; CHECK-NEXT: sxtb z0.s, p0/m, z0.s
63 ; CHECK-2p2-LABEL: test_svextb_s32_x_1:
64 ; CHECK-2p2: // %bb.0: // %entry
65 ; CHECK-2p2-NEXT: sxtb z0.s, p0/z, z0.s
68 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.sxtb.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
69 ret <vscale x 4 x i32> %0
72 define <vscale x 4 x i32> @test_svextb_s32_x_2(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x i32> %x) {
73 ; CHECK-LABEL: test_svextb_s32_x_2:
74 ; CHECK: // %bb.0: // %entry
75 ; CHECK-NEXT: movprfx z0, z1
76 ; CHECK-NEXT: sxtb z0.s, p0/m, z1.s
79 ; CHECK-2p2-LABEL: test_svextb_s32_x_2:
80 ; CHECK-2p2: // %bb.0: // %entry
81 ; CHECK-2p2-NEXT: sxtb z0.s, p0/z, z1.s
84 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.sxtb.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
85 ret <vscale x 4 x i32> %0
88 define <vscale x 4 x i32> @test_svextb_s32_z(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x i32> %x) {
89 ; CHECK-LABEL: test_svextb_s32_z:
90 ; CHECK: // %bb.0: // %entry
91 ; CHECK-NEXT: mov z0.s, #0 // =0x0
92 ; CHECK-NEXT: sxtb z0.s, p0/m, z1.s
95 ; CHECK-2p2-LABEL: test_svextb_s32_z:
96 ; CHECK-2p2: // %bb.0: // %entry
97 ; CHECK-2p2-NEXT: sxtb z0.s, p0/z, z1.s
100 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.sxtb.nxv4i32(<vscale x 4 x i32> zeroinitializer, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
101 ret <vscale x 4 x i32> %0
104 define <vscale x 2 x i64> @test_svextb_s64_x_1(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %x) {
105 ; CHECK-LABEL: test_svextb_s64_x_1:
106 ; CHECK: // %bb.0: // %entry
107 ; CHECK-NEXT: sxtb z0.d, p0/m, z0.d
110 ; CHECK-2p2-LABEL: test_svextb_s64_x_1:
111 ; CHECK-2p2: // %bb.0: // %entry
112 ; CHECK-2p2-NEXT: sxtb z0.d, p0/z, z0.d
113 ; CHECK-2p2-NEXT: ret
115 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxtb.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
116 ret <vscale x 2 x i64> %0
119 define <vscale x 2 x i64> @test_svextb_s64_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
120 ; CHECK-LABEL: test_svextb_s64_x_2:
121 ; CHECK: // %bb.0: // %entry
122 ; CHECK-NEXT: movprfx z0, z1
123 ; CHECK-NEXT: sxtb z0.d, p0/m, z1.d
126 ; CHECK-2p2-LABEL: test_svextb_s64_x_2:
127 ; CHECK-2p2: // %bb.0: // %entry
128 ; CHECK-2p2-NEXT: sxtb z0.d, p0/z, z1.d
129 ; CHECK-2p2-NEXT: ret
131 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxtb.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
132 ret <vscale x 2 x i64> %0
135 define <vscale x 2 x i64> @test_svextb_s64_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
136 ; CHECK-LABEL: test_svextb_s64_z:
137 ; CHECK: // %bb.0: // %entry
138 ; CHECK-NEXT: mov z0.d, #0 // =0x0
139 ; CHECK-NEXT: sxtb z0.d, p0/m, z1.d
142 ; CHECK-2p2-LABEL: test_svextb_s64_z:
143 ; CHECK-2p2: // %bb.0: // %entry
144 ; CHECK-2p2-NEXT: sxtb z0.d, p0/z, z1.d
145 ; CHECK-2p2-NEXT: ret
147 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxtb.nxv2i64(<vscale x 2 x i64> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
148 ret <vscale x 2 x i64> %0
151 define <vscale x 8 x i16> @test_svextb_u16_x_1(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %x) {
152 ; CHECK-LABEL: test_svextb_u16_x_1:
153 ; CHECK: // %bb.0: // %entry
154 ; CHECK-NEXT: uxtb z0.h, p0/m, z0.h
157 ; CHECK-2p2-LABEL: test_svextb_u16_x_1:
158 ; CHECK-2p2: // %bb.0: // %entry
159 ; CHECK-2p2-NEXT: uxtb z0.h, p0/z, z0.h
160 ; CHECK-2p2-NEXT: ret
162 %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.uxtb.nxv8i16(<vscale x 8 x i16> poison, <vscale x 8 x i1> %pg, <vscale x 8 x i16> %x)
163 ret <vscale x 8 x i16> %0
166 define <vscale x 8 x i16> @test_svextb_u16_x_2(<vscale x 8 x i1> %pg, double %z0, <vscale x 8 x i16> %x) {
167 ; CHECK-LABEL: test_svextb_u16_x_2:
168 ; CHECK: // %bb.0: // %entry
169 ; CHECK-NEXT: movprfx z0, z1
170 ; CHECK-NEXT: uxtb z0.h, p0/m, z1.h
173 ; CHECK-2p2-LABEL: test_svextb_u16_x_2:
174 ; CHECK-2p2: // %bb.0: // %entry
175 ; CHECK-2p2-NEXT: uxtb z0.h, p0/z, z1.h
176 ; CHECK-2p2-NEXT: ret
178 %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.uxtb.nxv8i16(<vscale x 8 x i16> poison, <vscale x 8 x i1> %pg, <vscale x 8 x i16> %x)
179 ret <vscale x 8 x i16> %0
182 define <vscale x 8 x i16> @test_svextb_u16_z(<vscale x 8 x i1> %pg, double %z0, <vscale x 8 x i16> %x) {
183 ; CHECK-LABEL: test_svextb_u16_z:
184 ; CHECK: // %bb.0: // %entry
185 ; CHECK-NEXT: mov z0.h, #0 // =0x0
186 ; CHECK-NEXT: uxtb z0.h, p0/m, z1.h
189 ; CHECK-2p2-LABEL: test_svextb_u16_z:
190 ; CHECK-2p2: // %bb.0: // %entry
191 ; CHECK-2p2-NEXT: uxtb z0.h, p0/z, z1.h
192 ; CHECK-2p2-NEXT: ret
194 %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.uxtb.nxv8i16(<vscale x 8 x i16> zeroinitializer, <vscale x 8 x i1> %pg, <vscale x 8 x i16> %x)
195 ret <vscale x 8 x i16> %0
198 define <vscale x 4 x i32> @test_svextb_u32_x_1(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
199 ; CHECK-LABEL: test_svextb_u32_x_1:
200 ; CHECK: // %bb.0: // %entry
201 ; CHECK-NEXT: uxtb z0.s, p0/m, z0.s
204 ; CHECK-2p2-LABEL: test_svextb_u32_x_1:
205 ; CHECK-2p2: // %bb.0: // %entry
206 ; CHECK-2p2-NEXT: uxtb z0.s, p0/z, z0.s
207 ; CHECK-2p2-NEXT: ret
209 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.uxtb.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
210 ret <vscale x 4 x i32> %0
213 define <vscale x 4 x i32> @test_svextb_u32_x_2(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x i32> %x) {
214 ; CHECK-LABEL: test_svextb_u32_x_2:
215 ; CHECK: // %bb.0: // %entry
216 ; CHECK-NEXT: movprfx z0, z1
217 ; CHECK-NEXT: uxtb z0.s, p0/m, z1.s
220 ; CHECK-2p2-LABEL: test_svextb_u32_x_2:
221 ; CHECK-2p2: // %bb.0: // %entry
222 ; CHECK-2p2-NEXT: uxtb z0.s, p0/z, z1.s
223 ; CHECK-2p2-NEXT: ret
225 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.uxtb.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
226 ret <vscale x 4 x i32> %0
229 define <vscale x 4 x i32> @test_svextb_u32_z(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x i32> %x) {
230 ; CHECK-LABEL: test_svextb_u32_z:
231 ; CHECK: // %bb.0: // %entry
232 ; CHECK-NEXT: mov z0.s, #0 // =0x0
233 ; CHECK-NEXT: uxtb z0.s, p0/m, z1.s
236 ; CHECK-2p2-LABEL: test_svextb_u32_z:
237 ; CHECK-2p2: // %bb.0: // %entry
238 ; CHECK-2p2-NEXT: uxtb z0.s, p0/z, z1.s
239 ; CHECK-2p2-NEXT: ret
241 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.uxtb.nxv4i32(<vscale x 4 x i32> zeroinitializer, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
242 ret <vscale x 4 x i32> %0
245 define <vscale x 2 x i64> @test_svextb_u64_x_1(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %x) {
246 ; CHECK-LABEL: test_svextb_u64_x_1:
247 ; CHECK: // %bb.0: // %entry
248 ; CHECK-NEXT: uxtb z0.d, p0/m, z0.d
251 ; CHECK-2p2-LABEL: test_svextb_u64_x_1:
252 ; CHECK-2p2: // %bb.0: // %entry
253 ; CHECK-2p2-NEXT: uxtb z0.d, p0/z, z0.d
254 ; CHECK-2p2-NEXT: ret
256 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxtb.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
257 ret <vscale x 2 x i64> %0
260 define <vscale x 2 x i64> @test_svextb_u64_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
261 ; CHECK-LABEL: test_svextb_u64_x_2:
262 ; CHECK: // %bb.0: // %entry
263 ; CHECK-NEXT: movprfx z0, z1
264 ; CHECK-NEXT: uxtb z0.d, p0/m, z1.d
267 ; CHECK-2p2-LABEL: test_svextb_u64_x_2:
268 ; CHECK-2p2: // %bb.0: // %entry
269 ; CHECK-2p2-NEXT: uxtb z0.d, p0/z, z1.d
270 ; CHECK-2p2-NEXT: ret
272 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxtb.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
273 ret <vscale x 2 x i64> %0
276 define <vscale x 2 x i64> @test_svextb_u64_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
277 ; CHECK-LABEL: test_svextb_u64_z:
278 ; CHECK: // %bb.0: // %entry
279 ; CHECK-NEXT: mov z0.d, #0 // =0x0
280 ; CHECK-NEXT: uxtb z0.d, p0/m, z1.d
283 ; CHECK-2p2-LABEL: test_svextb_u64_z:
284 ; CHECK-2p2: // %bb.0: // %entry
285 ; CHECK-2p2-NEXT: uxtb z0.d, p0/z, z1.d
286 ; CHECK-2p2-NEXT: ret
288 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxtb.nxv2i64(<vscale x 2 x i64> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
289 ret <vscale x 2 x i64> %0
292 define <vscale x 4 x i32> @test_svexth_s32_x_1(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
293 ; CHECK-LABEL: test_svexth_s32_x_1:
294 ; CHECK: // %bb.0: // %entry
295 ; CHECK-NEXT: sxth z0.s, p0/m, z0.s
298 ; CHECK-2p2-LABEL: test_svexth_s32_x_1:
299 ; CHECK-2p2: // %bb.0: // %entry
300 ; CHECK-2p2-NEXT: sxth z0.s, p0/z, z0.s
301 ; CHECK-2p2-NEXT: ret
303 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.sxth.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
304 ret <vscale x 4 x i32> %0
307 define <vscale x 4 x i32> @test_svexth_s32_x_2(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x i32> %x) {
308 ; CHECK-LABEL: test_svexth_s32_x_2:
309 ; CHECK: // %bb.0: // %entry
310 ; CHECK-NEXT: movprfx z0, z1
311 ; CHECK-NEXT: sxth z0.s, p0/m, z1.s
314 ; CHECK-2p2-LABEL: test_svexth_s32_x_2:
315 ; CHECK-2p2: // %bb.0: // %entry
316 ; CHECK-2p2-NEXT: sxth z0.s, p0/z, z1.s
317 ; CHECK-2p2-NEXT: ret
319 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.sxth.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
320 ret <vscale x 4 x i32> %0
323 define <vscale x 4 x i32> @test_svexth_s32_z(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x i32> %x) {
324 ; CHECK-LABEL: test_svexth_s32_z:
325 ; CHECK: // %bb.0: // %entry
326 ; CHECK-NEXT: mov z0.s, #0 // =0x0
327 ; CHECK-NEXT: sxth z0.s, p0/m, z1.s
330 ; CHECK-2p2-LABEL: test_svexth_s32_z:
331 ; CHECK-2p2: // %bb.0: // %entry
332 ; CHECK-2p2-NEXT: sxth z0.s, p0/z, z1.s
333 ; CHECK-2p2-NEXT: ret
335 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.sxth.nxv4i32(<vscale x 4 x i32> zeroinitializer, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
336 ret <vscale x 4 x i32> %0
339 define <vscale x 2 x i64> @test_svexth_s64_x_1(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %x) {
340 ; CHECK-LABEL: test_svexth_s64_x_1:
341 ; CHECK: // %bb.0: // %entry
342 ; CHECK-NEXT: sxth z0.d, p0/m, z0.d
345 ; CHECK-2p2-LABEL: test_svexth_s64_x_1:
346 ; CHECK-2p2: // %bb.0: // %entry
347 ; CHECK-2p2-NEXT: sxth z0.d, p0/z, z0.d
348 ; CHECK-2p2-NEXT: ret
350 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxth.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
351 ret <vscale x 2 x i64> %0
354 define <vscale x 2 x i64> @test_svexth_s64_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
355 ; CHECK-LABEL: test_svexth_s64_x_2:
356 ; CHECK: // %bb.0: // %entry
357 ; CHECK-NEXT: movprfx z0, z1
358 ; CHECK-NEXT: sxth z0.d, p0/m, z1.d
361 ; CHECK-2p2-LABEL: test_svexth_s64_x_2:
362 ; CHECK-2p2: // %bb.0: // %entry
363 ; CHECK-2p2-NEXT: sxth z0.d, p0/z, z1.d
364 ; CHECK-2p2-NEXT: ret
366 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxth.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
367 ret <vscale x 2 x i64> %0
370 define <vscale x 2 x i64> @test_svexth_s64_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
371 ; CHECK-LABEL: test_svexth_s64_z:
372 ; CHECK: // %bb.0: // %entry
373 ; CHECK-NEXT: mov z0.d, #0 // =0x0
374 ; CHECK-NEXT: sxth z0.d, p0/m, z1.d
377 ; CHECK-2p2-LABEL: test_svexth_s64_z:
378 ; CHECK-2p2: // %bb.0: // %entry
379 ; CHECK-2p2-NEXT: sxth z0.d, p0/z, z1.d
380 ; CHECK-2p2-NEXT: ret
382 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxth.nxv2i64(<vscale x 2 x i64> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
383 ret <vscale x 2 x i64> %0
386 define <vscale x 4 x i32> @test_svexth_u32_x_1(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %x) {
387 ; CHECK-LABEL: test_svexth_u32_x_1:
388 ; CHECK: // %bb.0: // %entry
389 ; CHECK-NEXT: uxth z0.s, p0/m, z0.s
392 ; CHECK-2p2-LABEL: test_svexth_u32_x_1:
393 ; CHECK-2p2: // %bb.0: // %entry
394 ; CHECK-2p2-NEXT: uxth z0.s, p0/z, z0.s
395 ; CHECK-2p2-NEXT: ret
397 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.uxth.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
398 ret <vscale x 4 x i32> %0
401 define <vscale x 4 x i32> @test_svexth_u32_x_2(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x i32> %x) {
402 ; CHECK-LABEL: test_svexth_u32_x_2:
403 ; CHECK: // %bb.0: // %entry
404 ; CHECK-NEXT: movprfx z0, z1
405 ; CHECK-NEXT: uxth z0.s, p0/m, z1.s
408 ; CHECK-2p2-LABEL: test_svexth_u32_x_2:
409 ; CHECK-2p2: // %bb.0: // %entry
410 ; CHECK-2p2-NEXT: uxth z0.s, p0/z, z1.s
411 ; CHECK-2p2-NEXT: ret
413 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.uxth.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
414 ret <vscale x 4 x i32> %0
417 define <vscale x 4 x i32> @test_svexth_u32_z(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x i32> %x) {
418 ; CHECK-LABEL: test_svexth_u32_z:
419 ; CHECK: // %bb.0: // %entry
420 ; CHECK-NEXT: mov z0.s, #0 // =0x0
421 ; CHECK-NEXT: uxth z0.s, p0/m, z1.s
424 ; CHECK-2p2-LABEL: test_svexth_u32_z:
425 ; CHECK-2p2: // %bb.0: // %entry
426 ; CHECK-2p2-NEXT: uxth z0.s, p0/z, z1.s
427 ; CHECK-2p2-NEXT: ret
429 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.uxth.nxv4i32(<vscale x 4 x i32> zeroinitializer, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
430 ret <vscale x 4 x i32> %0
433 define <vscale x 2 x i64> @test_svexth_u64_x_1(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %x) {
434 ; CHECK-LABEL: test_svexth_u64_x_1:
435 ; CHECK: // %bb.0: // %entry
436 ; CHECK-NEXT: uxth z0.d, p0/m, z0.d
439 ; CHECK-2p2-LABEL: test_svexth_u64_x_1:
440 ; CHECK-2p2: // %bb.0: // %entry
441 ; CHECK-2p2-NEXT: uxth z0.d, p0/z, z0.d
442 ; CHECK-2p2-NEXT: ret
444 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxth.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
445 ret <vscale x 2 x i64> %0
448 define <vscale x 2 x i64> @test_svexth_u64_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
449 ; CHECK-LABEL: test_svexth_u64_x_2:
450 ; CHECK: // %bb.0: // %entry
451 ; CHECK-NEXT: movprfx z0, z1
452 ; CHECK-NEXT: uxth z0.d, p0/m, z1.d
455 ; CHECK-2p2-LABEL: test_svexth_u64_x_2:
456 ; CHECK-2p2: // %bb.0: // %entry
457 ; CHECK-2p2-NEXT: uxth z0.d, p0/z, z1.d
458 ; CHECK-2p2-NEXT: ret
460 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxth.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
461 ret <vscale x 2 x i64> %0
464 define <vscale x 2 x i64> @test_svexth_u64_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
465 ; CHECK-LABEL: test_svexth_u64_z:
466 ; CHECK: // %bb.0: // %entry
467 ; CHECK-NEXT: mov z0.d, #0 // =0x0
468 ; CHECK-NEXT: uxth z0.d, p0/m, z1.d
471 ; CHECK-2p2-LABEL: test_svexth_u64_z:
472 ; CHECK-2p2: // %bb.0: // %entry
473 ; CHECK-2p2-NEXT: uxth z0.d, p0/z, z1.d
474 ; CHECK-2p2-NEXT: ret
476 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxth.nxv2i64(<vscale x 2 x i64> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
477 ret <vscale x 2 x i64> %0
480 define <vscale x 2 x i64> @test_svextw_s64_x_1(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %x) {
481 ; CHECK-LABEL: test_svextw_s64_x_1:
482 ; CHECK: // %bb.0: // %entry
483 ; CHECK-NEXT: sxtw z0.d, p0/m, z0.d
486 ; CHECK-2p2-LABEL: test_svextw_s64_x_1:
487 ; CHECK-2p2: // %bb.0: // %entry
488 ; CHECK-2p2-NEXT: sxtw z0.d, p0/z, z0.d
489 ; CHECK-2p2-NEXT: ret
491 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxtw.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
492 ret <vscale x 2 x i64> %0
495 define <vscale x 2 x i64> @test_svextw_s64_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
496 ; CHECK-LABEL: test_svextw_s64_x_2:
497 ; CHECK: // %bb.0: // %entry
498 ; CHECK-NEXT: movprfx z0, z1
499 ; CHECK-NEXT: sxtw z0.d, p0/m, z1.d
502 ; CHECK-2p2-LABEL: test_svextw_s64_x_2:
503 ; CHECK-2p2: // %bb.0: // %entry
504 ; CHECK-2p2-NEXT: sxtw z0.d, p0/z, z1.d
505 ; CHECK-2p2-NEXT: ret
507 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxtw.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
508 ret <vscale x 2 x i64> %0
511 define <vscale x 2 x i64> @test_svextw_s64_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
512 ; CHECK-LABEL: test_svextw_s64_z:
513 ; CHECK: // %bb.0: // %entry
514 ; CHECK-NEXT: mov z0.d, #0 // =0x0
515 ; CHECK-NEXT: sxtw z0.d, p0/m, z1.d
518 ; CHECK-2p2-LABEL: test_svextw_s64_z:
519 ; CHECK-2p2: // %bb.0: // %entry
520 ; CHECK-2p2-NEXT: sxtw z0.d, p0/z, z1.d
521 ; CHECK-2p2-NEXT: ret
523 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxtw.nxv2i64(<vscale x 2 x i64> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
524 ret <vscale x 2 x i64> %0
527 define <vscale x 2 x i64> @test_svextw_u64_x_1(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %x) {
528 ; CHECK-LABEL: test_svextw_u64_x_1:
529 ; CHECK: // %bb.0: // %entry
530 ; CHECK-NEXT: uxtw z0.d, p0/m, z0.d
533 ; CHECK-2p2-LABEL: test_svextw_u64_x_1:
534 ; CHECK-2p2: // %bb.0: // %entry
535 ; CHECK-2p2-NEXT: uxtw z0.d, p0/z, z0.d
536 ; CHECK-2p2-NEXT: ret
538 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxtw.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
539 ret <vscale x 2 x i64> %0
542 define <vscale x 2 x i64> @test_svextw_u64_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
543 ; CHECK-LABEL: test_svextw_u64_x_2:
544 ; CHECK: // %bb.0: // %entry
545 ; CHECK-NEXT: movprfx z0, z1
546 ; CHECK-NEXT: uxtw z0.d, p0/m, z1.d
549 ; CHECK-2p2-LABEL: test_svextw_u64_x_2:
550 ; CHECK-2p2: // %bb.0: // %entry
551 ; CHECK-2p2-NEXT: uxtw z0.d, p0/z, z1.d
552 ; CHECK-2p2-NEXT: ret
554 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxtw.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
555 ret <vscale x 2 x i64> %0
558 define <vscale x 2 x i64> @test_svextw_u64_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x i64> %x) {
559 ; CHECK-LABEL: test_svextw_u64_z:
560 ; CHECK: // %bb.0: // %entry
561 ; CHECK-NEXT: mov z0.d, #0 // =0x0
562 ; CHECK-NEXT: uxtw z0.d, p0/m, z1.d
565 ; CHECK-2p2-LABEL: test_svextw_u64_z:
566 ; CHECK-2p2: // %bb.0: // %entry
567 ; CHECK-2p2-NEXT: uxtw z0.d, p0/z, z1.d
568 ; CHECK-2p2-NEXT: ret
570 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxtw.nxv2i64(<vscale x 2 x i64> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
571 ret <vscale x 2 x i64> %0
574 define <vscale x 8 x i16> @test_svsxtb_nxv8i16_ptrue_u(double %z0, <vscale x 8 x i16> %x) {
575 ; CHECK-LABEL: test_svsxtb_nxv8i16_ptrue_u:
576 ; CHECK: // %bb.0: // %entry
577 ; CHECK-NEXT: ptrue p0.h
578 ; CHECK-NEXT: movprfx z0, z1
579 ; CHECK-NEXT: sxtb z0.h, p0/m, z1.h
582 ; CHECK-2p2-LABEL: test_svsxtb_nxv8i16_ptrue_u:
583 ; CHECK-2p2: // %bb.0: // %entry
584 ; CHECK-2p2-NEXT: ptrue p0.h
585 ; CHECK-2p2-NEXT: sxtb z0.h, p0/z, z1.h
586 ; CHECK-2p2-NEXT: ret
588 %pg = call <vscale x 8 x i1> @llvm.aarch64.sve.ptrue.nxv8i1(i32 31)
589 %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.sxtb.nxv8i16(<vscale x 8 x i16> poison, <vscale x 8 x i1> %pg, <vscale x 8 x i16> %x)
590 ret <vscale x 8 x i16> %0
593 define <vscale x 8 x i16> @test_svsxtb_nxv8i16_ptrue(double %z0, <vscale x 8 x i16> %x, <vscale x 8 x i16> %y) {
594 ; CHECK-LABEL: test_svsxtb_nxv8i16_ptrue:
595 ; CHECK: // %bb.0: // %entry
596 ; CHECK-NEXT: ptrue p0.h
597 ; CHECK-NEXT: movprfx z0, z2
598 ; CHECK-NEXT: sxtb z0.h, p0/m, z2.h
601 ; CHECK-2p2-LABEL: test_svsxtb_nxv8i16_ptrue:
602 ; CHECK-2p2: // %bb.0: // %entry
603 ; CHECK-2p2-NEXT: ptrue p0.h
604 ; CHECK-2p2-NEXT: sxtb z0.h, p0/z, z2.h
605 ; CHECK-2p2-NEXT: ret
607 %pg = call <vscale x 8 x i1> @llvm.aarch64.sve.ptrue.nxv8i1(i32 31)
608 %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.sxtb.nxv8i16(<vscale x 8 x i16> %x, <vscale x 8 x i1> %pg, <vscale x 8 x i16> %y)
609 ret <vscale x 8 x i16> %0
612 define <vscale x 4 x i32> @test_svsxtb_nxv4i32_ptrue_u(double %z0, <vscale x 4 x i32> %x) {
613 ; CHECK-LABEL: test_svsxtb_nxv4i32_ptrue_u:
614 ; CHECK: // %bb.0: // %entry
615 ; CHECK-NEXT: ptrue p0.s
616 ; CHECK-NEXT: movprfx z0, z1
617 ; CHECK-NEXT: sxtb z0.s, p0/m, z1.s
620 ; CHECK-2p2-LABEL: test_svsxtb_nxv4i32_ptrue_u:
621 ; CHECK-2p2: // %bb.0: // %entry
622 ; CHECK-2p2-NEXT: ptrue p0.s
623 ; CHECK-2p2-NEXT: sxtb z0.s, p0/z, z1.s
624 ; CHECK-2p2-NEXT: ret
626 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
627 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.sxtb.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
628 ret <vscale x 4 x i32> %0
631 define <vscale x 4 x i32> @test_svsxtb_nxv4i32_ptrue(double %z0, <vscale x 4 x i32> %x, <vscale x 4 x i32> %y) {
632 ; CHECK-LABEL: test_svsxtb_nxv4i32_ptrue:
633 ; CHECK: // %bb.0: // %entry
634 ; CHECK-NEXT: ptrue p0.s
635 ; CHECK-NEXT: movprfx z0, z2
636 ; CHECK-NEXT: sxtb z0.s, p0/m, z2.s
639 ; CHECK-2p2-LABEL: test_svsxtb_nxv4i32_ptrue:
640 ; CHECK-2p2: // %bb.0: // %entry
641 ; CHECK-2p2-NEXT: ptrue p0.s
642 ; CHECK-2p2-NEXT: sxtb z0.s, p0/z, z2.s
643 ; CHECK-2p2-NEXT: ret
645 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
646 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.sxtb.nxv4i32(<vscale x 4 x i32> %x, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %y)
647 ret <vscale x 4 x i32> %0
650 define <vscale x 2 x i64> @test_svsxtb_nxv2i64_ptrue_u(double %z0, <vscale x 2 x i64> %x) {
651 ; CHECK-LABEL: test_svsxtb_nxv2i64_ptrue_u:
652 ; CHECK: // %bb.0: // %entry
653 ; CHECK-NEXT: ptrue p0.d
654 ; CHECK-NEXT: movprfx z0, z1
655 ; CHECK-NEXT: sxtb z0.d, p0/m, z1.d
658 ; CHECK-2p2-LABEL: test_svsxtb_nxv2i64_ptrue_u:
659 ; CHECK-2p2: // %bb.0: // %entry
660 ; CHECK-2p2-NEXT: ptrue p0.d
661 ; CHECK-2p2-NEXT: sxtb z0.d, p0/z, z1.d
662 ; CHECK-2p2-NEXT: ret
664 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
665 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxtb.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
666 ret <vscale x 2 x i64> %0
669 define <vscale x 2 x i64> @test_svsxtb_nxv2i64_ptrue(double %z0, <vscale x 2 x i64> %x, <vscale x 2 x i64> %y) {
670 ; CHECK-LABEL: test_svsxtb_nxv2i64_ptrue:
671 ; CHECK: // %bb.0: // %entry
672 ; CHECK-NEXT: ptrue p0.d
673 ; CHECK-NEXT: movprfx z0, z2
674 ; CHECK-NEXT: sxtb z0.d, p0/m, z2.d
677 ; CHECK-2p2-LABEL: test_svsxtb_nxv2i64_ptrue:
678 ; CHECK-2p2: // %bb.0: // %entry
679 ; CHECK-2p2-NEXT: ptrue p0.d
680 ; CHECK-2p2-NEXT: sxtb z0.d, p0/z, z2.d
681 ; CHECK-2p2-NEXT: ret
683 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
684 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxtb.nxv2i64(<vscale x 2 x i64> %x, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %y)
685 ret <vscale x 2 x i64> %0
688 define <vscale x 8 x i16> @test_svuxtb_nxv8i16_ptrue_u(double %z0, <vscale x 8 x i16> %x) {
689 ; CHECK-LABEL: test_svuxtb_nxv8i16_ptrue_u:
690 ; CHECK: // %bb.0: // %entry
691 ; CHECK-NEXT: ptrue p0.h
692 ; CHECK-NEXT: movprfx z0, z1
693 ; CHECK-NEXT: uxtb z0.h, p0/m, z1.h
696 ; CHECK-2p2-LABEL: test_svuxtb_nxv8i16_ptrue_u:
697 ; CHECK-2p2: // %bb.0: // %entry
698 ; CHECK-2p2-NEXT: ptrue p0.h
699 ; CHECK-2p2-NEXT: uxtb z0.h, p0/z, z1.h
700 ; CHECK-2p2-NEXT: ret
702 %pg = call <vscale x 8 x i1> @llvm.aarch64.sve.ptrue.nxv8i1(i32 31)
703 %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.uxtb.nxv8i16(<vscale x 8 x i16> poison, <vscale x 8 x i1> %pg, <vscale x 8 x i16> %x)
704 ret <vscale x 8 x i16> %0
707 define <vscale x 8 x i16> @test_svuxtb_nxv8i16_ptrue(double %z0, <vscale x 8 x i16> %x, <vscale x 8 x i16> %y) {
708 ; CHECK-LABEL: test_svuxtb_nxv8i16_ptrue:
709 ; CHECK: // %bb.0: // %entry
710 ; CHECK-NEXT: ptrue p0.h
711 ; CHECK-NEXT: movprfx z0, z2
712 ; CHECK-NEXT: uxtb z0.h, p0/m, z2.h
715 ; CHECK-2p2-LABEL: test_svuxtb_nxv8i16_ptrue:
716 ; CHECK-2p2: // %bb.0: // %entry
717 ; CHECK-2p2-NEXT: ptrue p0.h
718 ; CHECK-2p2-NEXT: uxtb z0.h, p0/z, z2.h
719 ; CHECK-2p2-NEXT: ret
721 %pg = call <vscale x 8 x i1> @llvm.aarch64.sve.ptrue.nxv8i1(i32 31)
722 %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.uxtb.nxv8i16(<vscale x 8 x i16> %x, <vscale x 8 x i1> %pg, <vscale x 8 x i16> %y)
723 ret <vscale x 8 x i16> %0
726 define <vscale x 4 x i32> @test_svuxtb_nxv4i32_ptrue_u(double %z0, <vscale x 4 x i32> %x) {
727 ; CHECK-LABEL: test_svuxtb_nxv4i32_ptrue_u:
728 ; CHECK: // %bb.0: // %entry
729 ; CHECK-NEXT: ptrue p0.s
730 ; CHECK-NEXT: movprfx z0, z1
731 ; CHECK-NEXT: uxtb z0.s, p0/m, z1.s
734 ; CHECK-2p2-LABEL: test_svuxtb_nxv4i32_ptrue_u:
735 ; CHECK-2p2: // %bb.0: // %entry
736 ; CHECK-2p2-NEXT: ptrue p0.s
737 ; CHECK-2p2-NEXT: uxtb z0.s, p0/z, z1.s
738 ; CHECK-2p2-NEXT: ret
740 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
741 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.uxtb.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
742 ret <vscale x 4 x i32> %0
745 define <vscale x 4 x i32> @test_svuxtb_nxv4i32_ptrue(double %z0, <vscale x 4 x i32> %x, <vscale x 4 x i32> %y) {
746 ; CHECK-LABEL: test_svuxtb_nxv4i32_ptrue:
747 ; CHECK: // %bb.0: // %entry
748 ; CHECK-NEXT: ptrue p0.s
749 ; CHECK-NEXT: movprfx z0, z2
750 ; CHECK-NEXT: uxtb z0.s, p0/m, z2.s
753 ; CHECK-2p2-LABEL: test_svuxtb_nxv4i32_ptrue:
754 ; CHECK-2p2: // %bb.0: // %entry
755 ; CHECK-2p2-NEXT: ptrue p0.s
756 ; CHECK-2p2-NEXT: uxtb z0.s, p0/z, z2.s
757 ; CHECK-2p2-NEXT: ret
759 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
760 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.uxtb.nxv4i32(<vscale x 4 x i32> %x, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %y)
761 ret <vscale x 4 x i32> %0
764 define <vscale x 2 x i64> @test_svuxtb_nxv2i64_ptrue_u(double %z0, <vscale x 2 x i64> %x) {
765 ; CHECK-LABEL: test_svuxtb_nxv2i64_ptrue_u:
766 ; CHECK: // %bb.0: // %entry
767 ; CHECK-NEXT: ptrue p0.d
768 ; CHECK-NEXT: movprfx z0, z1
769 ; CHECK-NEXT: uxtb z0.d, p0/m, z1.d
772 ; CHECK-2p2-LABEL: test_svuxtb_nxv2i64_ptrue_u:
773 ; CHECK-2p2: // %bb.0: // %entry
774 ; CHECK-2p2-NEXT: ptrue p0.d
775 ; CHECK-2p2-NEXT: uxtb z0.d, p0/z, z1.d
776 ; CHECK-2p2-NEXT: ret
778 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
779 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxtb.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
780 ret <vscale x 2 x i64> %0
783 define <vscale x 2 x i64> @test_svuxtb_nxv2i64_ptrue(double %z0, <vscale x 2 x i64> %x, <vscale x 2 x i64> %y) {
784 ; CHECK-LABEL: test_svuxtb_nxv2i64_ptrue:
785 ; CHECK: // %bb.0: // %entry
786 ; CHECK-NEXT: ptrue p0.d
787 ; CHECK-NEXT: movprfx z0, z2
788 ; CHECK-NEXT: uxtb z0.d, p0/m, z2.d
791 ; CHECK-2p2-LABEL: test_svuxtb_nxv2i64_ptrue:
792 ; CHECK-2p2: // %bb.0: // %entry
793 ; CHECK-2p2-NEXT: ptrue p0.d
794 ; CHECK-2p2-NEXT: uxtb z0.d, p0/z, z2.d
795 ; CHECK-2p2-NEXT: ret
797 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
798 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxtb.nxv2i64(<vscale x 2 x i64> %x, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %y)
799 ret <vscale x 2 x i64> %0
802 define <vscale x 4 x i32> @test_svsxth_nxv4i32_ptrue_u(double %z0, <vscale x 4 x i32> %x) {
803 ; CHECK-LABEL: test_svsxth_nxv4i32_ptrue_u:
804 ; CHECK: // %bb.0: // %entry
805 ; CHECK-NEXT: ptrue p0.s
806 ; CHECK-NEXT: movprfx z0, z1
807 ; CHECK-NEXT: sxth z0.s, p0/m, z1.s
810 ; CHECK-2p2-LABEL: test_svsxth_nxv4i32_ptrue_u:
811 ; CHECK-2p2: // %bb.0: // %entry
812 ; CHECK-2p2-NEXT: ptrue p0.s
813 ; CHECK-2p2-NEXT: sxth z0.s, p0/z, z1.s
814 ; CHECK-2p2-NEXT: ret
816 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
817 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.sxth.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
818 ret <vscale x 4 x i32> %0
821 define <vscale x 4 x i32> @test_svsxth_nxv4i32_ptrue(double %z0, <vscale x 4 x i32> %x, <vscale x 4 x i32> %y) {
822 ; CHECK-LABEL: test_svsxth_nxv4i32_ptrue:
823 ; CHECK: // %bb.0: // %entry
824 ; CHECK-NEXT: ptrue p0.s
825 ; CHECK-NEXT: movprfx z0, z2
826 ; CHECK-NEXT: sxth z0.s, p0/m, z2.s
829 ; CHECK-2p2-LABEL: test_svsxth_nxv4i32_ptrue:
830 ; CHECK-2p2: // %bb.0: // %entry
831 ; CHECK-2p2-NEXT: ptrue p0.s
832 ; CHECK-2p2-NEXT: sxth z0.s, p0/z, z2.s
833 ; CHECK-2p2-NEXT: ret
835 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
836 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.sxth.nxv4i32(<vscale x 4 x i32> %x, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %y)
837 ret <vscale x 4 x i32> %0
840 define <vscale x 2 x i64> @test_svsxth_nxv2i64_ptrue_u(double %z0, <vscale x 2 x i64> %x) {
841 ; CHECK-LABEL: test_svsxth_nxv2i64_ptrue_u:
842 ; CHECK: // %bb.0: // %entry
843 ; CHECK-NEXT: ptrue p0.d
844 ; CHECK-NEXT: movprfx z0, z1
845 ; CHECK-NEXT: sxth z0.d, p0/m, z1.d
848 ; CHECK-2p2-LABEL: test_svsxth_nxv2i64_ptrue_u:
849 ; CHECK-2p2: // %bb.0: // %entry
850 ; CHECK-2p2-NEXT: ptrue p0.d
851 ; CHECK-2p2-NEXT: sxth z0.d, p0/z, z1.d
852 ; CHECK-2p2-NEXT: ret
854 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
855 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxth.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
856 ret <vscale x 2 x i64> %0
859 define <vscale x 2 x i64> @test_svsxth_nxv2i64_ptrue(double %z0, <vscale x 2 x i64> %x, <vscale x 2 x i64> %y) {
860 ; CHECK-LABEL: test_svsxth_nxv2i64_ptrue:
861 ; CHECK: // %bb.0: // %entry
862 ; CHECK-NEXT: ptrue p0.d
863 ; CHECK-NEXT: movprfx z0, z2
864 ; CHECK-NEXT: sxth z0.d, p0/m, z2.d
867 ; CHECK-2p2-LABEL: test_svsxth_nxv2i64_ptrue:
868 ; CHECK-2p2: // %bb.0: // %entry
869 ; CHECK-2p2-NEXT: ptrue p0.d
870 ; CHECK-2p2-NEXT: sxth z0.d, p0/z, z2.d
871 ; CHECK-2p2-NEXT: ret
873 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
874 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxth.nxv2i64(<vscale x 2 x i64> %x, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %y)
875 ret <vscale x 2 x i64> %0
878 define <vscale x 4 x i32> @test_svuxth_nxv4i32_ptrue_u(double %z0, <vscale x 4 x i32> %x) {
879 ; CHECK-LABEL: test_svuxth_nxv4i32_ptrue_u:
880 ; CHECK: // %bb.0: // %entry
881 ; CHECK-NEXT: ptrue p0.s
882 ; CHECK-NEXT: movprfx z0, z1
883 ; CHECK-NEXT: uxth z0.s, p0/m, z1.s
886 ; CHECK-2p2-LABEL: test_svuxth_nxv4i32_ptrue_u:
887 ; CHECK-2p2: // %bb.0: // %entry
888 ; CHECK-2p2-NEXT: ptrue p0.s
889 ; CHECK-2p2-NEXT: uxth z0.s, p0/z, z1.s
890 ; CHECK-2p2-NEXT: ret
892 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
893 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.uxth.nxv4i32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %x)
894 ret <vscale x 4 x i32> %0
897 define <vscale x 4 x i32> @test_svuxth_nxv4i32_ptrue(double %z0, <vscale x 4 x i32> %x, <vscale x 4 x i32> %y) {
898 ; CHECK-LABEL: test_svuxth_nxv4i32_ptrue:
899 ; CHECK: // %bb.0: // %entry
900 ; CHECK-NEXT: ptrue p0.s
901 ; CHECK-NEXT: movprfx z0, z2
902 ; CHECK-NEXT: uxth z0.s, p0/m, z2.s
905 ; CHECK-2p2-LABEL: test_svuxth_nxv4i32_ptrue:
906 ; CHECK-2p2: // %bb.0: // %entry
907 ; CHECK-2p2-NEXT: ptrue p0.s
908 ; CHECK-2p2-NEXT: uxth z0.s, p0/z, z2.s
909 ; CHECK-2p2-NEXT: ret
911 %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
912 %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.uxth.nxv4i32(<vscale x 4 x i32> %x, <vscale x 4 x i1> %pg, <vscale x 4 x i32> %y)
913 ret <vscale x 4 x i32> %0
916 define <vscale x 2 x i64> @test_svuxth_nxv2i64_ptrue_u(double %z0, <vscale x 2 x i64> %x) {
917 ; CHECK-LABEL: test_svuxth_nxv2i64_ptrue_u:
918 ; CHECK: // %bb.0: // %entry
919 ; CHECK-NEXT: ptrue p0.d
920 ; CHECK-NEXT: movprfx z0, z1
921 ; CHECK-NEXT: uxth z0.d, p0/m, z1.d
924 ; CHECK-2p2-LABEL: test_svuxth_nxv2i64_ptrue_u:
925 ; CHECK-2p2: // %bb.0: // %entry
926 ; CHECK-2p2-NEXT: ptrue p0.d
927 ; CHECK-2p2-NEXT: uxth z0.d, p0/z, z1.d
928 ; CHECK-2p2-NEXT: ret
930 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
931 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxth.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
932 ret <vscale x 2 x i64> %0
935 define <vscale x 2 x i64> @test_svuxth_nxv2i64_ptrue(double %z0, <vscale x 2 x i64> %x, <vscale x 2 x i64> %y) {
936 ; CHECK-LABEL: test_svuxth_nxv2i64_ptrue:
937 ; CHECK: // %bb.0: // %entry
938 ; CHECK-NEXT: ptrue p0.d
939 ; CHECK-NEXT: movprfx z0, z2
940 ; CHECK-NEXT: uxth z0.d, p0/m, z2.d
943 ; CHECK-2p2-LABEL: test_svuxth_nxv2i64_ptrue:
944 ; CHECK-2p2: // %bb.0: // %entry
945 ; CHECK-2p2-NEXT: ptrue p0.d
946 ; CHECK-2p2-NEXT: uxth z0.d, p0/z, z2.d
947 ; CHECK-2p2-NEXT: ret
949 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
950 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxth.nxv2i64(<vscale x 2 x i64> %x, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %y)
951 ret <vscale x 2 x i64> %0
954 define <vscale x 2 x i64> @test_svsxtw_nxv2i64_ptrue_u(double %z0, <vscale x 2 x i64> %x) {
955 ; CHECK-LABEL: test_svsxtw_nxv2i64_ptrue_u:
956 ; CHECK: // %bb.0: // %entry
957 ; CHECK-NEXT: ptrue p0.d
958 ; CHECK-NEXT: movprfx z0, z1
959 ; CHECK-NEXT: sxtw z0.d, p0/m, z1.d
962 ; CHECK-2p2-LABEL: test_svsxtw_nxv2i64_ptrue_u:
963 ; CHECK-2p2: // %bb.0: // %entry
964 ; CHECK-2p2-NEXT: ptrue p0.d
965 ; CHECK-2p2-NEXT: sxtw z0.d, p0/z, z1.d
966 ; CHECK-2p2-NEXT: ret
968 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
969 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxtw.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
970 ret <vscale x 2 x i64> %0
973 define <vscale x 2 x i64> @test_svsxtw_nxv2i64_ptrue(double %z0, <vscale x 2 x i64> %x, <vscale x 2 x i64> %y) {
974 ; CHECK-LABEL: test_svsxtw_nxv2i64_ptrue:
975 ; CHECK: // %bb.0: // %entry
976 ; CHECK-NEXT: ptrue p0.d
977 ; CHECK-NEXT: movprfx z0, z2
978 ; CHECK-NEXT: sxtw z0.d, p0/m, z2.d
981 ; CHECK-2p2-LABEL: test_svsxtw_nxv2i64_ptrue:
982 ; CHECK-2p2: // %bb.0: // %entry
983 ; CHECK-2p2-NEXT: ptrue p0.d
984 ; CHECK-2p2-NEXT: sxtw z0.d, p0/z, z2.d
985 ; CHECK-2p2-NEXT: ret
987 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
988 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.sxtw.nxv2i64(<vscale x 2 x i64> %x, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %y)
989 ret <vscale x 2 x i64> %0
992 define <vscale x 2 x i64> @test_svuxtw_nxv2i64_ptrue_u(double %z0, <vscale x 2 x i64> %x) {
993 ; CHECK-LABEL: test_svuxtw_nxv2i64_ptrue_u:
994 ; CHECK: // %bb.0: // %entry
995 ; CHECK-NEXT: ptrue p0.d
996 ; CHECK-NEXT: movprfx z0, z1
997 ; CHECK-NEXT: uxtw z0.d, p0/m, z1.d
1000 ; CHECK-2p2-LABEL: test_svuxtw_nxv2i64_ptrue_u:
1001 ; CHECK-2p2: // %bb.0: // %entry
1002 ; CHECK-2p2-NEXT: ptrue p0.d
1003 ; CHECK-2p2-NEXT: uxtw z0.d, p0/z, z1.d
1004 ; CHECK-2p2-NEXT: ret
1006 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
1007 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxtw.nxv2i64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %x)
1008 ret <vscale x 2 x i64> %0
1011 define <vscale x 2 x i64> @test_svuxtw_nxv2i64_ptrue(double %z0, <vscale x 2 x i64> %x, <vscale x 2 x i64> %y) {
1012 ; CHECK-LABEL: test_svuxtw_nxv2i64_ptrue:
1013 ; CHECK: // %bb.0: // %entry
1014 ; CHECK-NEXT: ptrue p0.d
1015 ; CHECK-NEXT: movprfx z0, z2
1016 ; CHECK-NEXT: uxtw z0.d, p0/m, z2.d
1019 ; CHECK-2p2-LABEL: test_svuxtw_nxv2i64_ptrue:
1020 ; CHECK-2p2: // %bb.0: // %entry
1021 ; CHECK-2p2-NEXT: ptrue p0.d
1022 ; CHECK-2p2-NEXT: uxtw z0.d, p0/z, z2.d
1023 ; CHECK-2p2-NEXT: ret
1025 %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
1026 %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.uxtw.nxv2i64(<vscale x 2 x i64> %x, <vscale x 2 x i1> %pg, <vscale x 2 x i64> %y)
1027 ret <vscale x 2 x i64> %0