[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / zeroing-forms-ext.ll
blobb29805c2b8f05a990c4187ace86ed05195a2deb9
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
14 ; CHECK-NEXT:    ret
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
19 ; CHECK-2p2-NEXT:    ret
20 entry:
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
30 ; CHECK-NEXT:    ret
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
35 ; CHECK-2p2-NEXT:    ret
36 entry:
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
46 ; CHECK-NEXT:    ret
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
51 ; CHECK-2p2-NEXT:    ret
52 entry:
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
61 ; CHECK-NEXT:    ret
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
66 ; CHECK-2p2-NEXT:    ret
67 entry:
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
77 ; CHECK-NEXT:    ret
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
82 ; CHECK-2p2-NEXT:    ret
83 entry:
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
93 ; CHECK-NEXT:    ret
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
98 ; CHECK-2p2-NEXT:    ret
99 entry:
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
108 ; CHECK-NEXT:    ret
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
114 entry:
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
124 ; CHECK-NEXT:    ret
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
130 entry:
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
140 ; CHECK-NEXT:    ret
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
146 entry:
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
155 ; CHECK-NEXT:    ret
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
161 entry:
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
171 ; CHECK-NEXT:    ret
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
177 entry:
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
187 ; CHECK-NEXT:    ret
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
193 entry:
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
202 ; CHECK-NEXT:    ret
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
208 entry:
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
218 ; CHECK-NEXT:    ret
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
224 entry:
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
234 ; CHECK-NEXT:    ret
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
240 entry:
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
249 ; CHECK-NEXT:    ret
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
255 entry:
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
265 ; CHECK-NEXT:    ret
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
271 entry:
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
281 ; CHECK-NEXT:    ret
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
287 entry:
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
296 ; CHECK-NEXT:    ret
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
302 entry:
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
312 ; CHECK-NEXT:    ret
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
318 entry:
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
328 ; CHECK-NEXT:    ret
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
334 entry:
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
343 ; CHECK-NEXT:    ret
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
349 entry:
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
359 ; CHECK-NEXT:    ret
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
365 entry:
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
375 ; CHECK-NEXT:    ret
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
381 entry:
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
390 ; CHECK-NEXT:    ret
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
396 entry:
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
406 ; CHECK-NEXT:    ret
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
412 entry:
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
422 ; CHECK-NEXT:    ret
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
428 entry:
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
437 ; CHECK-NEXT:    ret
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
443 entry:
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
453 ; CHECK-NEXT:    ret
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
459 entry:
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
469 ; CHECK-NEXT:    ret
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
475 entry:
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
484 ; CHECK-NEXT:    ret
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
490 entry:
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
500 ; CHECK-NEXT:    ret
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
506 entry:
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
516 ; CHECK-NEXT:    ret
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
522 entry:
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
531 ; CHECK-NEXT:    ret
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
537 entry:
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
547 ; CHECK-NEXT:    ret
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
553 entry:
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
563 ; CHECK-NEXT:    ret
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
569 entry:
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
580 ; CHECK-NEXT:    ret
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
587 entry:
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
599 ; CHECK-NEXT:    ret
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
606 entry:
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
618 ; CHECK-NEXT:    ret
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
625 entry:
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
637 ; CHECK-NEXT:    ret
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
644 entry:
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
656 ; CHECK-NEXT:    ret
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
663 entry:
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
675 ; CHECK-NEXT:    ret
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
682 entry:
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
694 ; CHECK-NEXT:    ret
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
701 entry:
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
713 ; CHECK-NEXT:    ret
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
720 entry:
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
732 ; CHECK-NEXT:    ret
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
739 entry:
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
751 ; CHECK-NEXT:    ret
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
758 entry:
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
770 ; CHECK-NEXT:    ret
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
777 entry:
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
789 ; CHECK-NEXT:    ret
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
796 entry:
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
808 ; CHECK-NEXT:    ret
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
815 entry:
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
827 ; CHECK-NEXT:    ret
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
834 entry:
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
846 ; CHECK-NEXT:    ret
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
853 entry:
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
865 ; CHECK-NEXT:    ret
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
872 entry:
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
884 ; CHECK-NEXT:    ret
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
891 entry:
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
903 ; CHECK-NEXT:    ret
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
910 entry:
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
922 ; CHECK-NEXT:    ret
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
929 entry:
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
941 ; CHECK-NEXT:    ret
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
948 entry:
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
960 ; CHECK-NEXT:    ret
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
967 entry:
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
979 ; CHECK-NEXT:    ret
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
986 entry:
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
998 ; CHECK-NEXT:    ret
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
1005 entry:
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
1017 ; CHECK-NEXT:    ret
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
1024 entry:
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