[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sme2-intrinsics-rshl.ll
blobd138a3af438524d61d3fa44669ffe9c6be59d578
1 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 -verify-machineinstrs < %s | FileCheck %s
3 ; SRSHL (Single, x2)
5 define { <vscale x 16 x i8>, <vscale x 16 x i8> } @multi_vec_rounding_shl_single_x2_s8(<vscale x 16 x i8> %dummy, <vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zm) {
6 ; CHECK-LABEL: multi_vec_rounding_shl_single_x2_s8:
7 ; CHECK:       // %bb.0:
8 ; CHECK-NEXT:    mov z5.d, z2.d
9 ; CHECK-NEXT:    mov z4.d, z1.d
10 ; CHECK-NEXT:    srshl { z4.b, z5.b }, { z4.b, z5.b }, z3.b
11 ; CHECK-NEXT:    mov z0.d, z4.d
12 ; CHECK-NEXT:    mov z1.d, z5.d
13 ; CHECK-NEXT:    ret
14   %res = call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.srshl.single.x2.nxv16i8(<vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zm)
15   ret { <vscale x 16 x i8>, <vscale x 16 x i8> } %res
18 define { <vscale x 8 x i16>, <vscale x 8 x i16> } @multi_vec_rounding_shl_single_x2_s16(<vscale x 8 x i16> %dummy, <vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zm) {
19 ; CHECK-LABEL: multi_vec_rounding_shl_single_x2_s16:
20 ; CHECK:       // %bb.0:
21 ; CHECK-NEXT:    mov z5.d, z2.d
22 ; CHECK-NEXT:    mov z4.d, z1.d
23 ; CHECK-NEXT:    srshl { z4.h, z5.h }, { z4.h, z5.h }, z3.h
24 ; CHECK-NEXT:    mov z0.d, z4.d
25 ; CHECK-NEXT:    mov z1.d, z5.d
26 ; CHECK-NEXT:    ret
27   %res = call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.srshl.single.x2.nxv8i16(<vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zm)
28   ret { <vscale x 8 x i16>, <vscale x 8 x i16> } %res
31 define { <vscale x 4 x i32>, <vscale x 4 x i32> } @multi_vec_rounding_shl_single_x2_s32(<vscale x 4 x i32> %dummy, <vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zm) {
32 ; CHECK-LABEL: multi_vec_rounding_shl_single_x2_s32:
33 ; CHECK:       // %bb.0:
34 ; CHECK-NEXT:    mov z5.d, z2.d
35 ; CHECK-NEXT:    mov z4.d, z1.d
36 ; CHECK-NEXT:    srshl { z4.s, z5.s }, { z4.s, z5.s }, z3.s
37 ; CHECK-NEXT:    mov z0.d, z4.d
38 ; CHECK-NEXT:    mov z1.d, z5.d
39 ; CHECK-NEXT:    ret
40   %res = call { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.aarch64.sve.srshl.single.x2.nxv4i32(<vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zm)
41   ret { <vscale x 4 x i32>, <vscale x 4 x i32> } %res
44 define { <vscale x 2 x i64>, <vscale x 2 x i64> } @multi_vec_rounding_shl_single_x2_s64(<vscale x 2 x i64> %dummy, <vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zm) {
45 ; CHECK-LABEL: multi_vec_rounding_shl_single_x2_s64:
46 ; CHECK:       // %bb.0:
47 ; CHECK-NEXT:    mov z5.d, z2.d
48 ; CHECK-NEXT:    mov z4.d, z1.d
49 ; CHECK-NEXT:    srshl { z4.d, z5.d }, { z4.d, z5.d }, z3.d
50 ; CHECK-NEXT:    mov z0.d, z4.d
51 ; CHECK-NEXT:    mov z1.d, z5.d
52 ; CHECK-NEXT:    ret
53   %res = call { <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.aarch64.sve.srshl.single.x2.nxv2i64(<vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zm)
54   ret { <vscale x 2 x i64>, <vscale x 2 x i64> } %res
57 ; SRSHL (Single, x4)
59 define { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> }
60 @multi_vec_rounding_shl_single_x4_s8(<vscale x 16 x i8> %dummy, <vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zdn3, <vscale x 16 x i8> %zdn4, <vscale x 16 x i8> %zm) {
61 ; CHECK-LABEL: multi_vec_rounding_shl_single_x4_s8:
62 ; CHECK:       // %bb.0:
63 ; CHECK-NEXT:    mov z27.d, z4.d
64 ; CHECK-NEXT:    mov z26.d, z3.d
65 ; CHECK-NEXT:    mov z25.d, z2.d
66 ; CHECK-NEXT:    mov z24.d, z1.d
67 ; CHECK-NEXT:    srshl { z24.b - z27.b }, { z24.b - z27.b }, z5.b
68 ; CHECK-NEXT:    mov z0.d, z24.d
69 ; CHECK-NEXT:    mov z1.d, z25.d
70 ; CHECK-NEXT:    mov z2.d, z26.d
71 ; CHECK-NEXT:    mov z3.d, z27.d
72 ; CHECK-NEXT:    ret
73   %res = call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> }
74               @llvm.aarch64.sve.srshl.single.x4.nxv16i8(<vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zdn3, <vscale x 16 x i8> %zdn4, <vscale x 16 x i8> %zm)
75   ret { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %res
78 define { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> }
79 @multi_vec_rounding_shl_single_x4_s16(<vscale x 8 x i16> %dummy, <vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zdn3, <vscale x 8 x i16> %zdn4, <vscale x 8 x i16> %zm) {
80 ; CHECK-LABEL: multi_vec_rounding_shl_single_x4_s16:
81 ; CHECK:       // %bb.0:
82 ; CHECK-NEXT:    mov z27.d, z4.d
83 ; CHECK-NEXT:    mov z26.d, z3.d
84 ; CHECK-NEXT:    mov z25.d, z2.d
85 ; CHECK-NEXT:    mov z24.d, z1.d
86 ; CHECK-NEXT:    srshl { z24.h - z27.h }, { z24.h - z27.h }, z5.h
87 ; CHECK-NEXT:    mov z0.d, z24.d
88 ; CHECK-NEXT:    mov z1.d, z25.d
89 ; CHECK-NEXT:    mov z2.d, z26.d
90 ; CHECK-NEXT:    mov z3.d, z27.d
91 ; CHECK-NEXT:    ret
92   %res = call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> }
93               @llvm.aarch64.sve.srshl.single.x4.nxv8i16(<vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zdn3, <vscale x 8 x i16> %zdn4, <vscale x 8 x i16> %zm)
94   ret { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %res
97 define { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> }
98 @multi_vec_rounding_shl_single_x4_s32(<vscale x 4 x i32> %dummy, <vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zdn3, <vscale x 4 x i32> %zdn4, <vscale x 4 x i32> %zm) {
99 ; CHECK-LABEL: multi_vec_rounding_shl_single_x4_s32:
100 ; CHECK:       // %bb.0:
101 ; CHECK-NEXT:    mov z27.d, z4.d
102 ; CHECK-NEXT:    mov z26.d, z3.d
103 ; CHECK-NEXT:    mov z25.d, z2.d
104 ; CHECK-NEXT:    mov z24.d, z1.d
105 ; CHECK-NEXT:    srshl { z24.s - z27.s }, { z24.s - z27.s }, z5.s
106 ; CHECK-NEXT:    mov z0.d, z24.d
107 ; CHECK-NEXT:    mov z1.d, z25.d
108 ; CHECK-NEXT:    mov z2.d, z26.d
109 ; CHECK-NEXT:    mov z3.d, z27.d
110 ; CHECK-NEXT:    ret
111   %res = call { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> }
112               @llvm.aarch64.sve.srshl.single.x4.nxv4i32(<vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zdn3, <vscale x 4 x i32> %zdn4, <vscale x 4 x i32> %zm)
113   ret { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> } %res
116 define { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> }
117 @multi_vec_rounding_shl_single_x4_s64(<vscale x 2 x i64> %dummy, <vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zdn3, <vscale x 2 x i64> %zdn4, <vscale x 2 x i64> %zm) {
118 ; CHECK-LABEL: multi_vec_rounding_shl_single_x4_s64:
119 ; CHECK:       // %bb.0:
120 ; CHECK-NEXT:    mov z27.d, z4.d
121 ; CHECK-NEXT:    mov z26.d, z3.d
122 ; CHECK-NEXT:    mov z25.d, z2.d
123 ; CHECK-NEXT:    mov z24.d, z1.d
124 ; CHECK-NEXT:    srshl { z24.d - z27.d }, { z24.d - z27.d }, z5.d
125 ; CHECK-NEXT:    mov z0.d, z24.d
126 ; CHECK-NEXT:    mov z1.d, z25.d
127 ; CHECK-NEXT:    mov z2.d, z26.d
128 ; CHECK-NEXT:    mov z3.d, z27.d
129 ; CHECK-NEXT:    ret
130   %res = call { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> }
131               @llvm.aarch64.sve.srshl.single.x4.nxv2i64(<vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zdn3, <vscale x 2 x i64> %zdn4, <vscale x 2 x i64> %zm)
132   ret { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } %res
135 ; URSHL (Single, x2)
137 define { <vscale x 16 x i8>, <vscale x 16 x i8> } @multi_vec_rounding_shl_single_x2_u8(<vscale x 16 x i8> %dummy, <vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zm) {
138 ; CHECK-LABEL: multi_vec_rounding_shl_single_x2_u8:
139 ; CHECK:       // %bb.0:
140 ; CHECK-NEXT:    mov z5.d, z2.d
141 ; CHECK-NEXT:    mov z4.d, z1.d
142 ; CHECK-NEXT:    urshl { z4.b, z5.b }, { z4.b, z5.b }, z3.b
143 ; CHECK-NEXT:    mov z0.d, z4.d
144 ; CHECK-NEXT:    mov z1.d, z5.d
145 ; CHECK-NEXT:    ret
146   %res = call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.urshl.single.x2.nxv16i8(<vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zm)
147   ret { <vscale x 16 x i8>, <vscale x 16 x i8> } %res
150 define { <vscale x 8 x i16>, <vscale x 8 x i16> } @multi_vec_rounding_shl_single_x2_u16(<vscale x 8 x i16> %dummy, <vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zm) {
151 ; CHECK-LABEL: multi_vec_rounding_shl_single_x2_u16:
152 ; CHECK:       // %bb.0:
153 ; CHECK-NEXT:    mov z5.d, z2.d
154 ; CHECK-NEXT:    mov z4.d, z1.d
155 ; CHECK-NEXT:    urshl { z4.h, z5.h }, { z4.h, z5.h }, z3.h
156 ; CHECK-NEXT:    mov z0.d, z4.d
157 ; CHECK-NEXT:    mov z1.d, z5.d
158 ; CHECK-NEXT:    ret
159   %res = call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.urshl.single.x2.nxv8i16(<vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zm)
160   ret { <vscale x 8 x i16>, <vscale x 8 x i16> } %res
163 define { <vscale x 4 x i32>, <vscale x 4 x i32> } @multi_vec_rounding_shl_single_x2_u32(<vscale x 4 x i32> %dummy, <vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zm) {
164 ; CHECK-LABEL: multi_vec_rounding_shl_single_x2_u32:
165 ; CHECK:       // %bb.0:
166 ; CHECK-NEXT:    mov z5.d, z2.d
167 ; CHECK-NEXT:    mov z4.d, z1.d
168 ; CHECK-NEXT:    urshl { z4.s, z5.s }, { z4.s, z5.s }, z3.s
169 ; CHECK-NEXT:    mov z0.d, z4.d
170 ; CHECK-NEXT:    mov z1.d, z5.d
171 ; CHECK-NEXT:    ret
172   %res = call { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.aarch64.sve.urshl.single.x2.nxv4i32(<vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zm)
173   ret { <vscale x 4 x i32>, <vscale x 4 x i32> } %res
176 define { <vscale x 2 x i64>, <vscale x 2 x i64> } @multi_vec_rounding_shl_single_x2_u64(<vscale x 2 x i64> %dummy, <vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zm) {
177 ; CHECK-LABEL: multi_vec_rounding_shl_single_x2_u64:
178 ; CHECK:       // %bb.0:
179 ; CHECK-NEXT:    mov z5.d, z2.d
180 ; CHECK-NEXT:    mov z4.d, z1.d
181 ; CHECK-NEXT:    urshl { z4.d, z5.d }, { z4.d, z5.d }, z3.d
182 ; CHECK-NEXT:    mov z0.d, z4.d
183 ; CHECK-NEXT:    mov z1.d, z5.d
184 ; CHECK-NEXT:    ret
185   %res = call { <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.aarch64.sve.urshl.single.x2.nxv2i64(<vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zm)
186   ret { <vscale x 2 x i64>, <vscale x 2 x i64> } %res
189 ; URSHL (Single, x4)
191 define { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> }
192 @multi_vec_rounding_shl_single_x4_u8(<vscale x 16 x i8> %dummy, <vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zdn3, <vscale x 16 x i8> %zdn4, <vscale x 16 x i8> %zm) {
193 ; CHECK-LABEL: multi_vec_rounding_shl_single_x4_u8:
194 ; CHECK:       // %bb.0:
195 ; CHECK-NEXT:    mov z27.d, z4.d
196 ; CHECK-NEXT:    mov z26.d, z3.d
197 ; CHECK-NEXT:    mov z25.d, z2.d
198 ; CHECK-NEXT:    mov z24.d, z1.d
199 ; CHECK-NEXT:    urshl { z24.b - z27.b }, { z24.b - z27.b }, z5.b
200 ; CHECK-NEXT:    mov z0.d, z24.d
201 ; CHECK-NEXT:    mov z1.d, z25.d
202 ; CHECK-NEXT:    mov z2.d, z26.d
203 ; CHECK-NEXT:    mov z3.d, z27.d
204 ; CHECK-NEXT:    ret
205   %res = call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> }
206               @llvm.aarch64.sve.urshl.single.x4.nxv16i8(<vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zdn3, <vscale x 16 x i8> %zdn4, <vscale x 16 x i8> %zm)
207   ret { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %res
210 define { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> }
211 @multi_vec_rounding_shl_single_x4_u16(<vscale x 8 x i16> %dummy, <vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zdn3, <vscale x 8 x i16> %zdn4, <vscale x 8 x i16> %zm) {
212 ; CHECK-LABEL: multi_vec_rounding_shl_single_x4_u16:
213 ; CHECK:       // %bb.0:
214 ; CHECK-NEXT:    mov z27.d, z4.d
215 ; CHECK-NEXT:    mov z26.d, z3.d
216 ; CHECK-NEXT:    mov z25.d, z2.d
217 ; CHECK-NEXT:    mov z24.d, z1.d
218 ; CHECK-NEXT:    urshl { z24.h - z27.h }, { z24.h - z27.h }, z5.h
219 ; CHECK-NEXT:    mov z0.d, z24.d
220 ; CHECK-NEXT:    mov z1.d, z25.d
221 ; CHECK-NEXT:    mov z2.d, z26.d
222 ; CHECK-NEXT:    mov z3.d, z27.d
223 ; CHECK-NEXT:    ret
224   %res = call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> }
225               @llvm.aarch64.sve.urshl.single.x4.nxv8i16(<vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zdn3, <vscale x 8 x i16> %zdn4, <vscale x 8 x i16> %zm)
226   ret { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %res
229 define { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> }
230 @multi_vec_rounding_shl_single_x4_u32(<vscale x 4 x i32> %dummy, <vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zdn3, <vscale x 4 x i32> %zdn4, <vscale x 4 x i32> %zm) {
231 ; CHECK-LABEL: multi_vec_rounding_shl_single_x4_u32:
232 ; CHECK:       // %bb.0:
233 ; CHECK-NEXT:    mov z27.d, z4.d
234 ; CHECK-NEXT:    mov z26.d, z3.d
235 ; CHECK-NEXT:    mov z25.d, z2.d
236 ; CHECK-NEXT:    mov z24.d, z1.d
237 ; CHECK-NEXT:    urshl { z24.s - z27.s }, { z24.s - z27.s }, z5.s
238 ; CHECK-NEXT:    mov z0.d, z24.d
239 ; CHECK-NEXT:    mov z1.d, z25.d
240 ; CHECK-NEXT:    mov z2.d, z26.d
241 ; CHECK-NEXT:    mov z3.d, z27.d
242 ; CHECK-NEXT:    ret
243   %res = call { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> }
244               @llvm.aarch64.sve.urshl.single.x4.nxv4i32(<vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zdn3, <vscale x 4 x i32> %zdn4, <vscale x 4 x i32> %zm)
245   ret { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> } %res
248 define { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> }
249 @multi_vec_rounding_shl_single_x4_u64(<vscale x 2 x i64> %dummy, <vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zdn3, <vscale x 2 x i64> %zdn4, <vscale x 2 x i64> %zm) {
250 ; CHECK-LABEL: multi_vec_rounding_shl_single_x4_u64:
251 ; CHECK:       // %bb.0:
252 ; CHECK-NEXT:    mov z27.d, z4.d
253 ; CHECK-NEXT:    mov z26.d, z3.d
254 ; CHECK-NEXT:    mov z25.d, z2.d
255 ; CHECK-NEXT:    mov z24.d, z1.d
256 ; CHECK-NEXT:    urshl { z24.d - z27.d }, { z24.d - z27.d }, z5.d
257 ; CHECK-NEXT:    mov z0.d, z24.d
258 ; CHECK-NEXT:    mov z1.d, z25.d
259 ; CHECK-NEXT:    mov z2.d, z26.d
260 ; CHECK-NEXT:    mov z3.d, z27.d
261 ; CHECK-NEXT:    ret
262   %res = call { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> }
263               @llvm.aarch64.sve.urshl.single.x4.nxv2i64(<vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zdn3, <vscale x 2 x i64> %zdn4, <vscale x 2 x i64> %zm)
264   ret { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } %res
267 ; SRSHL (Multi, x2)
269 define { <vscale x 16 x i8>, <vscale x 16 x i8> } @multi_vec_rounding_shl_x2_s8(<vscale x 16 x i8> %dummy, <vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2) {
270 ; CHECK-LABEL: multi_vec_rounding_shl_x2_s8:
271 ; CHECK:       // %bb.0:
272 ; CHECK-NEXT:    mov z7.d, z4.d
273 ; CHECK-NEXT:    mov z5.d, z2.d
274 ; CHECK-NEXT:    mov z6.d, z3.d
275 ; CHECK-NEXT:    mov z4.d, z1.d
276 ; CHECK-NEXT:    srshl { z4.b, z5.b }, { z4.b, z5.b }, { z6.b, z7.b }
277 ; CHECK-NEXT:    mov z0.d, z4.d
278 ; CHECK-NEXT:    mov z1.d, z5.d
279 ; CHECK-NEXT:    ret
280   %res = call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.srshl.x2.nxv16i8(<vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2)
281   ret { <vscale x 16 x i8>, <vscale x 16 x i8> } %res
284 define { <vscale x 8 x i16>, <vscale x 8 x i16> } @multi_vec_rounding_shl_x2_s16(<vscale x 8 x i16> %dummy, <vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) {
285 ; CHECK-LABEL: multi_vec_rounding_shl_x2_s16:
286 ; CHECK:       // %bb.0:
287 ; CHECK-NEXT:    mov z7.d, z4.d
288 ; CHECK-NEXT:    mov z5.d, z2.d
289 ; CHECK-NEXT:    mov z6.d, z3.d
290 ; CHECK-NEXT:    mov z4.d, z1.d
291 ; CHECK-NEXT:    srshl { z4.h, z5.h }, { z4.h, z5.h }, { z6.h, z7.h }
292 ; CHECK-NEXT:    mov z0.d, z4.d
293 ; CHECK-NEXT:    mov z1.d, z5.d
294 ; CHECK-NEXT:    ret
295   %res = call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.srshl.x2.nxv8i16(<vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)
296   ret { <vscale x 8 x i16>, <vscale x 8 x i16> } %res
299 define { <vscale x 4 x i32>, <vscale x 4 x i32> } @multi_vec_rounding_shl_x2_s32(<vscale x 4 x i32> %dummy, <vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zm1, <vscale x 4 x i32> %zm2) {
300 ; CHECK-LABEL: multi_vec_rounding_shl_x2_s32:
301 ; CHECK:       // %bb.0:
302 ; CHECK-NEXT:    mov z7.d, z4.d
303 ; CHECK-NEXT:    mov z5.d, z2.d
304 ; CHECK-NEXT:    mov z6.d, z3.d
305 ; CHECK-NEXT:    mov z4.d, z1.d
306 ; CHECK-NEXT:    srshl { z4.s, z5.s }, { z4.s, z5.s }, { z6.s, z7.s }
307 ; CHECK-NEXT:    mov z0.d, z4.d
308 ; CHECK-NEXT:    mov z1.d, z5.d
309 ; CHECK-NEXT:    ret
310   %res = call { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.aarch64.sve.srshl.x2.nxv4i32(<vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zm1, <vscale x 4 x i32> %zm2)
311   ret { <vscale x 4 x i32>, <vscale x 4 x i32> } %res
314 define { <vscale x 2 x i64>, <vscale x 2 x i64> } @multi_vec_rounding_shl_x2_s64(<vscale x 2 x i64> %dummy, <vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zm1, <vscale x 2 x i64> %zm2) {
315 ; CHECK-LABEL: multi_vec_rounding_shl_x2_s64:
316 ; CHECK:       // %bb.0:
317 ; CHECK-NEXT:    mov z7.d, z4.d
318 ; CHECK-NEXT:    mov z5.d, z2.d
319 ; CHECK-NEXT:    mov z6.d, z3.d
320 ; CHECK-NEXT:    mov z4.d, z1.d
321 ; CHECK-NEXT:    srshl { z4.d, z5.d }, { z4.d, z5.d }, { z6.d, z7.d }
322 ; CHECK-NEXT:    mov z0.d, z4.d
323 ; CHECK-NEXT:    mov z1.d, z5.d
324 ; CHECK-NEXT:    ret
325   %res = call { <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.aarch64.sve.srshl.x2.nxv2i64(<vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zm1, <vscale x 2 x i64> %zm2)
326   ret { <vscale x 2 x i64>, <vscale x 2 x i64> } %res
329 ; SRSHL (Multi, x4)
331 define { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> }
332 @multi_vec_rounding_shl_x4_s8(<vscale x 16 x i8> %dummy, <vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zdn3, <vscale x 16 x i8> %zdn4, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2, <vscale x 16 x i8> %zm3, <vscale x 16 x i8> %zm4) {
333 ; CHECK-LABEL: multi_vec_rounding_shl_x4_s8:
334 ; CHECK:       // %bb.0:
335 ; CHECK-NEXT:    ptrue p0.b
336 ; CHECK-NEXT:    mov    z30.d, z7.d
337 ; CHECK-NEXT:    mov    z27.d, z4.d
338 ; CHECK-NEXT:    mov    z29.d, z6.d
339 ; CHECK-NEXT:    mov    z26.d, z3.d
340 ; CHECK-NEXT:    mov    z28.d, z5.d
341 ; CHECK-NEXT:    mov    z25.d, z2.d
342 ; CHECK-NEXT:    mov    z24.d, z1.d
343 ; CHECK-NEXT:    ld1b { z31.b }, p0/z, [x0]
344 ; CHECK-NEXT:    srshl { z24.b - z27.b }, { z24.b - z27.b }, { z28.b - z31.b }
345 ; CHECK-NEXT:    mov z0.d, z24.d
346 ; CHECK-NEXT:    mov z1.d, z25.d
347 ; CHECK-NEXT:    mov z2.d, z26.d
348 ; CHECK-NEXT:    mov z3.d, z27.d
349 ; CHECK-NEXT:    ret
350   %res = call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> }
351               @llvm.aarch64.sve.srshl.x4.nxv16i8(<vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zdn3, <vscale x 16 x i8> %zdn4,
352                                                  <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2, <vscale x 16 x i8> %zm3, <vscale x 16 x i8> %zm4)
353   ret { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %res
356 define { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> }
357 @multi_vec_rounding_shl_x4_s16(<vscale x 8 x i16> %dummy, <vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zdn3, <vscale x 8 x i16> %zdn4, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2, <vscale x 8 x i16> %zm3, <vscale x 8 x i16> %zm4) {
358 ; CHECK-LABEL: multi_vec_rounding_shl_x4_s16:
359 ; CHECK:       // %bb.0:
360 ; CHECK-NEXT:    ptrue p0.h
361 ; CHECK-NEXT:    mov    z30.d, z7.d
362 ; CHECK-NEXT:    mov    z27.d, z4.d
363 ; CHECK-NEXT:    mov    z29.d, z6.d
364 ; CHECK-NEXT:    mov    z26.d, z3.d
365 ; CHECK-NEXT:    mov    z28.d, z5.d
366 ; CHECK-NEXT:    mov    z25.d, z2.d
367 ; CHECK-NEXT:    mov    z24.d, z1.d
368 ; CHECK-NEXT:    ld1h { z31.h }, p0/z, [x0]
369 ; CHECK-NEXT:    srshl { z24.h - z27.h }, { z24.h - z27.h }, { z28.h - z31.h }
370 ; CHECK-NEXT:    mov z0.d, z24.d
371 ; CHECK-NEXT:    mov z1.d, z25.d
372 ; CHECK-NEXT:    mov z2.d, z26.d
373 ; CHECK-NEXT:    mov z3.d, z27.d
374 ; CHECK-NEXT:    ret
375   %res = call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> }
376               @llvm.aarch64.sve.srshl.x4.nxv8i16(<vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zdn3, <vscale x 8 x i16> %zdn4,
377                                                  <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2, <vscale x 8 x i16> %zm3, <vscale x 8 x i16> %zm4)
378   ret { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %res
381 define { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> }
382 @multi_vec_rounding_shl_x4_s32(<vscale x 4 x i32> %dummy, <vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zdn3, <vscale x 4 x i32> %zdn4, <vscale x 4 x i32> %zm1, <vscale x 4 x i32> %zm2, <vscale x 4 x i32> %zm3, <vscale x 4 x i32> %zm4) {
383 ; CHECK-LABEL: multi_vec_rounding_shl_x4_s32:
384 ; CHECK:       // %bb.0:
385 ; CHECK-NEXT:    ptrue p0.s
386 ; CHECK-NEXT:    mov    z30.d, z7.d
387 ; CHECK-NEXT:    mov    z27.d, z4.d
388 ; CHECK-NEXT:    mov    z29.d, z6.d
389 ; CHECK-NEXT:    mov    z26.d, z3.d
390 ; CHECK-NEXT:    mov    z28.d, z5.d
391 ; CHECK-NEXT:    mov    z25.d, z2.d
392 ; CHECK-NEXT:    mov    z24.d, z1.d
393 ; CHECK-NEXT:    ld1w { z31.s }, p0/z, [x0]
394 ; CHECK-NEXT:    srshl { z24.s - z27.s }, { z24.s - z27.s }, { z28.s - z31.s }
395 ; CHECK-NEXT:    mov z0.d, z24.d
396 ; CHECK-NEXT:    mov z1.d, z25.d
397 ; CHECK-NEXT:    mov z2.d, z26.d
398 ; CHECK-NEXT:    mov z3.d, z27.d
399 ; CHECK-NEXT:    ret
400   %res = call { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> }
401               @llvm.aarch64.sve.srshl.x4.nxv4i32(<vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zdn3, <vscale x 4 x i32> %zdn4,
402                                                  <vscale x 4 x i32> %zm1, <vscale x 4 x i32> %zm2, <vscale x 4 x i32> %zm3, <vscale x 4 x i32> %zm4)
403   ret { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> } %res
406 define { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> }
407 @multi_vec_rounding_shl_x4_s64(<vscale x 2 x i64> %dummy, <vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zdn3, <vscale x 2 x i64> %zdn4, <vscale x 2 x i64> %zm1, <vscale x 2 x i64> %zm2, <vscale x 2 x i64> %zm3, <vscale x 2 x i64> %zm4) {
408 ; CHECK-LABEL: multi_vec_rounding_shl_x4_s64:
409 ; CHECK:       // %bb.0:
410 ; CHECK-NEXT:    ptrue p0.d
411 ; CHECK-NEXT:    mov    z30.d, z7.d
412 ; CHECK-NEXT:    mov    z27.d, z4.d
413 ; CHECK-NEXT:    mov    z29.d, z6.d
414 ; CHECK-NEXT:    mov    z26.d, z3.d
415 ; CHECK-NEXT:    mov    z28.d, z5.d
416 ; CHECK-NEXT:    mov    z25.d, z2.d
417 ; CHECK-NEXT:    mov    z24.d, z1.d
418 ; CHECK-NEXT:    ld1d { z31.d }, p0/z, [x0]
419 ; CHECK-NEXT:    srshl { z24.d - z27.d }, { z24.d - z27.d }, { z28.d - z31.d }
420 ; CHECK-NEXT:    mov z0.d, z24.d
421 ; CHECK-NEXT:    mov z1.d, z25.d
422 ; CHECK-NEXT:    mov z2.d, z26.d
423 ; CHECK-NEXT:    mov z3.d, z27.d
424 ; CHECK-NEXT:    ret
425   %res = call { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> }
426               @llvm.aarch64.sve.srshl.x4.nxv2i64(<vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zdn3, <vscale x 2 x i64> %zdn4,
427                                                  <vscale x 2 x i64> %zm1, <vscale x 2 x i64> %zm2, <vscale x 2 x i64> %zm3, <vscale x 2 x i64> %zm4)
428   ret { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } %res
431 ; URSHL (Multi, x2)
433 define { <vscale x 16 x i8>, <vscale x 16 x i8> } @multi_vec_rounding_uhl_x2_u8(<vscale x 16 x i8> %dummy, <vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2) {
434 ; CHECK-LABEL: multi_vec_rounding_uhl_x2_u8:
435 ; CHECK:       // %bb.0:
436 ; CHECK-NEXT:    mov z7.d, z4.d
437 ; CHECK-NEXT:    mov z5.d, z2.d
438 ; CHECK-NEXT:    mov z6.d, z3.d
439 ; CHECK-NEXT:    mov z4.d, z1.d
440 ; CHECK-NEXT:    urshl { z4.b, z5.b }, { z4.b, z5.b }, { z6.b, z7.b }
441 ; CHECK-NEXT:    mov z0.d, z4.d
442 ; CHECK-NEXT:    mov z1.d, z5.d
443 ; CHECK-NEXT:    ret
444   %res = call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.urshl.x2.nxv16i8(<vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2)
445   ret { <vscale x 16 x i8>, <vscale x 16 x i8> } %res
448 define { <vscale x 8 x i16>, <vscale x 8 x i16> } @multi_vec_rounding_uhl_x2_u16(<vscale x 8 x i16> %dummy, <vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2) {
449 ; CHECK-LABEL: multi_vec_rounding_uhl_x2_u16:
450 ; CHECK:       // %bb.0:
451 ; CHECK-NEXT:    mov z7.d, z4.d
452 ; CHECK-NEXT:    mov z5.d, z2.d
453 ; CHECK-NEXT:    mov z6.d, z3.d
454 ; CHECK-NEXT:    mov z4.d, z1.d
455 ; CHECK-NEXT:    urshl { z4.h, z5.h }, { z4.h, z5.h }, { z6.h, z7.h }
456 ; CHECK-NEXT:    mov z0.d, z4.d
457 ; CHECK-NEXT:    mov z1.d, z5.d
458 ; CHECK-NEXT:    ret
459   %res = call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.urshl.x2.nxv8i16(<vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2)
460   ret { <vscale x 8 x i16>, <vscale x 8 x i16> } %res
463 define { <vscale x 4 x i32>, <vscale x 4 x i32> } @multi_vec_rounding_uhl_x2_u32(<vscale x 4 x i32> %dummy, <vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zm1, <vscale x 4 x i32> %zm2) {
464 ; CHECK-LABEL: multi_vec_rounding_uhl_x2_u32:
465 ; CHECK:       // %bb.0:
466 ; CHECK-NEXT:    mov z7.d, z4.d
467 ; CHECK-NEXT:    mov z5.d, z2.d
468 ; CHECK-NEXT:    mov z6.d, z3.d
469 ; CHECK-NEXT:    mov z4.d, z1.d
470 ; CHECK-NEXT:    urshl { z4.s, z5.s }, { z4.s, z5.s }, { z6.s, z7.s }
471 ; CHECK-NEXT:    mov z0.d, z4.d
472 ; CHECK-NEXT:    mov z1.d, z5.d
473 ; CHECK-NEXT:    ret
474   %res = call { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.aarch64.sve.urshl.x2.nxv4i32(<vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zm1, <vscale x 4 x i32> %zm2)
475   ret { <vscale x 4 x i32>, <vscale x 4 x i32> } %res
478 define { <vscale x 2 x i64>, <vscale x 2 x i64> } @multi_vec_rounding_uhl_x2_u64(<vscale x 2 x i64> %dummy, <vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zm1, <vscale x 2 x i64> %zm2) {
479 ; CHECK-LABEL: multi_vec_rounding_uhl_x2_u64:
480 ; CHECK:       // %bb.0:
481 ; CHECK-NEXT:    mov z7.d, z4.d
482 ; CHECK-NEXT:    mov z5.d, z2.d
483 ; CHECK-NEXT:    mov z6.d, z3.d
484 ; CHECK-NEXT:    mov z4.d, z1.d
485 ; CHECK-NEXT:    urshl { z4.d, z5.d }, { z4.d, z5.d }, { z6.d, z7.d }
486 ; CHECK-NEXT:    mov z0.d, z4.d
487 ; CHECK-NEXT:    mov z1.d, z5.d
488 ; CHECK-NEXT:    ret
489   %res = call { <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.aarch64.sve.urshl.x2.nxv2i64(<vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zm1, <vscale x 2 x i64> %zm2)
490   ret { <vscale x 2 x i64>, <vscale x 2 x i64> } %res
493 ; URSHL (Multi, x4)
495 define { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> }
496 @multi_vec_rounding_shl_x4_u8(<vscale x 16 x i8> %dummy, <vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zdn3, <vscale x 16 x i8> %zdn4, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2, <vscale x 16 x i8> %zm3, <vscale x 16 x i8> %zm4) {
497 ; CHECK-LABEL: multi_vec_rounding_shl_x4_u8:
498 ; CHECK:       // %bb.0:
499 ; CHECK-NEXT:    ptrue p0.b
500 ; CHECK-NEXT:    mov    z30.d, z7.d
501 ; CHECK-NEXT:    mov    z27.d, z4.d
502 ; CHECK-NEXT:    mov    z29.d, z6.d
503 ; CHECK-NEXT:    mov    z26.d, z3.d
504 ; CHECK-NEXT:    mov    z28.d, z5.d
505 ; CHECK-NEXT:    mov    z25.d, z2.d
506 ; CHECK-NEXT:    mov    z24.d, z1.d
507 ; CHECK-NEXT:    ld1b { z31.b }, p0/z, [x0]
508 ; CHECK-NEXT:    urshl { z24.b - z27.b }, { z24.b - z27.b }, { z28.b - z31.b }
509 ; CHECK-NEXT:    mov z0.d, z24.d
510 ; CHECK-NEXT:    mov z1.d, z25.d
511 ; CHECK-NEXT:    mov z2.d, z26.d
512 ; CHECK-NEXT:    mov z3.d, z27.d
513 ; CHECK-NEXT:    ret
514   %res = call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> }
515               @llvm.aarch64.sve.urshl.x4.nxv16i8(<vscale x 16 x i8> %zdn1, <vscale x 16 x i8> %zdn2, <vscale x 16 x i8> %zdn3, <vscale x 16 x i8> %zdn4,
516                                                  <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2, <vscale x 16 x i8> %zm3, <vscale x 16 x i8> %zm4)
517   ret { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %res
520 define { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> }
521 @multi_vec_rounding_shl_x4_u16(<vscale x 8 x i16> %dummy, <vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zdn3, <vscale x 8 x i16> %zdn4, <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2, <vscale x 8 x i16> %zm3, <vscale x 8 x i16> %zm4) {
522 ; CHECK-LABEL: multi_vec_rounding_shl_x4_u16:
523 ; CHECK:       // %bb.0:
524 ; CHECK-NEXT:    ptrue p0.h
525 ; CHECK-NEXT:    mov    z30.d, z7.d
526 ; CHECK-NEXT:    mov    z27.d, z4.d
527 ; CHECK-NEXT:    mov    z29.d, z6.d
528 ; CHECK-NEXT:    mov    z26.d, z3.d
529 ; CHECK-NEXT:    mov    z28.d, z5.d
530 ; CHECK-NEXT:    mov    z25.d, z2.d
531 ; CHECK-NEXT:    mov    z24.d, z1.d
532 ; CHECK-NEXT:    ld1h { z31.h }, p0/z, [x0]
533 ; CHECK-NEXT:    urshl { z24.h - z27.h }, { z24.h - z27.h }, { z28.h - z31.h }
534 ; CHECK-NEXT:    mov z0.d, z24.d
535 ; CHECK-NEXT:    mov z1.d, z25.d
536 ; CHECK-NEXT:    mov z2.d, z26.d
537 ; CHECK-NEXT:    mov z3.d, z27.d
538 ; CHECK-NEXT:    ret
539   %res = call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> }
540               @llvm.aarch64.sve.urshl.x4.nxv8i16(<vscale x 8 x i16> %zdn1, <vscale x 8 x i16> %zdn2, <vscale x 8 x i16> %zdn3, <vscale x 8 x i16> %zdn4,
541                                                  <vscale x 8 x i16> %zm1, <vscale x 8 x i16> %zm2, <vscale x 8 x i16> %zm3, <vscale x 8 x i16> %zm4)
542   ret { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %res
545 define { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> }
546 @multi_vec_rounding_shl_x4_u32(<vscale x 4 x i32> %dummy, <vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zdn3, <vscale x 4 x i32> %zdn4, <vscale x 4 x i32> %zm1, <vscale x 4 x i32> %zm2, <vscale x 4 x i32> %zm3, <vscale x 4 x i32> %zm4) {
547 ; CHECK-LABEL: multi_vec_rounding_shl_x4_u32:
548 ; CHECK:       // %bb.0:
549 ; CHECK-NEXT:    ptrue p0.s
550 ; CHECK-NEXT:    mov    z30.d, z7.d
551 ; CHECK-NEXT:    mov    z27.d, z4.d
552 ; CHECK-NEXT:    mov    z29.d, z6.d
553 ; CHECK-NEXT:    mov    z26.d, z3.d
554 ; CHECK-NEXT:    mov    z28.d, z5.d
555 ; CHECK-NEXT:    mov    z25.d, z2.d
556 ; CHECK-NEXT:    mov    z24.d, z1.d
557 ; CHECK-NEXT:    ld1w { z31.s }, p0/z, [x0]
558 ; CHECK-NEXT:    urshl { z24.s - z27.s }, { z24.s - z27.s }, { z28.s - z31.s }
559 ; CHECK-NEXT:    mov z0.d, z24.d
560 ; CHECK-NEXT:    mov z1.d, z25.d
561 ; CHECK-NEXT:    mov z2.d, z26.d
562 ; CHECK-NEXT:    mov z3.d, z27.d
563 ; CHECK-NEXT:    ret
564   %res = call { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> }
565               @llvm.aarch64.sve.urshl.x4.nxv4i32(<vscale x 4 x i32> %zdn1, <vscale x 4 x i32> %zdn2, <vscale x 4 x i32> %zdn3, <vscale x 4 x i32> %zdn4,
566                                                  <vscale x 4 x i32> %zm1, <vscale x 4 x i32> %zm2, <vscale x 4 x i32> %zm3, <vscale x 4 x i32> %zm4)
567   ret { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> } %res
570 define { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> }
571 @multi_vec_rounding_shl_x4_u64(<vscale x 2 x i64> %dummy, <vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zdn3, <vscale x 2 x i64> %zdn4, <vscale x 2 x i64> %zm1, <vscale x 2 x i64> %zm2, <vscale x 2 x i64> %zm3, <vscale x 2 x i64> %zm4) {
572 ; CHECK-LABEL: multi_vec_rounding_shl_x4_u64:
573 ; CHECK:       // %bb.0:
574 ; CHECK-NEXT:    ptrue p0.d
575 ; CHECK-NEXT:    mov    z30.d, z7.d
576 ; CHECK-NEXT:    mov    z27.d, z4.d
577 ; CHECK-NEXT:    mov    z29.d, z6.d
578 ; CHECK-NEXT:    mov    z26.d, z3.d
579 ; CHECK-NEXT:    mov    z28.d, z5.d
580 ; CHECK-NEXT:    mov    z25.d, z2.d
581 ; CHECK-NEXT:    mov    z24.d, z1.d
582 ; CHECK-NEXT:    ld1d { z31.d }, p0/z, [x0]
583 ; CHECK-NEXT:    urshl { z24.d - z27.d }, { z24.d - z27.d }, { z28.d - z31.d }
584 ; CHECK-NEXT:    mov z0.d, z24.d
585 ; CHECK-NEXT:    mov z1.d, z25.d
586 ; CHECK-NEXT:    mov z2.d, z26.d
587 ; CHECK-NEXT:    mov z3.d, z27.d
588 ; CHECK-NEXT:    ret
589   %res = call { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> }
590               @llvm.aarch64.sve.urshl.x4.nxv2i64(<vscale x 2 x i64> %zdn1, <vscale x 2 x i64> %zdn2, <vscale x 2 x i64> %zdn3, <vscale x 2 x i64> %zdn4,
591                                                  <vscale x 2 x i64> %zm1, <vscale x 2 x i64> %zm2, <vscale x 2 x i64> %zm3, <vscale x 2 x i64> %zm4)
592   ret { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } %res
595 declare { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.srshl.single.x2.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)
596 declare { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.srshl.single.x2.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)
597 declare { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.aarch64.sve.srshl.single.x2.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
598 declare { <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.aarch64.sve.srshl.single.x2.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>)
600 declare { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.srshl.single.x4.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)
601 declare { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.srshl.single.x4.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)
602 declare { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.aarch64.sve.srshl.single.x4.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
603 declare { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.aarch64.sve.srshl.single.x4.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>)
605 declare { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.urshl.single.x2.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)
606 declare { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.urshl.single.x2.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)
607 declare { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.aarch64.sve.urshl.single.x2.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
608 declare { <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.aarch64.sve.urshl.single.x2.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>)
610 declare { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.urshl.single.x4.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)
611 declare { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.urshl.single.x4.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)
612 declare { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.aarch64.sve.urshl.single.x4.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
613 declare { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.aarch64.sve.urshl.single.x4.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>)
615 declare { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.srshl.x2.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)
616 declare { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.srshl.x2.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>,  <vscale x 8 x i16>)
617 declare { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.aarch64.sve.srshl.x2.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
618 declare { <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.aarch64.sve.srshl.x2.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>)
620 declare { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> }
621  @llvm.aarch64.sve.srshl.x4.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)
622 declare { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> }
623  @llvm.aarch64.sve.srshl.x4.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)
624 declare { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> }
625  @llvm.aarch64.sve.srshl.x4.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
626 declare { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> }
627  @llvm.aarch64.sve.srshl.x4.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> )
629 declare { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.aarch64.sve.urshl.x2.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)
630 declare { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.aarch64.sve.urshl.x2.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)
631 declare { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.aarch64.sve.urshl.x2.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
632 declare { <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.aarch64.sve.urshl.x2.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>)
634 declare { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> }
635  @llvm.aarch64.sve.urshl.x4.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)
636 declare { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> }
637  @llvm.aarch64.sve.urshl.x4.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)
638 declare { <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32> }
639  @llvm.aarch64.sve.urshl.x4.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
640 declare { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> }
641  @llvm.aarch64.sve.urshl.x4.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>)