xref: /llvm-project/llvm/test/CodeGen/WebAssembly/masked-shifts.ll (revision 403926aefefb13553f89ad812b1e2385826a82ec)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s
3
4;; Check that masked shift counts are optimized out.
5
6target triple = "wasm32-unknown-unknown"
7
8define i32 @shl_i32(i32 %v, i32 %x) {
9; CHECK-LABEL: shl_i32:
10; CHECK:         .functype shl_i32 (i32, i32) -> (i32)
11; CHECK-NEXT:  # %bb.0:
12; CHECK-NEXT:    local.get 0
13; CHECK-NEXT:    local.get 1
14; CHECK-NEXT:    i32.shl
15; CHECK-NEXT:    # fallthrough-return
16  %m = and i32 %x, 31
17  %a = shl i32 %v, %m
18  ret i32 %a
19}
20
21define i32 @sra_i32(i32 %v, i32 %x) {
22; CHECK-LABEL: sra_i32:
23; CHECK:         .functype sra_i32 (i32, i32) -> (i32)
24; CHECK-NEXT:  # %bb.0:
25; CHECK-NEXT:    local.get 0
26; CHECK-NEXT:    local.get 1
27; CHECK-NEXT:    i32.shr_s
28; CHECK-NEXT:    # fallthrough-return
29  %m = and i32 %x, 31
30  %a = ashr i32 %v, %m
31  ret i32 %a
32}
33
34define i32 @srl_i32(i32 %v, i32 %x) {
35; CHECK-LABEL: srl_i32:
36; CHECK:         .functype srl_i32 (i32, i32) -> (i32)
37; CHECK-NEXT:  # %bb.0:
38; CHECK-NEXT:    local.get 0
39; CHECK-NEXT:    local.get 1
40; CHECK-NEXT:    i32.shr_u
41; CHECK-NEXT:    # fallthrough-return
42  %m = and i32 %x, 31
43  %a = lshr i32 %v, %m
44  ret i32 %a
45}
46
47define i64 @shl_i64(i64 %v, i64 %x) {
48; CHECK-LABEL: shl_i64:
49; CHECK:         .functype shl_i64 (i64, i64) -> (i64)
50; CHECK-NEXT:  # %bb.0:
51; CHECK-NEXT:    local.get 0
52; CHECK-NEXT:    local.get 1
53; CHECK-NEXT:    i64.shl
54; CHECK-NEXT:    # fallthrough-return
55  %m = and i64 %x, 63
56  %a = shl i64 %v, %m
57  ret i64 %a
58}
59
60define i64 @sra_i64(i64 %v, i64 %x) {
61; CHECK-LABEL: sra_i64:
62; CHECK:         .functype sra_i64 (i64, i64) -> (i64)
63; CHECK-NEXT:  # %bb.0:
64; CHECK-NEXT:    local.get 0
65; CHECK-NEXT:    local.get 1
66; CHECK-NEXT:    i64.shr_s
67; CHECK-NEXT:    # fallthrough-return
68  %m = and i64 %x, 63
69  %a = ashr i64 %v, %m
70  ret i64 %a
71}
72
73define i64 @srl_i64(i64 %v, i64 %x) {
74; CHECK-LABEL: srl_i64:
75; CHECK:         .functype srl_i64 (i64, i64) -> (i64)
76; CHECK-NEXT:  # %bb.0:
77; CHECK-NEXT:    local.get 0
78; CHECK-NEXT:    local.get 1
79; CHECK-NEXT:    i64.shr_u
80; CHECK-NEXT:    # fallthrough-return
81  %m = and i64 %x, 63
82  %a = lshr i64 %v, %m
83  ret i64 %a
84}
85
86define <16 x i8> @shl_v16i8(<16 x i8> %v, i8 %x) {
87; CHECK-LABEL: shl_v16i8:
88; CHECK:         .functype shl_v16i8 (v128, i32) -> (v128)
89; CHECK-NEXT:  # %bb.0:
90; CHECK-NEXT:    local.get 0
91; CHECK-NEXT:    local.get 1
92; CHECK-NEXT:    i8x16.shl
93; CHECK-NEXT:    # fallthrough-return
94  %m = and i8 %x, 7
95  %t = insertelement <16 x i8> undef, i8 %m, i32 0
96  %s = shufflevector <16 x i8> %t, <16 x i8> undef,
97    <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,
98                i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
99  %a = shl <16 x i8> %v, %s
100  ret <16 x i8> %a
101}
102
103define <16 x i8> @shl_v16i8_late(<16 x i8> %v, i8 %x) {
104; CHECK-LABEL: shl_v16i8_late:
105; CHECK:         .functype shl_v16i8_late (v128, i32) -> (v128)
106; CHECK-NEXT:  # %bb.0:
107; CHECK-NEXT:    local.get 0
108; CHECK-NEXT:    local.get 1
109; CHECK-NEXT:    i8x16.shl
110; CHECK-NEXT:    # fallthrough-return
111  %t = insertelement <16 x i8> undef, i8 %x, i32 0
112  %s = shufflevector <16 x i8> %t, <16 x i8> undef,
113    <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,
114                i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
115  %m = and <16 x i8> %s, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,
116                          i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
117  %a = shl <16 x i8> %v, %m
118  ret <16 x i8> %a
119}
120
121define <16 x i8> @ashr_v16i8(<16 x i8> %v, i8 %x) {
122; CHECK-LABEL: ashr_v16i8:
123; CHECK:         .functype ashr_v16i8 (v128, i32) -> (v128)
124; CHECK-NEXT:  # %bb.0:
125; CHECK-NEXT:    local.get 0
126; CHECK-NEXT:    local.get 1
127; CHECK-NEXT:    i8x16.shr_s
128; CHECK-NEXT:    # fallthrough-return
129  %m = and i8 %x, 7
130  %t = insertelement <16 x i8> undef, i8 %m, i32 0
131  %s = shufflevector <16 x i8> %t, <16 x i8> undef,
132    <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,
133                i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
134  %a = ashr <16 x i8> %v, %s
135  ret <16 x i8> %a
136}
137
138define <16 x i8> @ashr_v16i8_late(<16 x i8> %v, i8 %x) {
139; CHECK-LABEL: ashr_v16i8_late:
140; CHECK:         .functype ashr_v16i8_late (v128, i32) -> (v128)
141; CHECK-NEXT:  # %bb.0:
142; CHECK-NEXT:    local.get 0
143; CHECK-NEXT:    local.get 1
144; CHECK-NEXT:    i8x16.shr_s
145; CHECK-NEXT:    # fallthrough-return
146  %t = insertelement <16 x i8> undef, i8 %x, i32 0
147  %s = shufflevector <16 x i8> %t, <16 x i8> undef,
148    <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,
149                i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
150  %m = and <16 x i8> %s, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,
151                          i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
152  %a = ashr <16 x i8> %v, %m
153  ret <16 x i8> %a
154}
155
156define <16 x i8> @lshr_v16i8(<16 x i8> %v, i8 %x) {
157; CHECK-LABEL: lshr_v16i8:
158; CHECK:         .functype lshr_v16i8 (v128, i32) -> (v128)
159; CHECK-NEXT:  # %bb.0:
160; CHECK-NEXT:    local.get 0
161; CHECK-NEXT:    local.get 1
162; CHECK-NEXT:    i8x16.shr_u
163; CHECK-NEXT:    # fallthrough-return
164  %m = and i8 %x, 7
165  %t = insertelement <16 x i8> undef, i8 %m, i32 0
166  %s = shufflevector <16 x i8> %t, <16 x i8> undef,
167    <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,
168                i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
169  %a = lshr <16 x i8> %v, %s
170  ret <16 x i8> %a
171}
172
173define <16 x i8> @lshr_v16i8_late(<16 x i8> %v, i8 %x) {
174; CHECK-LABEL: lshr_v16i8_late:
175; CHECK:         .functype lshr_v16i8_late (v128, i32) -> (v128)
176; CHECK-NEXT:  # %bb.0:
177; CHECK-NEXT:    local.get 0
178; CHECK-NEXT:    local.get 1
179; CHECK-NEXT:    i8x16.shr_u
180; CHECK-NEXT:    # fallthrough-return
181  %t = insertelement <16 x i8> undef, i8 %x, i32 0
182  %s = shufflevector <16 x i8> %t, <16 x i8> undef,
183    <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,
184                i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
185  %m = and <16 x i8> %s, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,
186                          i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
187  %a = lshr <16 x i8> %v, %m
188  ret <16 x i8> %a
189}
190
191define <8 x i16> @shl_v8i16(<8 x i16> %v, i16 %x) {
192; CHECK-LABEL: shl_v8i16:
193; CHECK:         .functype shl_v8i16 (v128, i32) -> (v128)
194; CHECK-NEXT:  # %bb.0:
195; CHECK-NEXT:    local.get 0
196; CHECK-NEXT:    local.get 1
197; CHECK-NEXT:    i16x8.shl
198; CHECK-NEXT:    # fallthrough-return
199  %m = and i16 %x, 15
200  %t = insertelement <8 x i16> undef, i16 %m, i32 0
201  %s = shufflevector <8 x i16> %t, <8 x i16> undef,
202    <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
203  %a = shl <8 x i16> %v, %s
204  ret <8 x i16> %a
205}
206
207define <8 x i16> @shl_v8i16_late(<8 x i16> %v, i16 %x) {
208; CHECK-LABEL: shl_v8i16_late:
209; CHECK:         .functype shl_v8i16_late (v128, i32) -> (v128)
210; CHECK-NEXT:  # %bb.0:
211; CHECK-NEXT:    local.get 0
212; CHECK-NEXT:    local.get 1
213; CHECK-NEXT:    i16x8.shl
214; CHECK-NEXT:    # fallthrough-return
215  %t = insertelement <8 x i16> undef, i16 %x, i32 0
216  %s = shufflevector <8 x i16> %t, <8 x i16> undef,
217    <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
218  %m = and <8 x i16> %s,
219    <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
220  %a = shl <8 x i16> %v, %m
221  ret <8 x i16> %a
222}
223
224define <8 x i16> @ashr_v8i16(<8 x i16> %v, i16 %x) {
225; CHECK-LABEL: ashr_v8i16:
226; CHECK:         .functype ashr_v8i16 (v128, i32) -> (v128)
227; CHECK-NEXT:  # %bb.0:
228; CHECK-NEXT:    local.get 0
229; CHECK-NEXT:    local.get 1
230; CHECK-NEXT:    i16x8.shr_s
231; CHECK-NEXT:    # fallthrough-return
232  %m = and i16 %x, 15
233  %t = insertelement <8 x i16> undef, i16 %m, i32 0
234  %s = shufflevector <8 x i16> %t, <8 x i16> undef,
235    <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
236  %a = ashr <8 x i16> %v, %s
237  ret <8 x i16> %a
238}
239
240define <8 x i16> @ashr_v8i16_late(<8 x i16> %v, i16 %x) {
241; CHECK-LABEL: ashr_v8i16_late:
242; CHECK:         .functype ashr_v8i16_late (v128, i32) -> (v128)
243; CHECK-NEXT:  # %bb.0:
244; CHECK-NEXT:    local.get 0
245; CHECK-NEXT:    local.get 1
246; CHECK-NEXT:    i16x8.shr_s
247; CHECK-NEXT:    # fallthrough-return
248  %t = insertelement <8 x i16> undef, i16 %x, i32 0
249  %s = shufflevector <8 x i16> %t, <8 x i16> undef,
250    <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
251  %m = and <8 x i16> %s,
252    <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
253  %a = ashr <8 x i16> %v, %m
254  ret <8 x i16> %a
255}
256
257define <8 x i16> @lshr_v8i16(<8 x i16> %v, i16 %x) {
258; CHECK-LABEL: lshr_v8i16:
259; CHECK:         .functype lshr_v8i16 (v128, i32) -> (v128)
260; CHECK-NEXT:  # %bb.0:
261; CHECK-NEXT:    local.get 0
262; CHECK-NEXT:    local.get 1
263; CHECK-NEXT:    i16x8.shr_u
264; CHECK-NEXT:    # fallthrough-return
265  %m = and i16 %x, 15
266  %t = insertelement <8 x i16> undef, i16 %m, i32 0
267  %s = shufflevector <8 x i16> %t, <8 x i16> undef,
268    <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
269  %a = lshr <8 x i16> %v, %s
270  ret <8 x i16> %a
271}
272
273define <8 x i16> @lshr_v8i16_late(<8 x i16> %v, i16 %x) {
274; CHECK-LABEL: lshr_v8i16_late:
275; CHECK:         .functype lshr_v8i16_late (v128, i32) -> (v128)
276; CHECK-NEXT:  # %bb.0:
277; CHECK-NEXT:    local.get 0
278; CHECK-NEXT:    local.get 1
279; CHECK-NEXT:    i16x8.shr_u
280; CHECK-NEXT:    # fallthrough-return
281  %t = insertelement <8 x i16> undef, i16 %x, i32 0
282  %s = shufflevector <8 x i16> %t, <8 x i16> undef,
283    <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
284  %m = and <8 x i16> %s,
285    <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
286  %a = lshr <8 x i16> %v, %m
287  ret <8 x i16> %a
288}
289
290define <4 x i32> @shl_v4i32(<4 x i32> %v, i32 %x) {
291; CHECK-LABEL: shl_v4i32:
292; CHECK:         .functype shl_v4i32 (v128, i32) -> (v128)
293; CHECK-NEXT:  # %bb.0:
294; CHECK-NEXT:    local.get 0
295; CHECK-NEXT:    local.get 1
296; CHECK-NEXT:    i32x4.shl
297; CHECK-NEXT:    # fallthrough-return
298  %m = and i32 %x, 31
299  %t = insertelement <4 x i32> undef, i32 %m, i32 0
300  %s = shufflevector <4 x i32> %t, <4 x i32> undef,
301    <4 x i32> <i32 0, i32 0, i32 0, i32 0>
302  %a = shl <4 x i32> %v, %s
303  ret <4 x i32> %a
304}
305
306define <4 x i32> @shl_v4i32_late(<4 x i32> %v, i32 %x) {
307; CHECK-LABEL: shl_v4i32_late:
308; CHECK:         .functype shl_v4i32_late (v128, i32) -> (v128)
309; CHECK-NEXT:  # %bb.0:
310; CHECK-NEXT:    local.get 0
311; CHECK-NEXT:    local.get 1
312; CHECK-NEXT:    i32x4.shl
313; CHECK-NEXT:    # fallthrough-return
314  %t = insertelement <4 x i32> undef, i32 %x, i32 0
315  %s = shufflevector <4 x i32> %t, <4 x i32> undef,
316    <4 x i32> <i32 0, i32 0, i32 0, i32 0>
317  %m = and <4 x i32> %s, <i32 31, i32 31, i32 31, i32 31>
318  %a = shl <4 x i32> %v, %m
319  ret <4 x i32> %a
320}
321
322define <4 x i32> @ashr_v4i32(<4 x i32> %v, i32 %x) {
323; CHECK-LABEL: ashr_v4i32:
324; CHECK:         .functype ashr_v4i32 (v128, i32) -> (v128)
325; CHECK-NEXT:  # %bb.0:
326; CHECK-NEXT:    local.get 0
327; CHECK-NEXT:    local.get 1
328; CHECK-NEXT:    i32x4.shr_s
329; CHECK-NEXT:    # fallthrough-return
330  %m = and i32 %x, 31
331  %t = insertelement <4 x i32> undef, i32 %m, i32 0
332  %s = shufflevector <4 x i32> %t, <4 x i32> undef,
333    <4 x i32> <i32 0, i32 0, i32 0, i32 0>
334  %a = ashr <4 x i32> %v, %s
335  ret <4 x i32> %a
336}
337
338define <4 x i32> @ashr_v4i32_late(<4 x i32> %v, i32 %x) {
339; CHECK-LABEL: ashr_v4i32_late:
340; CHECK:         .functype ashr_v4i32_late (v128, i32) -> (v128)
341; CHECK-NEXT:  # %bb.0:
342; CHECK-NEXT:    local.get 0
343; CHECK-NEXT:    local.get 1
344; CHECK-NEXT:    i32x4.shr_s
345; CHECK-NEXT:    # fallthrough-return
346  %t = insertelement <4 x i32> undef, i32 %x, i32 0
347  %s = shufflevector <4 x i32> %t, <4 x i32> undef,
348    <4 x i32> <i32 0, i32 0, i32 0, i32 0>
349  %m = and <4 x i32> %s, <i32 31, i32 31, i32 31, i32 31>
350  %a = ashr <4 x i32> %v, %m
351  ret <4 x i32> %a
352}
353
354define <4 x i32> @lshr_v4i32(<4 x i32> %v, i32 %x) {
355; CHECK-LABEL: lshr_v4i32:
356; CHECK:         .functype lshr_v4i32 (v128, i32) -> (v128)
357; CHECK-NEXT:  # %bb.0:
358; CHECK-NEXT:    local.get 0
359; CHECK-NEXT:    local.get 1
360; CHECK-NEXT:    i32x4.shr_u
361; CHECK-NEXT:    # fallthrough-return
362  %m = and i32 %x, 31
363  %t = insertelement <4 x i32> undef, i32 %m, i32 0
364  %s = shufflevector <4 x i32> %t, <4 x i32> undef,
365    <4 x i32> <i32 0, i32 0, i32 0, i32 0>
366  %a = lshr <4 x i32> %v, %s
367  ret <4 x i32> %a
368}
369
370define <4 x i32> @lshr_v4i32_late(<4 x i32> %v, i32 %x) {
371; CHECK-LABEL: lshr_v4i32_late:
372; CHECK:         .functype lshr_v4i32_late (v128, i32) -> (v128)
373; CHECK-NEXT:  # %bb.0:
374; CHECK-NEXT:    local.get 0
375; CHECK-NEXT:    local.get 1
376; CHECK-NEXT:    i32x4.shr_u
377; CHECK-NEXT:    # fallthrough-return
378  %t = insertelement <4 x i32> undef, i32 %x, i32 0
379  %s = shufflevector <4 x i32> %t, <4 x i32> undef,
380    <4 x i32> <i32 0, i32 0, i32 0, i32 0>
381  %m = and <4 x i32> %s, <i32 31, i32 31, i32 31, i32 31>
382  %a = lshr <4 x i32> %v, %m
383  ret <4 x i32> %a
384}
385
386define <2 x i64> @shl_v2i64(<2 x i64> %v, i64 %x) {
387; CHECK-LABEL: shl_v2i64:
388; CHECK:         .functype shl_v2i64 (v128, i64) -> (v128)
389; CHECK-NEXT:  # %bb.0:
390; CHECK-NEXT:    local.get 0
391; CHECK-NEXT:    local.get 1
392; CHECK-NEXT:    i32.wrap_i64
393; CHECK-NEXT:    i64x2.shl
394; CHECK-NEXT:    # fallthrough-return
395  %m = and i64 %x, 63
396  %t = insertelement <2 x i64> undef, i64 %m, i32 0
397  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
398  %a = shl <2 x i64> %v, %s
399  ret <2 x i64> %a
400}
401
402define <2 x i64> @shl_v2i64_late(<2 x i64> %v, i64 %x) {
403; CHECK-LABEL: shl_v2i64_late:
404; CHECK:         .functype shl_v2i64_late (v128, i64) -> (v128)
405; CHECK-NEXT:  # %bb.0:
406; CHECK-NEXT:    local.get 0
407; CHECK-NEXT:    local.get 1
408; CHECK-NEXT:    i32.wrap_i64
409; CHECK-NEXT:    i64x2.shl
410; CHECK-NEXT:    # fallthrough-return
411  %t = insertelement <2 x i64> undef, i64 %x, i32 0
412  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
413  %m = and <2 x i64> %s, <i64 63, i64 63>
414  %a = shl <2 x i64> %v, %m
415  ret <2 x i64> %a
416}
417
418define <2 x i64> @ashr_v2i64(<2 x i64> %v, i64 %x) {
419; CHECK-LABEL: ashr_v2i64:
420; CHECK:         .functype ashr_v2i64 (v128, i64) -> (v128)
421; CHECK-NEXT:  # %bb.0:
422; CHECK-NEXT:    local.get 0
423; CHECK-NEXT:    local.get 1
424; CHECK-NEXT:    i32.wrap_i64
425; CHECK-NEXT:    i64x2.shr_s
426; CHECK-NEXT:    # fallthrough-return
427  %m = and i64 %x, 63
428  %t = insertelement <2 x i64> undef, i64 %m, i32 0
429  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
430  %a = ashr <2 x i64> %v, %s
431  ret <2 x i64> %a
432}
433
434define <2 x i64> @ashr_v2i64_late(<2 x i64> %v, i64 %x) {
435; CHECK-LABEL: ashr_v2i64_late:
436; CHECK:         .functype ashr_v2i64_late (v128, i64) -> (v128)
437; CHECK-NEXT:  # %bb.0:
438; CHECK-NEXT:    local.get 0
439; CHECK-NEXT:    local.get 1
440; CHECK-NEXT:    i32.wrap_i64
441; CHECK-NEXT:    i64x2.shr_s
442; CHECK-NEXT:    # fallthrough-return
443  %t = insertelement <2 x i64> undef, i64 %x, i32 0
444  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
445  %m = and <2 x i64> %s, <i64 63, i64 63>
446  %a = ashr <2 x i64> %v, %m
447  ret <2 x i64> %a
448}
449
450define <2 x i64> @lshr_v2i64(<2 x i64> %v, i64 %x) {
451; CHECK-LABEL: lshr_v2i64:
452; CHECK:         .functype lshr_v2i64 (v128, i64) -> (v128)
453; CHECK-NEXT:  # %bb.0:
454; CHECK-NEXT:    local.get 0
455; CHECK-NEXT:    local.get 1
456; CHECK-NEXT:    i32.wrap_i64
457; CHECK-NEXT:    i64x2.shr_u
458; CHECK-NEXT:    # fallthrough-return
459  %m = and i64 %x, 63
460  %t = insertelement <2 x i64> undef, i64 %m, i32 0
461  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
462  %a = lshr <2 x i64> %v, %s
463  ret <2 x i64> %a
464}
465
466define <2 x i64> @lshr_v2i64_late(<2 x i64> %v, i64 %x) {
467; CHECK-LABEL: lshr_v2i64_late:
468; CHECK:         .functype lshr_v2i64_late (v128, i64) -> (v128)
469; CHECK-NEXT:  # %bb.0:
470; CHECK-NEXT:    local.get 0
471; CHECK-NEXT:    local.get 1
472; CHECK-NEXT:    i32.wrap_i64
473; CHECK-NEXT:    i64x2.shr_u
474; CHECK-NEXT:    # fallthrough-return
475  %t = insertelement <2 x i64> undef, i64 %x, i32 0
476  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
477  %m = and <2 x i64> %s, <i64 63, i64 63>
478  %a = lshr <2 x i64> %v, %m
479  ret <2 x i64> %a
480}
481
482define <2 x i64> @shl_v2i64_i32(<2 x i64> %v, i32 %x) {
483; CHECK-LABEL: shl_v2i64_i32:
484; CHECK:         .functype shl_v2i64_i32 (v128, i32) -> (v128)
485; CHECK-NEXT:  # %bb.0:
486; CHECK-NEXT:    local.get 0
487; CHECK-NEXT:    local.get 1
488; CHECK-NEXT:    i64x2.shl
489; CHECK-NEXT:    # fallthrough-return
490  %z = and i32 %x, 63
491  %m = zext i32 %z to i64
492  %t = insertelement <2 x i64> undef, i64 %m, i32 0
493  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
494  %a = shl <2 x i64> %v, %s
495  ret <2 x i64> %a
496}
497
498define <2 x i64> @shl_v2i64_i32_late(<2 x i64> %v, i32 %x) {
499; CHECK-LABEL: shl_v2i64_i32_late:
500; CHECK:         .functype shl_v2i64_i32_late (v128, i32) -> (v128)
501; CHECK-NEXT:  # %bb.0:
502; CHECK-NEXT:    local.get 0
503; CHECK-NEXT:    local.get 1
504; CHECK-NEXT:    i64x2.shl
505; CHECK-NEXT:    # fallthrough-return
506  %z = zext i32 %x to i64
507  %t = insertelement <2 x i64> undef, i64 %z, i32 0
508  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
509  %m = and <2 x i64> %s, <i64 63, i64 63>
510  %a = shl <2 x i64> %v, %m
511  ret <2 x i64> %a
512}
513
514define <2 x i64> @ashr_v2i64_i32(<2 x i64> %v, i32 %x) {
515; CHECK-LABEL: ashr_v2i64_i32:
516; CHECK:         .functype ashr_v2i64_i32 (v128, i32) -> (v128)
517; CHECK-NEXT:  # %bb.0:
518; CHECK-NEXT:    local.get 0
519; CHECK-NEXT:    local.get 1
520; CHECK-NEXT:    i64x2.shr_s
521; CHECK-NEXT:    # fallthrough-return
522  %z = and i32 %x, 63
523  %m = zext i32 %z to i64
524  %t = insertelement <2 x i64> undef, i64 %m, i32 0
525  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
526  %a = ashr <2 x i64> %v, %s
527  ret <2 x i64> %a
528}
529
530define <2 x i64> @ashr_v2i64_i32_late(<2 x i64> %v, i32 %x) {
531; CHECK-LABEL: ashr_v2i64_i32_late:
532; CHECK:         .functype ashr_v2i64_i32_late (v128, i32) -> (v128)
533; CHECK-NEXT:  # %bb.0:
534; CHECK-NEXT:    local.get 0
535; CHECK-NEXT:    local.get 1
536; CHECK-NEXT:    i64x2.shr_s
537; CHECK-NEXT:    # fallthrough-return
538  %z = zext i32 %x to i64
539  %t = insertelement <2 x i64> undef, i64 %z, i32 0
540  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
541  %m = and <2 x i64> %s, <i64 63, i64 63>
542  %a = ashr <2 x i64> %v, %m
543  ret <2 x i64> %a
544}
545
546define <2 x i64> @lshr_v2i64_i32(<2 x i64> %v, i32 %x) {
547; CHECK-LABEL: lshr_v2i64_i32:
548; CHECK:         .functype lshr_v2i64_i32 (v128, i32) -> (v128)
549; CHECK-NEXT:  # %bb.0:
550; CHECK-NEXT:    local.get 0
551; CHECK-NEXT:    local.get 1
552; CHECK-NEXT:    i64x2.shr_u
553; CHECK-NEXT:    # fallthrough-return
554  %z = and i32 %x, 63
555  %m = zext i32 %z to i64
556  %t = insertelement <2 x i64> undef, i64 %m, i32 0
557  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
558  %a = lshr <2 x i64> %v, %s
559  ret <2 x i64> %a
560}
561
562define <2 x i64> @lshr_v2i64_i32_late(<2 x i64> %v, i32 %x) {
563; CHECK-LABEL: lshr_v2i64_i32_late:
564; CHECK:         .functype lshr_v2i64_i32_late (v128, i32) -> (v128)
565; CHECK-NEXT:  # %bb.0:
566; CHECK-NEXT:    local.get 0
567; CHECK-NEXT:    local.get 1
568; CHECK-NEXT:    i64x2.shr_u
569; CHECK-NEXT:    # fallthrough-return
570  %z = zext i32 %x to i64
571  %t = insertelement <2 x i64> undef, i64 %z, i32 0
572  %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
573  %m = and <2 x i64> %s, <i64 63, i64 63>
574  %a = lshr <2 x i64> %v, %m
575  ret <2 x i64> %a
576}
577