1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
3; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
4
5; Test that the prepareSREMEqFold optimization doesn't crash on scalable
6; vector types.
7define <vscale x 4 x i1> @srem_eq_fold_nxv4i8(<vscale x 4 x i8> %va) {
8; CHECK-LABEL: srem_eq_fold_nxv4i8:
9; CHECK:       # %bb.0:
10; CHECK-NEXT:    li a0, 42
11; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, mu
12; CHECK-NEXT:    vmv.v.x v9, a0
13; CHECK-NEXT:    li a1, -85
14; CHECK-NEXT:    vmacc.vx v9, a1, v8
15; CHECK-NEXT:    vsll.vi v8, v9, 7
16; CHECK-NEXT:    vsrl.vi v9, v9, 1
17; CHECK-NEXT:    vor.vv v8, v9, v8
18; CHECK-NEXT:    vmsleu.vx v0, v8, a0
19; CHECK-NEXT:    ret
20  %head_six = insertelement <vscale x 4 x i8> poison, i8 6, i32 0
21  %splat_six = shufflevector <vscale x 4 x i8> %head_six, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
22  %rem = srem <vscale x 4 x i8> %va, %splat_six
23
24  %cc = icmp eq <vscale x 4 x i8> %rem, zeroinitializer
25  ret <vscale x 4 x i1> %cc
26}
27
28define <vscale x 1 x i32> @vmulh_vv_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb) {
29; CHECK-LABEL: vmulh_vv_nxv1i32:
30; CHECK:       # %bb.0:
31; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
32; CHECK-NEXT:    vmulh.vv v8, v9, v8
33; CHECK-NEXT:    ret
34  %vc = sext <vscale x 1 x i32> %vb to <vscale x 1 x i64>
35  %vd = sext <vscale x 1 x i32> %va to <vscale x 1 x i64>
36  %ve = mul <vscale x 1 x i64> %vc, %vd
37  %head = insertelement <vscale x 1 x i64> poison, i64 32, i32 0
38  %splat = shufflevector <vscale x 1 x i64> %head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
39  %vf = lshr <vscale x 1 x i64> %ve, %splat
40  %vg = trunc <vscale x 1 x i64> %vf to <vscale x 1 x i32>
41  ret <vscale x 1 x i32> %vg
42}
43
44define <vscale x 1 x i32> @vmulh_vx_nxv1i32(<vscale x 1 x i32> %va, i32 %x) {
45; CHECK-LABEL: vmulh_vx_nxv1i32:
46; CHECK:       # %bb.0:
47; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
48; CHECK-NEXT:    vmulh.vx v8, v8, a0
49; CHECK-NEXT:    ret
50  %head1 = insertelement <vscale x 1 x i32> poison, i32 %x, i32 0
51  %splat1 = shufflevector <vscale x 1 x i32> %head1, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
52  %vb = sext <vscale x 1 x i32> %splat1 to <vscale x 1 x i64>
53  %vc = sext <vscale x 1 x i32> %va to <vscale x 1 x i64>
54  %vd = mul <vscale x 1 x i64> %vb, %vc
55  %head2 = insertelement <vscale x 1 x i64> poison, i64 32, i32 0
56  %splat2 = shufflevector <vscale x 1 x i64> %head2, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
57  %ve = lshr <vscale x 1 x i64> %vd, %splat2
58  %vf = trunc <vscale x 1 x i64> %ve to <vscale x 1 x i32>
59  ret <vscale x 1 x i32> %vf
60}
61
62define <vscale x 1 x i32> @vmulh_vi_nxv1i32_0(<vscale x 1 x i32> %va) {
63; RV32-LABEL: vmulh_vi_nxv1i32_0:
64; RV32:       # %bb.0:
65; RV32-NEXT:    li a0, -7
66; RV32-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
67; RV32-NEXT:    vmulh.vx v8, v8, a0
68; RV32-NEXT:    ret
69;
70; RV64-LABEL: vmulh_vi_nxv1i32_0:
71; RV64:       # %bb.0:
72; RV64-NEXT:    li a0, 1
73; RV64-NEXT:    slli a0, a0, 32
74; RV64-NEXT:    addi a0, a0, -7
75; RV64-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
76; RV64-NEXT:    vmulh.vx v8, v8, a0
77; RV64-NEXT:    ret
78  %head1 = insertelement <vscale x 1 x i32> poison, i32 -7, i32 0
79  %splat1 = shufflevector <vscale x 1 x i32> %head1, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
80  %vb = sext <vscale x 1 x i32> %splat1 to <vscale x 1 x i64>
81  %vc = sext <vscale x 1 x i32> %va to <vscale x 1 x i64>
82  %vd = mul <vscale x 1 x i64> %vb, %vc
83  %head2 = insertelement <vscale x 1 x i64> poison, i64 32, i32 0
84  %splat2 = shufflevector <vscale x 1 x i64> %head2, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
85  %ve = lshr <vscale x 1 x i64> %vd, %splat2
86  %vf = trunc <vscale x 1 x i64> %ve to <vscale x 1 x i32>
87  ret <vscale x 1 x i32> %vf
88}
89
90define <vscale x 1 x i32> @vmulh_vi_nxv1i32_1(<vscale x 1 x i32> %va) {
91; CHECK-LABEL: vmulh_vi_nxv1i32_1:
92; CHECK:       # %bb.0:
93; CHECK-NEXT:    li a0, 16
94; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
95; CHECK-NEXT:    vmulh.vx v8, v8, a0
96; CHECK-NEXT:    ret
97  %head1 = insertelement <vscale x 1 x i32> poison, i32 16, i32 0
98  %splat1 = shufflevector <vscale x 1 x i32> %head1, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
99  %vb = sext <vscale x 1 x i32> %splat1 to <vscale x 1 x i64>
100  %vc = sext <vscale x 1 x i32> %va to <vscale x 1 x i64>
101  %vd = mul <vscale x 1 x i64> %vb, %vc
102  %head2 = insertelement <vscale x 1 x i64> poison, i64 32, i32 0
103  %splat2 = shufflevector <vscale x 1 x i64> %head2, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
104  %ve = lshr <vscale x 1 x i64> %vd, %splat2
105  %vf = trunc <vscale x 1 x i64> %ve to <vscale x 1 x i32>
106  ret <vscale x 1 x i32> %vf
107}
108
109define <vscale x 2 x i32> @vmulh_vv_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb) {
110; CHECK-LABEL: vmulh_vv_nxv2i32:
111; CHECK:       # %bb.0:
112; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
113; CHECK-NEXT:    vmulh.vv v8, v9, v8
114; CHECK-NEXT:    ret
115  %vc = sext <vscale x 2 x i32> %vb to <vscale x 2 x i64>
116  %vd = sext <vscale x 2 x i32> %va to <vscale x 2 x i64>
117  %ve = mul <vscale x 2 x i64> %vc, %vd
118  %head = insertelement <vscale x 2 x i64> poison, i64 32, i32 0
119  %splat = shufflevector <vscale x 2 x i64> %head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
120  %vf = lshr <vscale x 2 x i64> %ve, %splat
121  %vg = trunc <vscale x 2 x i64> %vf to <vscale x 2 x i32>
122  ret <vscale x 2 x i32> %vg
123}
124
125define <vscale x 2 x i32> @vmulh_vx_nxv2i32(<vscale x 2 x i32> %va, i32 %x) {
126; CHECK-LABEL: vmulh_vx_nxv2i32:
127; CHECK:       # %bb.0:
128; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
129; CHECK-NEXT:    vmulh.vx v8, v8, a0
130; CHECK-NEXT:    ret
131  %head1 = insertelement <vscale x 2 x i32> poison, i32 %x, i32 0
132  %splat1 = shufflevector <vscale x 2 x i32> %head1, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
133  %vb = sext <vscale x 2 x i32> %splat1 to <vscale x 2 x i64>
134  %vc = sext <vscale x 2 x i32> %va to <vscale x 2 x i64>
135  %vd = mul <vscale x 2 x i64> %vb, %vc
136  %head2 = insertelement <vscale x 2 x i64> poison, i64 32, i32 0
137  %splat2 = shufflevector <vscale x 2 x i64> %head2, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
138  %ve = lshr <vscale x 2 x i64> %vd, %splat2
139  %vf = trunc <vscale x 2 x i64> %ve to <vscale x 2 x i32>
140  ret <vscale x 2 x i32> %vf
141}
142
143define <vscale x 2 x i32> @vmulh_vi_nxv2i32_0(<vscale x 2 x i32> %va) {
144; RV32-LABEL: vmulh_vi_nxv2i32_0:
145; RV32:       # %bb.0:
146; RV32-NEXT:    li a0, -7
147; RV32-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
148; RV32-NEXT:    vmulh.vx v8, v8, a0
149; RV32-NEXT:    ret
150;
151; RV64-LABEL: vmulh_vi_nxv2i32_0:
152; RV64:       # %bb.0:
153; RV64-NEXT:    li a0, 1
154; RV64-NEXT:    slli a0, a0, 32
155; RV64-NEXT:    addi a0, a0, -7
156; RV64-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
157; RV64-NEXT:    vmulh.vx v8, v8, a0
158; RV64-NEXT:    ret
159  %head1 = insertelement <vscale x 2 x i32> poison, i32 -7, i32 0
160  %splat1 = shufflevector <vscale x 2 x i32> %head1, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
161  %vb = sext <vscale x 2 x i32> %splat1 to <vscale x 2 x i64>
162  %vc = sext <vscale x 2 x i32> %va to <vscale x 2 x i64>
163  %vd = mul <vscale x 2 x i64> %vb, %vc
164  %head2 = insertelement <vscale x 2 x i64> poison, i64 32, i32 0
165  %splat2 = shufflevector <vscale x 2 x i64> %head2, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
166  %ve = lshr <vscale x 2 x i64> %vd, %splat2
167  %vf = trunc <vscale x 2 x i64> %ve to <vscale x 2 x i32>
168  ret <vscale x 2 x i32> %vf
169}
170
171define <vscale x 2 x i32> @vmulh_vi_nxv2i32_1(<vscale x 2 x i32> %va) {
172; CHECK-LABEL: vmulh_vi_nxv2i32_1:
173; CHECK:       # %bb.0:
174; CHECK-NEXT:    li a0, 16
175; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
176; CHECK-NEXT:    vmulh.vx v8, v8, a0
177; CHECK-NEXT:    ret
178  %head1 = insertelement <vscale x 2 x i32> poison, i32 16, i32 0
179  %splat1 = shufflevector <vscale x 2 x i32> %head1, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
180  %vb = sext <vscale x 2 x i32> %splat1 to <vscale x 2 x i64>
181  %vc = sext <vscale x 2 x i32> %va to <vscale x 2 x i64>
182  %vd = mul <vscale x 2 x i64> %vb, %vc
183  %head2 = insertelement <vscale x 2 x i64> poison, i64 32, i32 0
184  %splat2 = shufflevector <vscale x 2 x i64> %head2, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
185  %ve = lshr <vscale x 2 x i64> %vd, %splat2
186  %vf = trunc <vscale x 2 x i64> %ve to <vscale x 2 x i32>
187  ret <vscale x 2 x i32> %vf
188}
189
190define <vscale x 4 x i32> @vmulh_vv_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb) {
191; CHECK-LABEL: vmulh_vv_nxv4i32:
192; CHECK:       # %bb.0:
193; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
194; CHECK-NEXT:    vmulh.vv v8, v10, v8
195; CHECK-NEXT:    ret
196  %vc = sext <vscale x 4 x i32> %vb to <vscale x 4 x i64>
197  %vd = sext <vscale x 4 x i32> %va to <vscale x 4 x i64>
198  %ve = mul <vscale x 4 x i64> %vc, %vd
199  %head = insertelement <vscale x 4 x i64> poison, i64 32, i32 0
200  %splat = shufflevector <vscale x 4 x i64> %head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
201  %vf = lshr <vscale x 4 x i64> %ve, %splat
202  %vg = trunc <vscale x 4 x i64> %vf to <vscale x 4 x i32>
203  ret <vscale x 4 x i32> %vg
204}
205
206define <vscale x 4 x i32> @vmulh_vx_nxv4i32(<vscale x 4 x i32> %va, i32 %x) {
207; CHECK-LABEL: vmulh_vx_nxv4i32:
208; CHECK:       # %bb.0:
209; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
210; CHECK-NEXT:    vmulh.vx v8, v8, a0
211; CHECK-NEXT:    ret
212  %head1 = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0
213  %splat1 = shufflevector <vscale x 4 x i32> %head1, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
214  %vb = sext <vscale x 4 x i32> %splat1 to <vscale x 4 x i64>
215  %vc = sext <vscale x 4 x i32> %va to <vscale x 4 x i64>
216  %vd = mul <vscale x 4 x i64> %vb, %vc
217  %head2 = insertelement <vscale x 4 x i64> poison, i64 32, i32 0
218  %splat2 = shufflevector <vscale x 4 x i64> %head2, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
219  %ve = lshr <vscale x 4 x i64> %vd, %splat2
220  %vf = trunc <vscale x 4 x i64> %ve to <vscale x 4 x i32>
221  ret <vscale x 4 x i32> %vf
222}
223
224define <vscale x 4 x i32> @vmulh_vi_nxv4i32_0(<vscale x 4 x i32> %va) {
225; RV32-LABEL: vmulh_vi_nxv4i32_0:
226; RV32:       # %bb.0:
227; RV32-NEXT:    li a0, -7
228; RV32-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
229; RV32-NEXT:    vmulh.vx v8, v8, a0
230; RV32-NEXT:    ret
231;
232; RV64-LABEL: vmulh_vi_nxv4i32_0:
233; RV64:       # %bb.0:
234; RV64-NEXT:    li a0, 1
235; RV64-NEXT:    slli a0, a0, 32
236; RV64-NEXT:    addi a0, a0, -7
237; RV64-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
238; RV64-NEXT:    vmulh.vx v8, v8, a0
239; RV64-NEXT:    ret
240  %head1 = insertelement <vscale x 4 x i32> poison, i32 -7, i32 0
241  %splat1 = shufflevector <vscale x 4 x i32> %head1, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
242  %vb = sext <vscale x 4 x i32> %splat1 to <vscale x 4 x i64>
243  %vc = sext <vscale x 4 x i32> %va to <vscale x 4 x i64>
244  %vd = mul <vscale x 4 x i64> %vb, %vc
245  %head2 = insertelement <vscale x 4 x i64> poison, i64 32, i32 0
246  %splat2 = shufflevector <vscale x 4 x i64> %head2, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
247  %ve = lshr <vscale x 4 x i64> %vd, %splat2
248  %vf = trunc <vscale x 4 x i64> %ve to <vscale x 4 x i32>
249  ret <vscale x 4 x i32> %vf
250}
251
252define <vscale x 4 x i32> @vmulh_vi_nxv4i32_1(<vscale x 4 x i32> %va) {
253; CHECK-LABEL: vmulh_vi_nxv4i32_1:
254; CHECK:       # %bb.0:
255; CHECK-NEXT:    li a0, 16
256; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
257; CHECK-NEXT:    vmulh.vx v8, v8, a0
258; CHECK-NEXT:    ret
259  %head1 = insertelement <vscale x 4 x i32> poison, i32 16, i32 0
260  %splat1 = shufflevector <vscale x 4 x i32> %head1, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
261  %vb = sext <vscale x 4 x i32> %splat1 to <vscale x 4 x i64>
262  %vc = sext <vscale x 4 x i32> %va to <vscale x 4 x i64>
263  %vd = mul <vscale x 4 x i64> %vb, %vc
264  %head2 = insertelement <vscale x 4 x i64> poison, i64 32, i32 0
265  %splat2 = shufflevector <vscale x 4 x i64> %head2, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
266  %ve = lshr <vscale x 4 x i64> %vd, %splat2
267  %vf = trunc <vscale x 4 x i64> %ve to <vscale x 4 x i32>
268  ret <vscale x 4 x i32> %vf
269}
270
271define <vscale x 8 x i32> @vmulh_vv_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb) {
272; CHECK-LABEL: vmulh_vv_nxv8i32:
273; CHECK:       # %bb.0:
274; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
275; CHECK-NEXT:    vmulh.vv v8, v12, v8
276; CHECK-NEXT:    ret
277  %vc = sext <vscale x 8 x i32> %vb to <vscale x 8 x i64>
278  %vd = sext <vscale x 8 x i32> %va to <vscale x 8 x i64>
279  %ve = mul <vscale x 8 x i64> %vc, %vd
280  %head = insertelement <vscale x 8 x i64> poison, i64 32, i32 0
281  %splat = shufflevector <vscale x 8 x i64> %head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
282  %vf = lshr <vscale x 8 x i64> %ve, %splat
283  %vg = trunc <vscale x 8 x i64> %vf to <vscale x 8 x i32>
284  ret <vscale x 8 x i32> %vg
285}
286
287define <vscale x 8 x i32> @vmulh_vx_nxv8i32(<vscale x 8 x i32> %va, i32 %x) {
288; CHECK-LABEL: vmulh_vx_nxv8i32:
289; CHECK:       # %bb.0:
290; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
291; CHECK-NEXT:    vmulh.vx v8, v8, a0
292; CHECK-NEXT:    ret
293  %head1 = insertelement <vscale x 8 x i32> poison, i32 %x, i32 0
294  %splat1 = shufflevector <vscale x 8 x i32> %head1, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
295  %vb = sext <vscale x 8 x i32> %splat1 to <vscale x 8 x i64>
296  %vc = sext <vscale x 8 x i32> %va to <vscale x 8 x i64>
297  %vd = mul <vscale x 8 x i64> %vb, %vc
298  %head2 = insertelement <vscale x 8 x i64> poison, i64 32, i32 0
299  %splat2 = shufflevector <vscale x 8 x i64> %head2, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
300  %ve = lshr <vscale x 8 x i64> %vd, %splat2
301  %vf = trunc <vscale x 8 x i64> %ve to <vscale x 8 x i32>
302  ret <vscale x 8 x i32> %vf
303}
304
305define <vscale x 8 x i32> @vmulh_vi_nxv8i32_0(<vscale x 8 x i32> %va) {
306; RV32-LABEL: vmulh_vi_nxv8i32_0:
307; RV32:       # %bb.0:
308; RV32-NEXT:    li a0, -7
309; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
310; RV32-NEXT:    vmulh.vx v8, v8, a0
311; RV32-NEXT:    ret
312;
313; RV64-LABEL: vmulh_vi_nxv8i32_0:
314; RV64:       # %bb.0:
315; RV64-NEXT:    li a0, 1
316; RV64-NEXT:    slli a0, a0, 32
317; RV64-NEXT:    addi a0, a0, -7
318; RV64-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
319; RV64-NEXT:    vmulh.vx v8, v8, a0
320; RV64-NEXT:    ret
321  %head1 = insertelement <vscale x 8 x i32> poison, i32 -7, i32 0
322  %splat1 = shufflevector <vscale x 8 x i32> %head1, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
323  %vb = sext <vscale x 8 x i32> %splat1 to <vscale x 8 x i64>
324  %vc = sext <vscale x 8 x i32> %va to <vscale x 8 x i64>
325  %vd = mul <vscale x 8 x i64> %vb, %vc
326  %head2 = insertelement <vscale x 8 x i64> poison, i64 32, i32 0
327  %splat2 = shufflevector <vscale x 8 x i64> %head2, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
328  %ve = lshr <vscale x 8 x i64> %vd, %splat2
329  %vf = trunc <vscale x 8 x i64> %ve to <vscale x 8 x i32>
330  ret <vscale x 8 x i32> %vf
331}
332
333define <vscale x 8 x i32> @vmulh_vi_nxv8i32_1(<vscale x 8 x i32> %va) {
334; CHECK-LABEL: vmulh_vi_nxv8i32_1:
335; CHECK:       # %bb.0:
336; CHECK-NEXT:    li a0, 16
337; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
338; CHECK-NEXT:    vmulh.vx v8, v8, a0
339; CHECK-NEXT:    ret
340  %head1 = insertelement <vscale x 8 x i32> poison, i32 16, i32 0
341  %splat1 = shufflevector <vscale x 8 x i32> %head1, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
342  %vb = sext <vscale x 8 x i32> %splat1 to <vscale x 8 x i64>
343  %vc = sext <vscale x 8 x i32> %va to <vscale x 8 x i64>
344  %vd = mul <vscale x 8 x i64> %vb, %vc
345  %head2 = insertelement <vscale x 8 x i64> poison, i64 32, i32 0
346  %splat2 = shufflevector <vscale x 8 x i64> %head2, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
347  %ve = lshr <vscale x 8 x i64> %vd, %splat2
348  %vf = trunc <vscale x 8 x i64> %ve to <vscale x 8 x i32>
349  ret <vscale x 8 x i32> %vf
350}
351