xref: /llvm-project/llvm/test/CodeGen/WebAssembly/simd.ll (revision 5e79ae60a67726805fcc27081f67c41cbd8a1e4e)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128,+sign-ext | FileCheck %s --check-prefix=SIMD128
3; RUN: llc < %s -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s --check-prefix=NO-SIMD128
4
5; Test that basic SIMD128 vector manipulation operations assemble as expected.
6
7target triple = "wasm32-unknown-unknown"
8
9; ==============================================================================
10; 16 x i8
11; ==============================================================================
12define <16 x i8> @const_v16i8() {
13; SIMD128-LABEL: const_v16i8:
14; SIMD128:         .functype const_v16i8 () -> (v128)
15; SIMD128-NEXT:  # %bb.0:
16; SIMD128-NEXT:    v128.const $push0=, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
17; SIMD128-NEXT:    return $pop0
18;
19; NO-SIMD128-LABEL: const_v16i8:
20; NO-SIMD128:         .functype const_v16i8 (i32) -> ()
21; NO-SIMD128-NEXT:  # %bb.0:
22; NO-SIMD128-NEXT:    i64.const $push0=, 1084818905618843912
23; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
24; NO-SIMD128-NEXT:    i64.const $push1=, 506097522914230528
25; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
26; NO-SIMD128-NEXT:    return
27  ret <16 x i8> <i8 00, i8 01, i8 02, i8 03, i8 04, i8 05, i8 06, i8 07,
28                 i8 08, i8 09, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>
29}
30
31define <16 x i8> @splat_v16i8(i8 %x) {
32; SIMD128-LABEL: splat_v16i8:
33; SIMD128:         .functype splat_v16i8 (i32) -> (v128)
34; SIMD128-NEXT:  # %bb.0:
35; SIMD128-NEXT:    i8x16.splat $push0=, $0
36; SIMD128-NEXT:    return $pop0
37;
38; NO-SIMD128-LABEL: splat_v16i8:
39; NO-SIMD128:         .functype splat_v16i8 (i32, i32) -> ()
40; NO-SIMD128-NEXT:  # %bb.0:
41; NO-SIMD128-NEXT:    i32.store8 15($0), $1
42; NO-SIMD128-NEXT:    i32.store8 14($0), $1
43; NO-SIMD128-NEXT:    i32.store8 13($0), $1
44; NO-SIMD128-NEXT:    i32.store8 12($0), $1
45; NO-SIMD128-NEXT:    i32.store8 11($0), $1
46; NO-SIMD128-NEXT:    i32.store8 10($0), $1
47; NO-SIMD128-NEXT:    i32.store8 9($0), $1
48; NO-SIMD128-NEXT:    i32.store8 8($0), $1
49; NO-SIMD128-NEXT:    i32.store8 7($0), $1
50; NO-SIMD128-NEXT:    i32.store8 6($0), $1
51; NO-SIMD128-NEXT:    i32.store8 5($0), $1
52; NO-SIMD128-NEXT:    i32.store8 4($0), $1
53; NO-SIMD128-NEXT:    i32.store8 3($0), $1
54; NO-SIMD128-NEXT:    i32.store8 2($0), $1
55; NO-SIMD128-NEXT:    i32.store8 1($0), $1
56; NO-SIMD128-NEXT:    i32.store8 0($0), $1
57; NO-SIMD128-NEXT:    return
58  %v = insertelement <16 x i8> undef, i8 %x, i32 0
59  %res = shufflevector <16 x i8> %v, <16 x i8> undef,
60    <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,
61                i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
62  ret <16 x i8> %res
63}
64
65define <16 x i8> @const_splat_v16i8() {
66; SIMD128-LABEL: const_splat_v16i8:
67; SIMD128:         .functype const_splat_v16i8 () -> (v128)
68; SIMD128-NEXT:  # %bb.0:
69; SIMD128-NEXT:    v128.const $push0=, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42
70; SIMD128-NEXT:    return $pop0
71;
72; NO-SIMD128-LABEL: const_splat_v16i8:
73; NO-SIMD128:         .functype const_splat_v16i8 (i32) -> ()
74; NO-SIMD128-NEXT:  # %bb.0:
75; NO-SIMD128-NEXT:    i64.const $push0=, 3038287259199220266
76; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
77; NO-SIMD128-NEXT:    i64.const $push1=, 3038287259199220266
78; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
79; NO-SIMD128-NEXT:    return
80  ret <16 x i8> <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42,
81                 i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>
82}
83
84define i32 @extract_v16i8_s(<16 x i8> %v) {
85; SIMD128-LABEL: extract_v16i8_s:
86; SIMD128:         .functype extract_v16i8_s (v128) -> (i32)
87; SIMD128-NEXT:  # %bb.0:
88; SIMD128-NEXT:    i8x16.extract_lane_s $push0=, $0, 13
89; SIMD128-NEXT:    return $pop0
90;
91; NO-SIMD128-LABEL: extract_v16i8_s:
92; NO-SIMD128:         .functype extract_v16i8_s (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
93; NO-SIMD128-NEXT:  # %bb.0:
94; NO-SIMD128-NEXT:    i32.extend8_s $push0=, $13
95; NO-SIMD128-NEXT:    return $pop0
96  %elem = extractelement <16 x i8> %v, i8 13
97  %a = sext i8 %elem to i32
98  ret i32 %a
99}
100
101define i32 @extract_var_v16i8_s(<16 x i8> %v, i32 %i) {
102; SIMD128-LABEL: extract_var_v16i8_s:
103; SIMD128:         .functype extract_var_v16i8_s (v128, i32) -> (i32)
104; SIMD128-NEXT:  # %bb.0:
105; SIMD128-NEXT:    global.get $push4=, __stack_pointer
106; SIMD128-NEXT:    i32.const $push5=, 16
107; SIMD128-NEXT:    i32.sub $push7=, $pop4, $pop5
108; SIMD128-NEXT:    local.tee $push6=, $2=, $pop7
109; SIMD128-NEXT:    v128.store 0($pop6), $0
110; SIMD128-NEXT:    i32.const $push0=, 15
111; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
112; SIMD128-NEXT:    i32.or $push2=, $2, $pop1
113; SIMD128-NEXT:    i32.load8_s $push3=, 0($pop2)
114; SIMD128-NEXT:    return $pop3
115;
116; NO-SIMD128-LABEL: extract_var_v16i8_s:
117; NO-SIMD128:         .functype extract_var_v16i8_s (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
118; NO-SIMD128-NEXT:  # %bb.0:
119; NO-SIMD128-NEXT:    global.get $push4=, __stack_pointer
120; NO-SIMD128-NEXT:    i32.const $push5=, 16
121; NO-SIMD128-NEXT:    i32.sub $push7=, $pop4, $pop5
122; NO-SIMD128-NEXT:    local.tee $push6=, $17=, $pop7
123; NO-SIMD128-NEXT:    i32.store8 15($pop6), $15
124; NO-SIMD128-NEXT:    i32.store8 14($17), $14
125; NO-SIMD128-NEXT:    i32.store8 13($17), $13
126; NO-SIMD128-NEXT:    i32.store8 12($17), $12
127; NO-SIMD128-NEXT:    i32.store8 11($17), $11
128; NO-SIMD128-NEXT:    i32.store8 10($17), $10
129; NO-SIMD128-NEXT:    i32.store8 9($17), $9
130; NO-SIMD128-NEXT:    i32.store8 8($17), $8
131; NO-SIMD128-NEXT:    i32.store8 7($17), $7
132; NO-SIMD128-NEXT:    i32.store8 6($17), $6
133; NO-SIMD128-NEXT:    i32.store8 5($17), $5
134; NO-SIMD128-NEXT:    i32.store8 4($17), $4
135; NO-SIMD128-NEXT:    i32.store8 3($17), $3
136; NO-SIMD128-NEXT:    i32.store8 2($17), $2
137; NO-SIMD128-NEXT:    i32.store8 1($17), $1
138; NO-SIMD128-NEXT:    i32.store8 0($17), $0
139; NO-SIMD128-NEXT:    i32.const $push0=, 15
140; NO-SIMD128-NEXT:    i32.and $push1=, $16, $pop0
141; NO-SIMD128-NEXT:    i32.or $push2=, $17, $pop1
142; NO-SIMD128-NEXT:    i32.load8_s $push3=, 0($pop2)
143; NO-SIMD128-NEXT:    return $pop3
144  %elem = extractelement <16 x i8> %v, i32 %i
145  %a = sext i8 %elem to i32
146  ret i32 %a
147}
148
149define i32 @extract_undef_v16i8_s(<16 x i8> %v) {
150; SIMD128-LABEL: extract_undef_v16i8_s:
151; SIMD128:         .functype extract_undef_v16i8_s (v128) -> (i32)
152; SIMD128-NEXT:  # %bb.0:
153; SIMD128-NEXT:    i8x16.extract_lane_s $push0=, $0, 0
154; SIMD128-NEXT:    return $pop0
155;
156; NO-SIMD128-LABEL: extract_undef_v16i8_s:
157; NO-SIMD128:         .functype extract_undef_v16i8_s (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
158; NO-SIMD128-NEXT:  # %bb.0:
159; NO-SIMD128-NEXT:    i32.extend8_s $push0=, $0
160; NO-SIMD128-NEXT:    return $pop0
161  %elem = extractelement <16 x i8> %v, i8 undef
162  %a = sext i8 %elem to i32
163  ret i32 %a
164}
165
166define i32 @extract_v16i8_u(<16 x i8> %v) {
167; SIMD128-LABEL: extract_v16i8_u:
168; SIMD128:         .functype extract_v16i8_u (v128) -> (i32)
169; SIMD128-NEXT:  # %bb.0:
170; SIMD128-NEXT:    i8x16.extract_lane_u $push0=, $0, 13
171; SIMD128-NEXT:    return $pop0
172;
173; NO-SIMD128-LABEL: extract_v16i8_u:
174; NO-SIMD128:         .functype extract_v16i8_u (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
175; NO-SIMD128-NEXT:  # %bb.0:
176; NO-SIMD128-NEXT:    i32.const $push0=, 255
177; NO-SIMD128-NEXT:    i32.and $push1=, $13, $pop0
178; NO-SIMD128-NEXT:    return $pop1
179  %elem = extractelement <16 x i8> %v, i8 13
180  %a = zext i8 %elem to i32
181  ret i32 %a
182}
183
184define i32 @extract_var_v16i8_u(<16 x i8> %v, i32 %i) {
185; SIMD128-LABEL: extract_var_v16i8_u:
186; SIMD128:         .functype extract_var_v16i8_u (v128, i32) -> (i32)
187; SIMD128-NEXT:  # %bb.0:
188; SIMD128-NEXT:    global.get $push4=, __stack_pointer
189; SIMD128-NEXT:    i32.const $push5=, 16
190; SIMD128-NEXT:    i32.sub $push7=, $pop4, $pop5
191; SIMD128-NEXT:    local.tee $push6=, $2=, $pop7
192; SIMD128-NEXT:    v128.store 0($pop6), $0
193; SIMD128-NEXT:    i32.const $push0=, 15
194; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
195; SIMD128-NEXT:    i32.or $push2=, $2, $pop1
196; SIMD128-NEXT:    i32.load8_u $push3=, 0($pop2)
197; SIMD128-NEXT:    return $pop3
198;
199; NO-SIMD128-LABEL: extract_var_v16i8_u:
200; NO-SIMD128:         .functype extract_var_v16i8_u (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
201; NO-SIMD128-NEXT:  # %bb.0:
202; NO-SIMD128-NEXT:    global.get $push4=, __stack_pointer
203; NO-SIMD128-NEXT:    i32.const $push5=, 16
204; NO-SIMD128-NEXT:    i32.sub $push7=, $pop4, $pop5
205; NO-SIMD128-NEXT:    local.tee $push6=, $17=, $pop7
206; NO-SIMD128-NEXT:    i32.store8 15($pop6), $15
207; NO-SIMD128-NEXT:    i32.store8 14($17), $14
208; NO-SIMD128-NEXT:    i32.store8 13($17), $13
209; NO-SIMD128-NEXT:    i32.store8 12($17), $12
210; NO-SIMD128-NEXT:    i32.store8 11($17), $11
211; NO-SIMD128-NEXT:    i32.store8 10($17), $10
212; NO-SIMD128-NEXT:    i32.store8 9($17), $9
213; NO-SIMD128-NEXT:    i32.store8 8($17), $8
214; NO-SIMD128-NEXT:    i32.store8 7($17), $7
215; NO-SIMD128-NEXT:    i32.store8 6($17), $6
216; NO-SIMD128-NEXT:    i32.store8 5($17), $5
217; NO-SIMD128-NEXT:    i32.store8 4($17), $4
218; NO-SIMD128-NEXT:    i32.store8 3($17), $3
219; NO-SIMD128-NEXT:    i32.store8 2($17), $2
220; NO-SIMD128-NEXT:    i32.store8 1($17), $1
221; NO-SIMD128-NEXT:    i32.store8 0($17), $0
222; NO-SIMD128-NEXT:    i32.const $push0=, 15
223; NO-SIMD128-NEXT:    i32.and $push1=, $16, $pop0
224; NO-SIMD128-NEXT:    i32.or $push2=, $17, $pop1
225; NO-SIMD128-NEXT:    i32.load8_u $push3=, 0($pop2)
226; NO-SIMD128-NEXT:    return $pop3
227  %elem = extractelement <16 x i8> %v, i32 %i
228  %a = zext i8 %elem to i32
229  ret i32 %a
230}
231
232define i32 @extract_undef_v16i8_u(<16 x i8> %v) {
233; SIMD128-LABEL: extract_undef_v16i8_u:
234; SIMD128:         .functype extract_undef_v16i8_u (v128) -> (i32)
235; SIMD128-NEXT:  # %bb.0:
236; SIMD128-NEXT:    i8x16.extract_lane_u $push0=, $0, 0
237; SIMD128-NEXT:    return $pop0
238;
239; NO-SIMD128-LABEL: extract_undef_v16i8_u:
240; NO-SIMD128:         .functype extract_undef_v16i8_u (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
241; NO-SIMD128-NEXT:  # %bb.0:
242; NO-SIMD128-NEXT:    i32.const $push0=, 255
243; NO-SIMD128-NEXT:    i32.and $push1=, $0, $pop0
244; NO-SIMD128-NEXT:    return $pop1
245  %elem = extractelement <16 x i8> %v, i8 undef
246  %a = zext i8 %elem to i32
247  ret i32 %a
248}
249
250define i8 @extract_v16i8(<16 x i8> %v) {
251; SIMD128-LABEL: extract_v16i8:
252; SIMD128:         .functype extract_v16i8 (v128) -> (i32)
253; SIMD128-NEXT:  # %bb.0:
254; SIMD128-NEXT:    i8x16.extract_lane_u $push0=, $0, 13
255; SIMD128-NEXT:    return $pop0
256;
257; NO-SIMD128-LABEL: extract_v16i8:
258; NO-SIMD128:         .functype extract_v16i8 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
259; NO-SIMD128-NEXT:  # %bb.0:
260; NO-SIMD128-NEXT:    return $13
261  %elem = extractelement <16 x i8> %v, i8 13
262  ret i8 %elem
263}
264
265define i8 @extract_var_v16i8(<16 x i8> %v, i32 %i) {
266; SIMD128-LABEL: extract_var_v16i8:
267; SIMD128:         .functype extract_var_v16i8 (v128, i32) -> (i32)
268; SIMD128-NEXT:  # %bb.0:
269; SIMD128-NEXT:    global.get $push4=, __stack_pointer
270; SIMD128-NEXT:    i32.const $push5=, 16
271; SIMD128-NEXT:    i32.sub $push7=, $pop4, $pop5
272; SIMD128-NEXT:    local.tee $push6=, $2=, $pop7
273; SIMD128-NEXT:    v128.store 0($pop6), $0
274; SIMD128-NEXT:    i32.const $push0=, 15
275; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
276; SIMD128-NEXT:    i32.or $push2=, $2, $pop1
277; SIMD128-NEXT:    i32.load8_u $push3=, 0($pop2)
278; SIMD128-NEXT:    return $pop3
279;
280; NO-SIMD128-LABEL: extract_var_v16i8:
281; NO-SIMD128:         .functype extract_var_v16i8 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
282; NO-SIMD128-NEXT:  # %bb.0:
283; NO-SIMD128-NEXT:    global.get $push4=, __stack_pointer
284; NO-SIMD128-NEXT:    i32.const $push5=, 16
285; NO-SIMD128-NEXT:    i32.sub $push7=, $pop4, $pop5
286; NO-SIMD128-NEXT:    local.tee $push6=, $17=, $pop7
287; NO-SIMD128-NEXT:    i32.store8 15($pop6), $15
288; NO-SIMD128-NEXT:    i32.store8 14($17), $14
289; NO-SIMD128-NEXT:    i32.store8 13($17), $13
290; NO-SIMD128-NEXT:    i32.store8 12($17), $12
291; NO-SIMD128-NEXT:    i32.store8 11($17), $11
292; NO-SIMD128-NEXT:    i32.store8 10($17), $10
293; NO-SIMD128-NEXT:    i32.store8 9($17), $9
294; NO-SIMD128-NEXT:    i32.store8 8($17), $8
295; NO-SIMD128-NEXT:    i32.store8 7($17), $7
296; NO-SIMD128-NEXT:    i32.store8 6($17), $6
297; NO-SIMD128-NEXT:    i32.store8 5($17), $5
298; NO-SIMD128-NEXT:    i32.store8 4($17), $4
299; NO-SIMD128-NEXT:    i32.store8 3($17), $3
300; NO-SIMD128-NEXT:    i32.store8 2($17), $2
301; NO-SIMD128-NEXT:    i32.store8 1($17), $1
302; NO-SIMD128-NEXT:    i32.store8 0($17), $0
303; NO-SIMD128-NEXT:    i32.const $push0=, 15
304; NO-SIMD128-NEXT:    i32.and $push1=, $16, $pop0
305; NO-SIMD128-NEXT:    i32.or $push2=, $17, $pop1
306; NO-SIMD128-NEXT:    i32.load8_u $push3=, 0($pop2)
307; NO-SIMD128-NEXT:    return $pop3
308  %elem = extractelement <16 x i8> %v, i32 %i
309  ret i8 %elem
310}
311
312define i8 @extract_undef_v16i8(<16 x i8> %v) {
313; SIMD128-LABEL: extract_undef_v16i8:
314; SIMD128:         .functype extract_undef_v16i8 (v128) -> (i32)
315; SIMD128-NEXT:  # %bb.0:
316; SIMD128-NEXT:    i8x16.extract_lane_u $push0=, $0, 0
317; SIMD128-NEXT:    return $pop0
318;
319; NO-SIMD128-LABEL: extract_undef_v16i8:
320; NO-SIMD128:         .functype extract_undef_v16i8 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
321; NO-SIMD128-NEXT:  # %bb.0:
322; NO-SIMD128-NEXT:    return $0
323  %elem = extractelement <16 x i8> %v, i8 undef
324  ret i8 %elem
325}
326
327define <16 x i8> @replace_v16i8(<16 x i8> %v, i8 %x) {
328; SIMD128-LABEL: replace_v16i8:
329; SIMD128:         .functype replace_v16i8 (v128, i32) -> (v128)
330; SIMD128-NEXT:  # %bb.0:
331; SIMD128-NEXT:    i8x16.replace_lane $push0=, $0, 11, $1
332; SIMD128-NEXT:    return $pop0
333;
334; NO-SIMD128-LABEL: replace_v16i8:
335; NO-SIMD128:         .functype replace_v16i8 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
336; NO-SIMD128-NEXT:  # %bb.0:
337; NO-SIMD128-NEXT:    i32.store8 15($0), $16
338; NO-SIMD128-NEXT:    i32.store8 14($0), $15
339; NO-SIMD128-NEXT:    i32.store8 13($0), $14
340; NO-SIMD128-NEXT:    i32.store8 12($0), $13
341; NO-SIMD128-NEXT:    i32.store8 11($0), $17
342; NO-SIMD128-NEXT:    i32.store8 10($0), $11
343; NO-SIMD128-NEXT:    i32.store8 9($0), $10
344; NO-SIMD128-NEXT:    i32.store8 8($0), $9
345; NO-SIMD128-NEXT:    i32.store8 7($0), $8
346; NO-SIMD128-NEXT:    i32.store8 6($0), $7
347; NO-SIMD128-NEXT:    i32.store8 5($0), $6
348; NO-SIMD128-NEXT:    i32.store8 4($0), $5
349; NO-SIMD128-NEXT:    i32.store8 3($0), $4
350; NO-SIMD128-NEXT:    i32.store8 2($0), $3
351; NO-SIMD128-NEXT:    i32.store8 1($0), $2
352; NO-SIMD128-NEXT:    i32.store8 0($0), $1
353; NO-SIMD128-NEXT:    return
354  %res = insertelement <16 x i8> %v, i8 %x, i32 11
355  ret <16 x i8> %res
356}
357
358define <16 x i8> @replace_var_v16i8(<16 x i8> %v, i32 %i, i8 %x) {
359; SIMD128-LABEL: replace_var_v16i8:
360; SIMD128:         .functype replace_var_v16i8 (v128, i32, i32) -> (v128)
361; SIMD128-NEXT:  # %bb.0:
362; SIMD128-NEXT:    global.get $push4=, __stack_pointer
363; SIMD128-NEXT:    i32.const $push5=, 16
364; SIMD128-NEXT:    i32.sub $push7=, $pop4, $pop5
365; SIMD128-NEXT:    local.tee $push6=, $3=, $pop7
366; SIMD128-NEXT:    v128.store 0($pop6), $0
367; SIMD128-NEXT:    i32.const $push0=, 15
368; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
369; SIMD128-NEXT:    i32.or $push2=, $3, $pop1
370; SIMD128-NEXT:    i32.store8 0($pop2), $2
371; SIMD128-NEXT:    v128.load $push3=, 0($3)
372; SIMD128-NEXT:    return $pop3
373;
374; NO-SIMD128-LABEL: replace_var_v16i8:
375; NO-SIMD128:         .functype replace_var_v16i8 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
376; NO-SIMD128-NEXT:  # %bb.0:
377; NO-SIMD128-NEXT:    global.get $push5=, __stack_pointer
378; NO-SIMD128-NEXT:    i32.const $push6=, 16
379; NO-SIMD128-NEXT:    i32.sub $push8=, $pop5, $pop6
380; NO-SIMD128-NEXT:    local.tee $push7=, $19=, $pop8
381; NO-SIMD128-NEXT:    i32.store8 15($pop7), $16
382; NO-SIMD128-NEXT:    i32.store8 14($19), $15
383; NO-SIMD128-NEXT:    i32.store8 13($19), $14
384; NO-SIMD128-NEXT:    i32.store8 12($19), $13
385; NO-SIMD128-NEXT:    i32.store8 11($19), $12
386; NO-SIMD128-NEXT:    i32.store8 10($19), $11
387; NO-SIMD128-NEXT:    i32.store8 9($19), $10
388; NO-SIMD128-NEXT:    i32.store8 8($19), $9
389; NO-SIMD128-NEXT:    i32.store8 7($19), $8
390; NO-SIMD128-NEXT:    i32.store8 6($19), $7
391; NO-SIMD128-NEXT:    i32.store8 5($19), $6
392; NO-SIMD128-NEXT:    i32.store8 4($19), $5
393; NO-SIMD128-NEXT:    i32.store8 3($19), $4
394; NO-SIMD128-NEXT:    i32.store8 2($19), $3
395; NO-SIMD128-NEXT:    i32.store8 1($19), $2
396; NO-SIMD128-NEXT:    i32.store8 0($19), $1
397; NO-SIMD128-NEXT:    i32.const $push0=, 15
398; NO-SIMD128-NEXT:    i32.and $push1=, $17, $pop0
399; NO-SIMD128-NEXT:    i32.or $push2=, $19, $pop1
400; NO-SIMD128-NEXT:    i32.store8 0($pop2), $18
401; NO-SIMD128-NEXT:    i64.load $push3=, 8($19)
402; NO-SIMD128-NEXT:    i64.store 8($0), $pop3
403; NO-SIMD128-NEXT:    i64.load $push4=, 0($19)
404; NO-SIMD128-NEXT:    i64.store 0($0), $pop4
405; NO-SIMD128-NEXT:    return
406  %res = insertelement <16 x i8> %v, i8 %x, i32 %i
407  ret <16 x i8> %res
408}
409
410define <16 x i8> @replace_zero_v16i8(<16 x i8> %v, i8 %x) {
411; SIMD128-LABEL: replace_zero_v16i8:
412; SIMD128:         .functype replace_zero_v16i8 (v128, i32) -> (v128)
413; SIMD128-NEXT:  # %bb.0:
414; SIMD128-NEXT:    i8x16.replace_lane $push0=, $0, 0, $1
415; SIMD128-NEXT:    return $pop0
416;
417; NO-SIMD128-LABEL: replace_zero_v16i8:
418; NO-SIMD128:         .functype replace_zero_v16i8 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
419; NO-SIMD128-NEXT:  # %bb.0:
420; NO-SIMD128-NEXT:    i32.store8 15($0), $16
421; NO-SIMD128-NEXT:    i32.store8 14($0), $15
422; NO-SIMD128-NEXT:    i32.store8 13($0), $14
423; NO-SIMD128-NEXT:    i32.store8 12($0), $13
424; NO-SIMD128-NEXT:    i32.store8 11($0), $12
425; NO-SIMD128-NEXT:    i32.store8 10($0), $11
426; NO-SIMD128-NEXT:    i32.store8 9($0), $10
427; NO-SIMD128-NEXT:    i32.store8 8($0), $9
428; NO-SIMD128-NEXT:    i32.store8 7($0), $8
429; NO-SIMD128-NEXT:    i32.store8 6($0), $7
430; NO-SIMD128-NEXT:    i32.store8 5($0), $6
431; NO-SIMD128-NEXT:    i32.store8 4($0), $5
432; NO-SIMD128-NEXT:    i32.store8 3($0), $4
433; NO-SIMD128-NEXT:    i32.store8 2($0), $3
434; NO-SIMD128-NEXT:    i32.store8 1($0), $2
435; NO-SIMD128-NEXT:    i32.store8 0($0), $17
436; NO-SIMD128-NEXT:    return
437  %res = insertelement <16 x i8> %v, i8 %x, i32 0
438  ret <16 x i8> %res
439}
440
441define <16 x i8> @shuffle_v16i8(<16 x i8> %x, <16 x i8> %y) {
442; SIMD128-LABEL: shuffle_v16i8:
443; SIMD128:         .functype shuffle_v16i8 (v128, v128) -> (v128)
444; SIMD128-NEXT:  # %bb.0:
445; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $1, 0, 17, 2, 19, 4, 21, 6, 23, 8, 25, 10, 27, 12, 29, 14, 31
446; SIMD128-NEXT:    return $pop0
447;
448; NO-SIMD128-LABEL: shuffle_v16i8:
449; NO-SIMD128:         .functype shuffle_v16i8 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
450; NO-SIMD128-NEXT:  # %bb.0:
451; NO-SIMD128-NEXT:    i32.store8 15($0), $32
452; NO-SIMD128-NEXT:    i32.store8 14($0), $15
453; NO-SIMD128-NEXT:    i32.store8 13($0), $30
454; NO-SIMD128-NEXT:    i32.store8 12($0), $13
455; NO-SIMD128-NEXT:    i32.store8 11($0), $28
456; NO-SIMD128-NEXT:    i32.store8 10($0), $11
457; NO-SIMD128-NEXT:    i32.store8 9($0), $26
458; NO-SIMD128-NEXT:    i32.store8 8($0), $9
459; NO-SIMD128-NEXT:    i32.store8 7($0), $24
460; NO-SIMD128-NEXT:    i32.store8 6($0), $7
461; NO-SIMD128-NEXT:    i32.store8 5($0), $22
462; NO-SIMD128-NEXT:    i32.store8 4($0), $5
463; NO-SIMD128-NEXT:    i32.store8 3($0), $20
464; NO-SIMD128-NEXT:    i32.store8 2($0), $3
465; NO-SIMD128-NEXT:    i32.store8 1($0), $18
466; NO-SIMD128-NEXT:    i32.store8 0($0), $1
467; NO-SIMD128-NEXT:    return
468  %res = shufflevector <16 x i8> %x, <16 x i8> %y,
469    <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 4, i32 21, i32 6, i32 23,
470                i32 8, i32 25, i32 10, i32 27, i32 12, i32 29, i32 14, i32 31>
471  ret <16 x i8> %res
472}
473
474define <16 x i8> @shuffle_undef_v16i8(<16 x i8> %x, <16 x i8> %y) {
475; SIMD128-LABEL: shuffle_undef_v16i8:
476; SIMD128:         .functype shuffle_undef_v16i8 (v128, v128) -> (v128)
477; SIMD128-NEXT:  # %bb.0:
478; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
479; SIMD128-NEXT:    return $pop0
480;
481; NO-SIMD128-LABEL: shuffle_undef_v16i8:
482; NO-SIMD128:         .functype shuffle_undef_v16i8 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
483; NO-SIMD128-NEXT:  # %bb.0:
484; NO-SIMD128-NEXT:    i32.store8 0($0), $2
485; NO-SIMD128-NEXT:    return
486  %res = shufflevector <16 x i8> %x, <16 x i8> %y,
487    <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef,
488                i32 undef, i32 undef, i32 undef, i32 undef,
489                i32 undef, i32 undef, i32 undef, i32 undef,
490                i32 undef, i32 undef, i32 undef, i32 undef>
491  ret <16 x i8> %res
492}
493
494define <16 x i8> @build_v16i8(i8 %x0, i8 %x1, i8 %x2, i8 %x3,
495; SIMD128-LABEL: build_v16i8:
496; SIMD128:         .functype build_v16i8 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (v128)
497; SIMD128-NEXT:  # %bb.0:
498; SIMD128-NEXT:    i8x16.splat $push0=, $0
499; SIMD128-NEXT:    i8x16.replace_lane $push1=, $pop0, 1, $1
500; SIMD128-NEXT:    i8x16.replace_lane $push2=, $pop1, 2, $2
501; SIMD128-NEXT:    i8x16.replace_lane $push3=, $pop2, 3, $3
502; SIMD128-NEXT:    i8x16.replace_lane $push4=, $pop3, 4, $4
503; SIMD128-NEXT:    i8x16.replace_lane $push5=, $pop4, 5, $5
504; SIMD128-NEXT:    i8x16.replace_lane $push6=, $pop5, 6, $6
505; SIMD128-NEXT:    i8x16.replace_lane $push7=, $pop6, 7, $7
506; SIMD128-NEXT:    i8x16.replace_lane $push8=, $pop7, 8, $8
507; SIMD128-NEXT:    i8x16.replace_lane $push9=, $pop8, 9, $9
508; SIMD128-NEXT:    i8x16.replace_lane $push10=, $pop9, 10, $10
509; SIMD128-NEXT:    i8x16.replace_lane $push11=, $pop10, 11, $11
510; SIMD128-NEXT:    i8x16.replace_lane $push12=, $pop11, 12, $12
511; SIMD128-NEXT:    i8x16.replace_lane $push13=, $pop12, 13, $13
512; SIMD128-NEXT:    i8x16.replace_lane $push14=, $pop13, 14, $14
513; SIMD128-NEXT:    i8x16.replace_lane $push15=, $pop14, 15, $15
514; SIMD128-NEXT:    return $pop15
515;
516; NO-SIMD128-LABEL: build_v16i8:
517; NO-SIMD128:         .functype build_v16i8 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
518; NO-SIMD128-NEXT:  # %bb.0:
519; NO-SIMD128-NEXT:    i32.store8 15($0), $16
520; NO-SIMD128-NEXT:    i32.store8 14($0), $15
521; NO-SIMD128-NEXT:    i32.store8 13($0), $14
522; NO-SIMD128-NEXT:    i32.store8 12($0), $13
523; NO-SIMD128-NEXT:    i32.store8 11($0), $12
524; NO-SIMD128-NEXT:    i32.store8 10($0), $11
525; NO-SIMD128-NEXT:    i32.store8 9($0), $10
526; NO-SIMD128-NEXT:    i32.store8 8($0), $9
527; NO-SIMD128-NEXT:    i32.store8 7($0), $8
528; NO-SIMD128-NEXT:    i32.store8 6($0), $7
529; NO-SIMD128-NEXT:    i32.store8 5($0), $6
530; NO-SIMD128-NEXT:    i32.store8 4($0), $5
531; NO-SIMD128-NEXT:    i32.store8 3($0), $4
532; NO-SIMD128-NEXT:    i32.store8 2($0), $3
533; NO-SIMD128-NEXT:    i32.store8 1($0), $2
534; NO-SIMD128-NEXT:    i32.store8 0($0), $1
535; NO-SIMD128-NEXT:    return
536                              i8 %x4, i8 %x5, i8 %x6, i8 %x7,
537                              i8 %x8, i8 %x9, i8 %x10, i8 %x11,
538                              i8 %x12, i8 %x13, i8 %x14, i8 %x15) {
539  %t0 = insertelement <16 x i8> undef, i8 %x0, i32 0
540  %t1 = insertelement <16 x i8> %t0, i8 %x1, i32 1
541  %t2 = insertelement <16 x i8> %t1, i8 %x2, i32 2
542  %t3 = insertelement <16 x i8> %t2, i8 %x3, i32 3
543  %t4 = insertelement <16 x i8> %t3, i8 %x4, i32 4
544  %t5 = insertelement <16 x i8> %t4, i8 %x5, i32 5
545  %t6 = insertelement <16 x i8> %t5, i8 %x6, i32 6
546  %t7 = insertelement <16 x i8> %t6, i8 %x7, i32 7
547  %t8 = insertelement <16 x i8> %t7, i8 %x8, i32 8
548  %t9 = insertelement <16 x i8> %t8, i8 %x9, i32 9
549  %t10 = insertelement <16 x i8> %t9, i8 %x10, i32 10
550  %t11 = insertelement <16 x i8> %t10, i8 %x11, i32 11
551  %t12 = insertelement <16 x i8> %t11, i8 %x12, i32 12
552  %t13 = insertelement <16 x i8> %t12, i8 %x13, i32 13
553  %t14 = insertelement <16 x i8> %t13, i8 %x14, i32 14
554  %res = insertelement <16 x i8> %t14, i8 %x15, i32 15
555  ret <16 x i8> %res
556}
557
558; ==============================================================================
559; 8 x i16
560; ==============================================================================
561define <8 x i16> @const_v8i16() {
562; SIMD128-LABEL: const_v8i16:
563; SIMD128:         .functype const_v8i16 () -> (v128)
564; SIMD128-NEXT:  # %bb.0:
565; SIMD128-NEXT:    v128.const $push0=, 256, 770, 1284, 1798, 2312, 2826, 3340, 3854
566; SIMD128-NEXT:    return $pop0
567;
568; NO-SIMD128-LABEL: const_v8i16:
569; NO-SIMD128:         .functype const_v8i16 (i32) -> ()
570; NO-SIMD128-NEXT:  # %bb.0:
571; NO-SIMD128-NEXT:    i64.const $push0=, 1084818905618843912
572; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
573; NO-SIMD128-NEXT:    i64.const $push1=, 506097522914230528
574; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
575; NO-SIMD128-NEXT:    return
576  ret <8 x i16> <i16 256, i16 770, i16 1284, i16 1798,
577                 i16 2312, i16 2826, i16 3340, i16 3854>
578}
579
580define <8 x i16> @splat_v8i16(i16 %x) {
581; SIMD128-LABEL: splat_v8i16:
582; SIMD128:         .functype splat_v8i16 (i32) -> (v128)
583; SIMD128-NEXT:  # %bb.0:
584; SIMD128-NEXT:    i16x8.splat $push0=, $0
585; SIMD128-NEXT:    return $pop0
586;
587; NO-SIMD128-LABEL: splat_v8i16:
588; NO-SIMD128:         .functype splat_v8i16 (i32, i32) -> ()
589; NO-SIMD128-NEXT:  # %bb.0:
590; NO-SIMD128-NEXT:    i32.store16 14($0), $1
591; NO-SIMD128-NEXT:    i32.store16 12($0), $1
592; NO-SIMD128-NEXT:    i32.store16 10($0), $1
593; NO-SIMD128-NEXT:    i32.store16 8($0), $1
594; NO-SIMD128-NEXT:    i32.store16 6($0), $1
595; NO-SIMD128-NEXT:    i32.store16 4($0), $1
596; NO-SIMD128-NEXT:    i32.store16 2($0), $1
597; NO-SIMD128-NEXT:    i32.store16 0($0), $1
598; NO-SIMD128-NEXT:    return
599  %v = insertelement <8 x i16> undef, i16 %x, i32 0
600  %res = shufflevector <8 x i16> %v, <8 x i16> undef,
601    <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
602  ret <8 x i16> %res
603}
604
605define <8 x i16> @const_splat_v8i16() {
606; SIMD128-LABEL: const_splat_v8i16:
607; SIMD128:         .functype const_splat_v8i16 () -> (v128)
608; SIMD128-NEXT:  # %bb.0:
609; SIMD128-NEXT:    v128.const $push0=, 42, 42, 42, 42, 42, 42, 42, 42
610; SIMD128-NEXT:    return $pop0
611;
612; NO-SIMD128-LABEL: const_splat_v8i16:
613; NO-SIMD128:         .functype const_splat_v8i16 (i32) -> ()
614; NO-SIMD128-NEXT:  # %bb.0:
615; NO-SIMD128-NEXT:    i64.const $push0=, 11822129413226538
616; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
617; NO-SIMD128-NEXT:    i64.const $push1=, 11822129413226538
618; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
619; NO-SIMD128-NEXT:    return
620  ret <8 x i16> <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>
621}
622
623define i32 @extract_v8i16_s(<8 x i16> %v) {
624; SIMD128-LABEL: extract_v8i16_s:
625; SIMD128:         .functype extract_v8i16_s (v128) -> (i32)
626; SIMD128-NEXT:  # %bb.0:
627; SIMD128-NEXT:    i16x8.extract_lane_s $push0=, $0, 5
628; SIMD128-NEXT:    return $pop0
629;
630; NO-SIMD128-LABEL: extract_v8i16_s:
631; NO-SIMD128:         .functype extract_v8i16_s (i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
632; NO-SIMD128-NEXT:  # %bb.0:
633; NO-SIMD128-NEXT:    i32.extend16_s $push0=, $5
634; NO-SIMD128-NEXT:    return $pop0
635  %elem = extractelement <8 x i16> %v, i16 5
636  %a = sext i16 %elem to i32
637  ret i32 %a
638}
639
640define i32 @extract_var_v8i16_s(<8 x i16> %v, i32 %i) {
641; SIMD128-LABEL: extract_var_v8i16_s:
642; SIMD128:         .functype extract_var_v8i16_s (v128, i32) -> (i32)
643; SIMD128-NEXT:  # %bb.0:
644; SIMD128-NEXT:    global.get $push6=, __stack_pointer
645; SIMD128-NEXT:    i32.const $push7=, 16
646; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
647; SIMD128-NEXT:    local.tee $push8=, $2=, $pop9
648; SIMD128-NEXT:    v128.store 0($pop8), $0
649; SIMD128-NEXT:    i32.const $push0=, 7
650; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
651; SIMD128-NEXT:    i32.const $push2=, 1
652; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
653; SIMD128-NEXT:    i32.or $push4=, $2, $pop3
654; SIMD128-NEXT:    i32.load16_s $push5=, 0($pop4)
655; SIMD128-NEXT:    return $pop5
656;
657; NO-SIMD128-LABEL: extract_var_v8i16_s:
658; NO-SIMD128:         .functype extract_var_v8i16_s (i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
659; NO-SIMD128-NEXT:  # %bb.0:
660; NO-SIMD128-NEXT:    global.get $push6=, __stack_pointer
661; NO-SIMD128-NEXT:    i32.const $push7=, 16
662; NO-SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
663; NO-SIMD128-NEXT:    local.tee $push8=, $9=, $pop9
664; NO-SIMD128-NEXT:    i32.store16 14($pop8), $7
665; NO-SIMD128-NEXT:    i32.store16 12($9), $6
666; NO-SIMD128-NEXT:    i32.store16 10($9), $5
667; NO-SIMD128-NEXT:    i32.store16 8($9), $4
668; NO-SIMD128-NEXT:    i32.store16 6($9), $3
669; NO-SIMD128-NEXT:    i32.store16 4($9), $2
670; NO-SIMD128-NEXT:    i32.store16 2($9), $1
671; NO-SIMD128-NEXT:    i32.store16 0($9), $0
672; NO-SIMD128-NEXT:    i32.const $push0=, 7
673; NO-SIMD128-NEXT:    i32.and $push1=, $8, $pop0
674; NO-SIMD128-NEXT:    i32.const $push2=, 1
675; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
676; NO-SIMD128-NEXT:    i32.or $push4=, $9, $pop3
677; NO-SIMD128-NEXT:    i32.load16_s $push5=, 0($pop4)
678; NO-SIMD128-NEXT:    return $pop5
679  %elem = extractelement <8 x i16> %v, i32 %i
680  %a = sext i16 %elem to i32
681  ret i32 %a
682}
683
684define i32 @extract_undef_v8i16_s(<8 x i16> %v) {
685; SIMD128-LABEL: extract_undef_v8i16_s:
686; SIMD128:         .functype extract_undef_v8i16_s (v128) -> (i32)
687; SIMD128-NEXT:  # %bb.0:
688; SIMD128-NEXT:    i16x8.extract_lane_s $push0=, $0, 0
689; SIMD128-NEXT:    return $pop0
690;
691; NO-SIMD128-LABEL: extract_undef_v8i16_s:
692; NO-SIMD128:         .functype extract_undef_v8i16_s (i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
693; NO-SIMD128-NEXT:  # %bb.0:
694; NO-SIMD128-NEXT:    i32.extend16_s $push0=, $0
695; NO-SIMD128-NEXT:    return $pop0
696  %elem = extractelement <8 x i16> %v, i16 undef
697  %a = sext i16 %elem to i32
698  ret i32 %a
699}
700
701define i32 @extract_v8i16_u(<8 x i16> %v) {
702; SIMD128-LABEL: extract_v8i16_u:
703; SIMD128:         .functype extract_v8i16_u (v128) -> (i32)
704; SIMD128-NEXT:  # %bb.0:
705; SIMD128-NEXT:    i16x8.extract_lane_u $push0=, $0, 5
706; SIMD128-NEXT:    return $pop0
707;
708; NO-SIMD128-LABEL: extract_v8i16_u:
709; NO-SIMD128:         .functype extract_v8i16_u (i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
710; NO-SIMD128-NEXT:  # %bb.0:
711; NO-SIMD128-NEXT:    i32.const $push0=, 65535
712; NO-SIMD128-NEXT:    i32.and $push1=, $5, $pop0
713; NO-SIMD128-NEXT:    return $pop1
714  %elem = extractelement <8 x i16> %v, i16 5
715  %a = zext i16 %elem to i32
716  ret i32 %a
717}
718
719define i32 @extract_var_v8i16_u(<8 x i16> %v, i32 %i) {
720; SIMD128-LABEL: extract_var_v8i16_u:
721; SIMD128:         .functype extract_var_v8i16_u (v128, i32) -> (i32)
722; SIMD128-NEXT:  # %bb.0:
723; SIMD128-NEXT:    global.get $push6=, __stack_pointer
724; SIMD128-NEXT:    i32.const $push7=, 16
725; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
726; SIMD128-NEXT:    local.tee $push8=, $2=, $pop9
727; SIMD128-NEXT:    v128.store 0($pop8), $0
728; SIMD128-NEXT:    i32.const $push0=, 7
729; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
730; SIMD128-NEXT:    i32.const $push2=, 1
731; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
732; SIMD128-NEXT:    i32.or $push4=, $2, $pop3
733; SIMD128-NEXT:    i32.load16_u $push5=, 0($pop4)
734; SIMD128-NEXT:    return $pop5
735;
736; NO-SIMD128-LABEL: extract_var_v8i16_u:
737; NO-SIMD128:         .functype extract_var_v8i16_u (i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
738; NO-SIMD128-NEXT:  # %bb.0:
739; NO-SIMD128-NEXT:    global.get $push6=, __stack_pointer
740; NO-SIMD128-NEXT:    i32.const $push7=, 16
741; NO-SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
742; NO-SIMD128-NEXT:    local.tee $push8=, $9=, $pop9
743; NO-SIMD128-NEXT:    i32.store16 14($pop8), $7
744; NO-SIMD128-NEXT:    i32.store16 12($9), $6
745; NO-SIMD128-NEXT:    i32.store16 10($9), $5
746; NO-SIMD128-NEXT:    i32.store16 8($9), $4
747; NO-SIMD128-NEXT:    i32.store16 6($9), $3
748; NO-SIMD128-NEXT:    i32.store16 4($9), $2
749; NO-SIMD128-NEXT:    i32.store16 2($9), $1
750; NO-SIMD128-NEXT:    i32.store16 0($9), $0
751; NO-SIMD128-NEXT:    i32.const $push0=, 7
752; NO-SIMD128-NEXT:    i32.and $push1=, $8, $pop0
753; NO-SIMD128-NEXT:    i32.const $push2=, 1
754; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
755; NO-SIMD128-NEXT:    i32.or $push4=, $9, $pop3
756; NO-SIMD128-NEXT:    i32.load16_u $push5=, 0($pop4)
757; NO-SIMD128-NEXT:    return $pop5
758  %elem = extractelement <8 x i16> %v, i32 %i
759  %a = zext i16 %elem to i32
760  ret i32 %a
761}
762
763define i32 @extract_undef_v8i16_u(<8 x i16> %v) {
764; SIMD128-LABEL: extract_undef_v8i16_u:
765; SIMD128:         .functype extract_undef_v8i16_u (v128) -> (i32)
766; SIMD128-NEXT:  # %bb.0:
767; SIMD128-NEXT:    i16x8.extract_lane_u $push0=, $0, 0
768; SIMD128-NEXT:    return $pop0
769;
770; NO-SIMD128-LABEL: extract_undef_v8i16_u:
771; NO-SIMD128:         .functype extract_undef_v8i16_u (i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
772; NO-SIMD128-NEXT:  # %bb.0:
773; NO-SIMD128-NEXT:    i32.const $push0=, 65535
774; NO-SIMD128-NEXT:    i32.and $push1=, $0, $pop0
775; NO-SIMD128-NEXT:    return $pop1
776  %elem = extractelement <8 x i16> %v, i16 undef
777  %a = zext i16 %elem to i32
778  ret i32 %a
779}
780
781define i16 @extract_v8i16(<8 x i16> %v) {
782; SIMD128-LABEL: extract_v8i16:
783; SIMD128:         .functype extract_v8i16 (v128) -> (i32)
784; SIMD128-NEXT:  # %bb.0:
785; SIMD128-NEXT:    i16x8.extract_lane_u $push0=, $0, 5
786; SIMD128-NEXT:    return $pop0
787;
788; NO-SIMD128-LABEL: extract_v8i16:
789; NO-SIMD128:         .functype extract_v8i16 (i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
790; NO-SIMD128-NEXT:  # %bb.0:
791; NO-SIMD128-NEXT:    return $5
792  %elem = extractelement <8 x i16> %v, i16 5
793  ret i16 %elem
794}
795
796define i16 @extract_var_v8i16(<8 x i16> %v, i32 %i) {
797; SIMD128-LABEL: extract_var_v8i16:
798; SIMD128:         .functype extract_var_v8i16 (v128, i32) -> (i32)
799; SIMD128-NEXT:  # %bb.0:
800; SIMD128-NEXT:    global.get $push6=, __stack_pointer
801; SIMD128-NEXT:    i32.const $push7=, 16
802; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
803; SIMD128-NEXT:    local.tee $push8=, $2=, $pop9
804; SIMD128-NEXT:    v128.store 0($pop8), $0
805; SIMD128-NEXT:    i32.const $push0=, 7
806; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
807; SIMD128-NEXT:    i32.const $push2=, 1
808; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
809; SIMD128-NEXT:    i32.or $push4=, $2, $pop3
810; SIMD128-NEXT:    i32.load16_u $push5=, 0($pop4)
811; SIMD128-NEXT:    return $pop5
812;
813; NO-SIMD128-LABEL: extract_var_v8i16:
814; NO-SIMD128:         .functype extract_var_v8i16 (i32, i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
815; NO-SIMD128-NEXT:  # %bb.0:
816; NO-SIMD128-NEXT:    global.get $push6=, __stack_pointer
817; NO-SIMD128-NEXT:    i32.const $push7=, 16
818; NO-SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
819; NO-SIMD128-NEXT:    local.tee $push8=, $9=, $pop9
820; NO-SIMD128-NEXT:    i32.store16 14($pop8), $7
821; NO-SIMD128-NEXT:    i32.store16 12($9), $6
822; NO-SIMD128-NEXT:    i32.store16 10($9), $5
823; NO-SIMD128-NEXT:    i32.store16 8($9), $4
824; NO-SIMD128-NEXT:    i32.store16 6($9), $3
825; NO-SIMD128-NEXT:    i32.store16 4($9), $2
826; NO-SIMD128-NEXT:    i32.store16 2($9), $1
827; NO-SIMD128-NEXT:    i32.store16 0($9), $0
828; NO-SIMD128-NEXT:    i32.const $push0=, 7
829; NO-SIMD128-NEXT:    i32.and $push1=, $8, $pop0
830; NO-SIMD128-NEXT:    i32.const $push2=, 1
831; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
832; NO-SIMD128-NEXT:    i32.or $push4=, $9, $pop3
833; NO-SIMD128-NEXT:    i32.load16_u $push5=, 0($pop4)
834; NO-SIMD128-NEXT:    return $pop5
835  %elem = extractelement <8 x i16> %v, i32 %i
836  ret i16 %elem
837}
838
839define i16 @extract_undef_v8i16(<8 x i16> %v) {
840; SIMD128-LABEL: extract_undef_v8i16:
841; SIMD128:         .functype extract_undef_v8i16 (v128) -> (i32)
842; SIMD128-NEXT:  # %bb.0:
843; SIMD128-NEXT:    i16x8.extract_lane_u $push0=, $0, 0
844; SIMD128-NEXT:    return $pop0
845;
846; NO-SIMD128-LABEL: extract_undef_v8i16:
847; NO-SIMD128:         .functype extract_undef_v8i16 (i32, i32, i32, i32, i32, i32, i32, i32) -> (i32)
848; NO-SIMD128-NEXT:  # %bb.0:
849; NO-SIMD128-NEXT:    return $0
850  %elem = extractelement <8 x i16> %v, i16 undef
851  ret i16 %elem
852}
853
854define <8 x i16> @replace_v8i16(<8 x i16> %v, i16 %x) {
855; SIMD128-LABEL: replace_v8i16:
856; SIMD128:         .functype replace_v8i16 (v128, i32) -> (v128)
857; SIMD128-NEXT:  # %bb.0:
858; SIMD128-NEXT:    i16x8.replace_lane $push0=, $0, 7, $1
859; SIMD128-NEXT:    return $pop0
860;
861; NO-SIMD128-LABEL: replace_v8i16:
862; NO-SIMD128:         .functype replace_v8i16 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
863; NO-SIMD128-NEXT:  # %bb.0:
864; NO-SIMD128-NEXT:    i32.store16 14($0), $9
865; NO-SIMD128-NEXT:    i32.store16 12($0), $7
866; NO-SIMD128-NEXT:    i32.store16 10($0), $6
867; NO-SIMD128-NEXT:    i32.store16 8($0), $5
868; NO-SIMD128-NEXT:    i32.store16 6($0), $4
869; NO-SIMD128-NEXT:    i32.store16 4($0), $3
870; NO-SIMD128-NEXT:    i32.store16 2($0), $2
871; NO-SIMD128-NEXT:    i32.store16 0($0), $1
872; NO-SIMD128-NEXT:    return
873  %res = insertelement <8 x i16> %v, i16 %x, i32 7
874  ret <8 x i16> %res
875}
876
877define <8 x i16> @replace_var_v8i16(<8 x i16> %v, i32 %i, i16 %x) {
878; SIMD128-LABEL: replace_var_v8i16:
879; SIMD128:         .functype replace_var_v8i16 (v128, i32, i32) -> (v128)
880; SIMD128-NEXT:  # %bb.0:
881; SIMD128-NEXT:    global.get $push6=, __stack_pointer
882; SIMD128-NEXT:    i32.const $push7=, 16
883; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
884; SIMD128-NEXT:    local.tee $push8=, $3=, $pop9
885; SIMD128-NEXT:    v128.store 0($pop8), $0
886; SIMD128-NEXT:    i32.const $push0=, 7
887; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
888; SIMD128-NEXT:    i32.const $push2=, 1
889; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
890; SIMD128-NEXT:    i32.or $push4=, $3, $pop3
891; SIMD128-NEXT:    i32.store16 0($pop4), $2
892; SIMD128-NEXT:    v128.load $push5=, 0($3)
893; SIMD128-NEXT:    return $pop5
894;
895; NO-SIMD128-LABEL: replace_var_v8i16:
896; NO-SIMD128:         .functype replace_var_v8i16 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
897; NO-SIMD128-NEXT:  # %bb.0:
898; NO-SIMD128-NEXT:    global.get $push7=, __stack_pointer
899; NO-SIMD128-NEXT:    i32.const $push8=, 16
900; NO-SIMD128-NEXT:    i32.sub $push10=, $pop7, $pop8
901; NO-SIMD128-NEXT:    local.tee $push9=, $11=, $pop10
902; NO-SIMD128-NEXT:    i32.store16 14($pop9), $8
903; NO-SIMD128-NEXT:    i32.store16 12($11), $7
904; NO-SIMD128-NEXT:    i32.store16 10($11), $6
905; NO-SIMD128-NEXT:    i32.store16 8($11), $5
906; NO-SIMD128-NEXT:    i32.store16 6($11), $4
907; NO-SIMD128-NEXT:    i32.store16 4($11), $3
908; NO-SIMD128-NEXT:    i32.store16 2($11), $2
909; NO-SIMD128-NEXT:    i32.store16 0($11), $1
910; NO-SIMD128-NEXT:    i32.const $push0=, 7
911; NO-SIMD128-NEXT:    i32.and $push1=, $9, $pop0
912; NO-SIMD128-NEXT:    i32.const $push2=, 1
913; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
914; NO-SIMD128-NEXT:    i32.or $push4=, $11, $pop3
915; NO-SIMD128-NEXT:    i32.store16 0($pop4), $10
916; NO-SIMD128-NEXT:    i64.load $push5=, 8($11)
917; NO-SIMD128-NEXT:    i64.store 8($0), $pop5
918; NO-SIMD128-NEXT:    i64.load $push6=, 0($11)
919; NO-SIMD128-NEXT:    i64.store 0($0), $pop6
920; NO-SIMD128-NEXT:    return
921  %res = insertelement <8 x i16> %v, i16 %x, i32 %i
922  ret <8 x i16> %res
923}
924
925define <8 x i16> @replace_zero_v8i16(<8 x i16> %v, i16 %x) {
926; SIMD128-LABEL: replace_zero_v8i16:
927; SIMD128:         .functype replace_zero_v8i16 (v128, i32) -> (v128)
928; SIMD128-NEXT:  # %bb.0:
929; SIMD128-NEXT:    i16x8.replace_lane $push0=, $0, 0, $1
930; SIMD128-NEXT:    return $pop0
931;
932; NO-SIMD128-LABEL: replace_zero_v8i16:
933; NO-SIMD128:         .functype replace_zero_v8i16 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
934; NO-SIMD128-NEXT:  # %bb.0:
935; NO-SIMD128-NEXT:    i32.store16 14($0), $8
936; NO-SIMD128-NEXT:    i32.store16 12($0), $7
937; NO-SIMD128-NEXT:    i32.store16 10($0), $6
938; NO-SIMD128-NEXT:    i32.store16 8($0), $5
939; NO-SIMD128-NEXT:    i32.store16 6($0), $4
940; NO-SIMD128-NEXT:    i32.store16 4($0), $3
941; NO-SIMD128-NEXT:    i32.store16 2($0), $2
942; NO-SIMD128-NEXT:    i32.store16 0($0), $9
943; NO-SIMD128-NEXT:    return
944  %res = insertelement <8 x i16> %v, i16 %x, i32 0
945  ret <8 x i16> %res
946}
947
948define <8 x i16> @shuffle_v8i16(<8 x i16> %x, <8 x i16> %y) {
949; SIMD128-LABEL: shuffle_v8i16:
950; SIMD128:         .functype shuffle_v8i16 (v128, v128) -> (v128)
951; SIMD128-NEXT:  # %bb.0:
952; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $1, 0, 1, 18, 19, 4, 5, 22, 23, 8, 9, 26, 27, 12, 13, 30, 31
953; SIMD128-NEXT:    return $pop0
954;
955; NO-SIMD128-LABEL: shuffle_v8i16:
956; NO-SIMD128:         .functype shuffle_v8i16 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
957; NO-SIMD128-NEXT:  # %bb.0:
958; NO-SIMD128-NEXT:    i32.store16 14($0), $16
959; NO-SIMD128-NEXT:    i32.store16 12($0), $7
960; NO-SIMD128-NEXT:    i32.store16 10($0), $14
961; NO-SIMD128-NEXT:    i32.store16 8($0), $5
962; NO-SIMD128-NEXT:    i32.store16 6($0), $12
963; NO-SIMD128-NEXT:    i32.store16 4($0), $3
964; NO-SIMD128-NEXT:    i32.store16 2($0), $10
965; NO-SIMD128-NEXT:    i32.store16 0($0), $1
966; NO-SIMD128-NEXT:    return
967  %res = shufflevector <8 x i16> %x, <8 x i16> %y,
968    <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
969  ret <8 x i16> %res
970}
971
972define <8 x i16> @shuffle_undef_v8i16(<8 x i16> %x, <8 x i16> %y) {
973; SIMD128-LABEL: shuffle_undef_v8i16:
974; SIMD128:         .functype shuffle_undef_v8i16 (v128, v128) -> (v128)
975; SIMD128-NEXT:  # %bb.0:
976; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 2, 3, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
977; SIMD128-NEXT:    return $pop0
978;
979; NO-SIMD128-LABEL: shuffle_undef_v8i16:
980; NO-SIMD128:         .functype shuffle_undef_v8i16 (i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
981; NO-SIMD128-NEXT:  # %bb.0:
982; NO-SIMD128-NEXT:    i32.store16 0($0), $2
983; NO-SIMD128-NEXT:    return
984  %res = shufflevector <8 x i16> %x, <8 x i16> %y,
985    <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef,
986               i32 undef, i32 undef, i32 undef, i32 undef>
987  ret <8 x i16> %res
988}
989
990define <8 x i16> @build_v8i16(i16 %x0, i16 %x1, i16 %x2, i16 %x3,
991; SIMD128-LABEL: build_v8i16:
992; SIMD128:         .functype build_v8i16 (i32, i32, i32, i32, i32, i32, i32, i32) -> (v128)
993; SIMD128-NEXT:  # %bb.0:
994; SIMD128-NEXT:    i16x8.splat $push0=, $0
995; SIMD128-NEXT:    i16x8.replace_lane $push1=, $pop0, 1, $1
996; SIMD128-NEXT:    i16x8.replace_lane $push2=, $pop1, 2, $2
997; SIMD128-NEXT:    i16x8.replace_lane $push3=, $pop2, 3, $3
998; SIMD128-NEXT:    i16x8.replace_lane $push4=, $pop3, 4, $4
999; SIMD128-NEXT:    i16x8.replace_lane $push5=, $pop4, 5, $5
1000; SIMD128-NEXT:    i16x8.replace_lane $push6=, $pop5, 6, $6
1001; SIMD128-NEXT:    i16x8.replace_lane $push7=, $pop6, 7, $7
1002; SIMD128-NEXT:    return $pop7
1003;
1004; NO-SIMD128-LABEL: build_v8i16:
1005; NO-SIMD128:         .functype build_v8i16 (i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
1006; NO-SIMD128-NEXT:  # %bb.0:
1007; NO-SIMD128-NEXT:    i32.store16 14($0), $8
1008; NO-SIMD128-NEXT:    i32.store16 12($0), $7
1009; NO-SIMD128-NEXT:    i32.store16 10($0), $6
1010; NO-SIMD128-NEXT:    i32.store16 8($0), $5
1011; NO-SIMD128-NEXT:    i32.store16 6($0), $4
1012; NO-SIMD128-NEXT:    i32.store16 4($0), $3
1013; NO-SIMD128-NEXT:    i32.store16 2($0), $2
1014; NO-SIMD128-NEXT:    i32.store16 0($0), $1
1015; NO-SIMD128-NEXT:    return
1016                              i16 %x4, i16 %x5, i16 %x6, i16 %x7) {
1017  %t0 = insertelement <8 x i16> undef, i16 %x0, i32 0
1018  %t1 = insertelement <8 x i16> %t0, i16 %x1, i32 1
1019  %t2 = insertelement <8 x i16> %t1, i16 %x2, i32 2
1020  %t3 = insertelement <8 x i16> %t2, i16 %x3, i32 3
1021  %t4 = insertelement <8 x i16> %t3, i16 %x4, i32 4
1022  %t5 = insertelement <8 x i16> %t4, i16 %x5, i32 5
1023  %t6 = insertelement <8 x i16> %t5, i16 %x6, i32 6
1024  %res = insertelement <8 x i16> %t6, i16 %x7, i32 7
1025  ret <8 x i16> %res
1026}
1027
1028; ==============================================================================
1029; 4 x i32
1030; ==============================================================================
1031define <4 x i32> @const_v4i32() {
1032; SIMD128-LABEL: const_v4i32:
1033; SIMD128:         .functype const_v4i32 () -> (v128)
1034; SIMD128-NEXT:  # %bb.0:
1035; SIMD128-NEXT:    v128.const $push0=, 50462976, 117835012, 185207048, 252579084
1036; SIMD128-NEXT:    return $pop0
1037;
1038; NO-SIMD128-LABEL: const_v4i32:
1039; NO-SIMD128:         .functype const_v4i32 (i32) -> ()
1040; NO-SIMD128-NEXT:  # %bb.0:
1041; NO-SIMD128-NEXT:    i64.const $push0=, 1084818905618843912
1042; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
1043; NO-SIMD128-NEXT:    i64.const $push1=, 506097522914230528
1044; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
1045; NO-SIMD128-NEXT:    return
1046  ret <4 x i32> <i32 50462976, i32 117835012, i32 185207048, i32 252579084>
1047}
1048
1049define <4 x i32> @splat_v4i32(i32 %x) {
1050; SIMD128-LABEL: splat_v4i32:
1051; SIMD128:         .functype splat_v4i32 (i32) -> (v128)
1052; SIMD128-NEXT:  # %bb.0:
1053; SIMD128-NEXT:    i32x4.splat $push0=, $0
1054; SIMD128-NEXT:    return $pop0
1055;
1056; NO-SIMD128-LABEL: splat_v4i32:
1057; NO-SIMD128:         .functype splat_v4i32 (i32, i32) -> ()
1058; NO-SIMD128-NEXT:  # %bb.0:
1059; NO-SIMD128-NEXT:    i32.store 12($0), $1
1060; NO-SIMD128-NEXT:    i32.store 8($0), $1
1061; NO-SIMD128-NEXT:    i32.store 4($0), $1
1062; NO-SIMD128-NEXT:    i32.store 0($0), $1
1063; NO-SIMD128-NEXT:    return
1064  %v = insertelement <4 x i32> undef, i32 %x, i32 0
1065  %res = shufflevector <4 x i32> %v, <4 x i32> undef,
1066    <4 x i32> <i32 0, i32 0, i32 0, i32 0>
1067  ret <4 x i32> %res
1068}
1069
1070define <4 x i32> @const_splat_v4i32() {
1071; SIMD128-LABEL: const_splat_v4i32:
1072; SIMD128:         .functype const_splat_v4i32 () -> (v128)
1073; SIMD128-NEXT:  # %bb.0:
1074; SIMD128-NEXT:    v128.const $push0=, 42, 42, 42, 42
1075; SIMD128-NEXT:    return $pop0
1076;
1077; NO-SIMD128-LABEL: const_splat_v4i32:
1078; NO-SIMD128:         .functype const_splat_v4i32 (i32) -> ()
1079; NO-SIMD128-NEXT:  # %bb.0:
1080; NO-SIMD128-NEXT:    i64.const $push0=, 180388626474
1081; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
1082; NO-SIMD128-NEXT:    i64.const $push1=, 180388626474
1083; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
1084; NO-SIMD128-NEXT:    return
1085  ret <4 x i32> <i32 42, i32 42, i32 42, i32 42>
1086}
1087
1088define i32 @extract_v4i32(<4 x i32> %v) {
1089; SIMD128-LABEL: extract_v4i32:
1090; SIMD128:         .functype extract_v4i32 (v128) -> (i32)
1091; SIMD128-NEXT:  # %bb.0:
1092; SIMD128-NEXT:    i32x4.extract_lane $push0=, $0, 3
1093; SIMD128-NEXT:    return $pop0
1094;
1095; NO-SIMD128-LABEL: extract_v4i32:
1096; NO-SIMD128:         .functype extract_v4i32 (i32, i32, i32, i32) -> (i32)
1097; NO-SIMD128-NEXT:  # %bb.0:
1098; NO-SIMD128-NEXT:    return $3
1099  %elem = extractelement <4 x i32> %v, i32 3
1100  ret i32 %elem
1101}
1102
1103define i32 @extract_var_v4i32(<4 x i32> %v, i32 %i) {
1104; SIMD128-LABEL: extract_var_v4i32:
1105; SIMD128:         .functype extract_var_v4i32 (v128, i32) -> (i32)
1106; SIMD128-NEXT:  # %bb.0:
1107; SIMD128-NEXT:    global.get $push6=, __stack_pointer
1108; SIMD128-NEXT:    i32.const $push7=, 16
1109; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1110; SIMD128-NEXT:    local.tee $push8=, $2=, $pop9
1111; SIMD128-NEXT:    v128.store 0($pop8), $0
1112; SIMD128-NEXT:    i32.const $push0=, 3
1113; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
1114; SIMD128-NEXT:    i32.const $push2=, 2
1115; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1116; SIMD128-NEXT:    i32.or $push4=, $2, $pop3
1117; SIMD128-NEXT:    i32.load $push5=, 0($pop4)
1118; SIMD128-NEXT:    return $pop5
1119;
1120; NO-SIMD128-LABEL: extract_var_v4i32:
1121; NO-SIMD128:         .functype extract_var_v4i32 (i32, i32, i32, i32, i32) -> (i32)
1122; NO-SIMD128-NEXT:  # %bb.0:
1123; NO-SIMD128-NEXT:    global.get $push6=, __stack_pointer
1124; NO-SIMD128-NEXT:    i32.const $push7=, 16
1125; NO-SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1126; NO-SIMD128-NEXT:    local.tee $push8=, $5=, $pop9
1127; NO-SIMD128-NEXT:    i32.store 12($pop8), $3
1128; NO-SIMD128-NEXT:    i32.store 8($5), $2
1129; NO-SIMD128-NEXT:    i32.store 4($5), $1
1130; NO-SIMD128-NEXT:    i32.store 0($5), $0
1131; NO-SIMD128-NEXT:    i32.const $push0=, 3
1132; NO-SIMD128-NEXT:    i32.and $push1=, $4, $pop0
1133; NO-SIMD128-NEXT:    i32.const $push2=, 2
1134; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1135; NO-SIMD128-NEXT:    i32.or $push4=, $5, $pop3
1136; NO-SIMD128-NEXT:    i32.load $push5=, 0($pop4)
1137; NO-SIMD128-NEXT:    return $pop5
1138  %elem = extractelement <4 x i32> %v, i32 %i
1139  ret i32 %elem
1140}
1141
1142define i32 @extract_zero_v4i32(<4 x i32> %v) {
1143; SIMD128-LABEL: extract_zero_v4i32:
1144; SIMD128:         .functype extract_zero_v4i32 (v128) -> (i32)
1145; SIMD128-NEXT:  # %bb.0:
1146; SIMD128-NEXT:    i32x4.extract_lane $push0=, $0, 0
1147; SIMD128-NEXT:    return $pop0
1148;
1149; NO-SIMD128-LABEL: extract_zero_v4i32:
1150; NO-SIMD128:         .functype extract_zero_v4i32 (i32, i32, i32, i32) -> (i32)
1151; NO-SIMD128-NEXT:  # %bb.0:
1152; NO-SIMD128-NEXT:    return $0
1153  %elem = extractelement <4 x i32> %v, i32 0
1154  ret i32 %elem
1155}
1156
1157define <4 x i32> @replace_v4i32(<4 x i32> %v, i32 %x) {
1158; SIMD128-LABEL: replace_v4i32:
1159; SIMD128:         .functype replace_v4i32 (v128, i32) -> (v128)
1160; SIMD128-NEXT:  # %bb.0:
1161; SIMD128-NEXT:    i32x4.replace_lane $push0=, $0, 2, $1
1162; SIMD128-NEXT:    return $pop0
1163;
1164; NO-SIMD128-LABEL: replace_v4i32:
1165; NO-SIMD128:         .functype replace_v4i32 (i32, i32, i32, i32, i32, i32) -> ()
1166; NO-SIMD128-NEXT:  # %bb.0:
1167; NO-SIMD128-NEXT:    i32.store 12($0), $4
1168; NO-SIMD128-NEXT:    i32.store 8($0), $5
1169; NO-SIMD128-NEXT:    i32.store 4($0), $2
1170; NO-SIMD128-NEXT:    i32.store 0($0), $1
1171; NO-SIMD128-NEXT:    return
1172  %res = insertelement <4 x i32> %v, i32 %x, i32 2
1173  ret <4 x i32> %res
1174}
1175
1176define <4 x i32> @replace_var_v4i32(<4 x i32> %v, i32 %i, i32 %x) {
1177; SIMD128-LABEL: replace_var_v4i32:
1178; SIMD128:         .functype replace_var_v4i32 (v128, i32, i32) -> (v128)
1179; SIMD128-NEXT:  # %bb.0:
1180; SIMD128-NEXT:    global.get $push6=, __stack_pointer
1181; SIMD128-NEXT:    i32.const $push7=, 16
1182; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1183; SIMD128-NEXT:    local.tee $push8=, $3=, $pop9
1184; SIMD128-NEXT:    v128.store 0($pop8), $0
1185; SIMD128-NEXT:    i32.const $push0=, 3
1186; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
1187; SIMD128-NEXT:    i32.const $push2=, 2
1188; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1189; SIMD128-NEXT:    i32.or $push4=, $3, $pop3
1190; SIMD128-NEXT:    i32.store 0($pop4), $2
1191; SIMD128-NEXT:    v128.load $push5=, 0($3)
1192; SIMD128-NEXT:    return $pop5
1193;
1194; NO-SIMD128-LABEL: replace_var_v4i32:
1195; NO-SIMD128:         .functype replace_var_v4i32 (i32, i32, i32, i32, i32, i32, i32) -> ()
1196; NO-SIMD128-NEXT:  # %bb.0:
1197; NO-SIMD128-NEXT:    global.get $push7=, __stack_pointer
1198; NO-SIMD128-NEXT:    i32.const $push8=, 16
1199; NO-SIMD128-NEXT:    i32.sub $push10=, $pop7, $pop8
1200; NO-SIMD128-NEXT:    local.tee $push9=, $7=, $pop10
1201; NO-SIMD128-NEXT:    i32.store 12($pop9), $4
1202; NO-SIMD128-NEXT:    i32.store 8($7), $3
1203; NO-SIMD128-NEXT:    i32.store 4($7), $2
1204; NO-SIMD128-NEXT:    i32.store 0($7), $1
1205; NO-SIMD128-NEXT:    i32.const $push0=, 3
1206; NO-SIMD128-NEXT:    i32.and $push1=, $5, $pop0
1207; NO-SIMD128-NEXT:    i32.const $push2=, 2
1208; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1209; NO-SIMD128-NEXT:    i32.or $push4=, $7, $pop3
1210; NO-SIMD128-NEXT:    i32.store 0($pop4), $6
1211; NO-SIMD128-NEXT:    i64.load $push5=, 8($7)
1212; NO-SIMD128-NEXT:    i64.store 8($0), $pop5
1213; NO-SIMD128-NEXT:    i64.load $push6=, 0($7)
1214; NO-SIMD128-NEXT:    i64.store 0($0), $pop6
1215; NO-SIMD128-NEXT:    return
1216  %res = insertelement <4 x i32> %v, i32 %x, i32 %i
1217  ret <4 x i32> %res
1218}
1219
1220define <4 x i32> @replace_zero_v4i32(<4 x i32> %v, i32 %x) {
1221; SIMD128-LABEL: replace_zero_v4i32:
1222; SIMD128:         .functype replace_zero_v4i32 (v128, i32) -> (v128)
1223; SIMD128-NEXT:  # %bb.0:
1224; SIMD128-NEXT:    i32x4.replace_lane $push0=, $0, 0, $1
1225; SIMD128-NEXT:    return $pop0
1226;
1227; NO-SIMD128-LABEL: replace_zero_v4i32:
1228; NO-SIMD128:         .functype replace_zero_v4i32 (i32, i32, i32, i32, i32, i32) -> ()
1229; NO-SIMD128-NEXT:  # %bb.0:
1230; NO-SIMD128-NEXT:    i32.store 12($0), $4
1231; NO-SIMD128-NEXT:    i32.store 8($0), $3
1232; NO-SIMD128-NEXT:    i32.store 4($0), $2
1233; NO-SIMD128-NEXT:    i32.store 0($0), $5
1234; NO-SIMD128-NEXT:    return
1235  %res = insertelement <4 x i32> %v, i32 %x, i32 0
1236  ret <4 x i32> %res
1237}
1238
1239define <4 x i32> @shuffle_v4i32(<4 x i32> %x, <4 x i32> %y) {
1240; SIMD128-LABEL: shuffle_v4i32:
1241; SIMD128:         .functype shuffle_v4i32 (v128, v128) -> (v128)
1242; SIMD128-NEXT:  # %bb.0:
1243; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $1, 0, 1, 2, 3, 20, 21, 22, 23, 8, 9, 10, 11, 28, 29, 30, 31
1244; SIMD128-NEXT:    return $pop0
1245;
1246; NO-SIMD128-LABEL: shuffle_v4i32:
1247; NO-SIMD128:         .functype shuffle_v4i32 (i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
1248; NO-SIMD128-NEXT:  # %bb.0:
1249; NO-SIMD128-NEXT:    i32.store 12($0), $8
1250; NO-SIMD128-NEXT:    i32.store 8($0), $3
1251; NO-SIMD128-NEXT:    i32.store 4($0), $6
1252; NO-SIMD128-NEXT:    i32.store 0($0), $1
1253; NO-SIMD128-NEXT:    return
1254  %res = shufflevector <4 x i32> %x, <4 x i32> %y,
1255    <4 x i32> <i32 0, i32 5, i32 2, i32 7>
1256  ret <4 x i32> %res
1257}
1258
1259define <4 x i32> @shuffle_undef_v4i32(<4 x i32> %x, <4 x i32> %y) {
1260; SIMD128-LABEL: shuffle_undef_v4i32:
1261; SIMD128:         .functype shuffle_undef_v4i32 (v128, v128) -> (v128)
1262; SIMD128-NEXT:  # %bb.0:
1263; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
1264; SIMD128-NEXT:    return $pop0
1265;
1266; NO-SIMD128-LABEL: shuffle_undef_v4i32:
1267; NO-SIMD128:         .functype shuffle_undef_v4i32 (i32, i32, i32, i32, i32, i32, i32, i32, i32) -> ()
1268; NO-SIMD128-NEXT:  # %bb.0:
1269; NO-SIMD128-NEXT:    i32.store 0($0), $2
1270; NO-SIMD128-NEXT:    return
1271  %res = shufflevector <4 x i32> %x, <4 x i32> %y,
1272    <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
1273  ret <4 x i32> %res
1274}
1275
1276define <4 x i32> @build_v4i32(i32 %x0, i32 %x1, i32 %x2, i32 %x3) {
1277; SIMD128-LABEL: build_v4i32:
1278; SIMD128:         .functype build_v4i32 (i32, i32, i32, i32) -> (v128)
1279; SIMD128-NEXT:  # %bb.0:
1280; SIMD128-NEXT:    i32x4.splat $push0=, $0
1281; SIMD128-NEXT:    i32x4.replace_lane $push1=, $pop0, 1, $1
1282; SIMD128-NEXT:    i32x4.replace_lane $push2=, $pop1, 2, $2
1283; SIMD128-NEXT:    i32x4.replace_lane $push3=, $pop2, 3, $3
1284; SIMD128-NEXT:    return $pop3
1285;
1286; NO-SIMD128-LABEL: build_v4i32:
1287; NO-SIMD128:         .functype build_v4i32 (i32, i32, i32, i32, i32) -> ()
1288; NO-SIMD128-NEXT:  # %bb.0:
1289; NO-SIMD128-NEXT:    i32.store 12($0), $4
1290; NO-SIMD128-NEXT:    i32.store 8($0), $3
1291; NO-SIMD128-NEXT:    i32.store 4($0), $2
1292; NO-SIMD128-NEXT:    i32.store 0($0), $1
1293; NO-SIMD128-NEXT:    return
1294  %t0 = insertelement <4 x i32> undef, i32 %x0, i32 0
1295  %t1 = insertelement <4 x i32> %t0, i32 %x1, i32 1
1296  %t2 = insertelement <4 x i32> %t1, i32 %x2, i32 2
1297  %res = insertelement <4 x i32> %t2, i32 %x3, i32 3
1298  ret <4 x i32> %res
1299}
1300
1301; ==============================================================================
1302; 2 x i64
1303; ==============================================================================
1304define <2 x i64> @const_v2i64() {
1305; SIMD128-LABEL: const_v2i64:
1306; SIMD128:         .functype const_v2i64 () -> (v128)
1307; SIMD128-NEXT:  # %bb.0:
1308; SIMD128-NEXT:    v128.const $push0=, 506097522914230528, 1084818905618843912
1309; SIMD128-NEXT:    return $pop0
1310;
1311; NO-SIMD128-LABEL: const_v2i64:
1312; NO-SIMD128:         .functype const_v2i64 (i32) -> ()
1313; NO-SIMD128-NEXT:  # %bb.0:
1314; NO-SIMD128-NEXT:    i64.const $push0=, 1084818905618843912
1315; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
1316; NO-SIMD128-NEXT:    i64.const $push1=, 506097522914230528
1317; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
1318; NO-SIMD128-NEXT:    return
1319  ret <2 x i64> <i64 506097522914230528, i64 1084818905618843912>
1320}
1321
1322define <2 x i64> @splat_v2i64(i64 %x) {
1323; SIMD128-LABEL: splat_v2i64:
1324; SIMD128:         .functype splat_v2i64 (i64) -> (v128)
1325; SIMD128-NEXT:  # %bb.0:
1326; SIMD128-NEXT:    i64x2.splat $push0=, $0
1327; SIMD128-NEXT:    return $pop0
1328;
1329; NO-SIMD128-LABEL: splat_v2i64:
1330; NO-SIMD128:         .functype splat_v2i64 (i32, i64) -> ()
1331; NO-SIMD128-NEXT:  # %bb.0:
1332; NO-SIMD128-NEXT:    i64.store 8($0), $1
1333; NO-SIMD128-NEXT:    i64.store 0($0), $1
1334; NO-SIMD128-NEXT:    return
1335  %t1 = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
1336  %res = insertelement <2 x i64> %t1, i64 %x, i32 1
1337  ret <2 x i64> %res
1338}
1339
1340define <2 x i64> @const_splat_v2i64() {
1341; SIMD128-LABEL: const_splat_v2i64:
1342; SIMD128:         .functype const_splat_v2i64 () -> (v128)
1343; SIMD128-NEXT:  # %bb.0:
1344; SIMD128-NEXT:    v128.const $push0=, 42, 42
1345; SIMD128-NEXT:    return $pop0
1346;
1347; NO-SIMD128-LABEL: const_splat_v2i64:
1348; NO-SIMD128:         .functype const_splat_v2i64 (i32) -> ()
1349; NO-SIMD128-NEXT:  # %bb.0:
1350; NO-SIMD128-NEXT:    i64.const $push0=, 42
1351; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
1352; NO-SIMD128-NEXT:    i64.const $push1=, 42
1353; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
1354; NO-SIMD128-NEXT:    return
1355  ret <2 x i64> <i64 42, i64 42>
1356}
1357
1358define i64 @extract_v2i64(<2 x i64> %v) {
1359; SIMD128-LABEL: extract_v2i64:
1360; SIMD128:         .functype extract_v2i64 (v128) -> (i64)
1361; SIMD128-NEXT:  # %bb.0:
1362; SIMD128-NEXT:    i64x2.extract_lane $push0=, $0, 1
1363; SIMD128-NEXT:    return $pop0
1364;
1365; NO-SIMD128-LABEL: extract_v2i64:
1366; NO-SIMD128:         .functype extract_v2i64 (i64, i64) -> (i64)
1367; NO-SIMD128-NEXT:  # %bb.0:
1368; NO-SIMD128-NEXT:    return $1
1369  %elem = extractelement <2 x i64> %v, i64 1
1370  ret i64 %elem
1371}
1372
1373define i64 @extract_var_v2i64(<2 x i64> %v, i32 %i) {
1374; SIMD128-LABEL: extract_var_v2i64:
1375; SIMD128:         .functype extract_var_v2i64 (v128, i32) -> (i64)
1376; SIMD128-NEXT:  # %bb.0:
1377; SIMD128-NEXT:    global.get $push6=, __stack_pointer
1378; SIMD128-NEXT:    i32.const $push7=, 16
1379; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1380; SIMD128-NEXT:    local.tee $push8=, $2=, $pop9
1381; SIMD128-NEXT:    v128.store 0($pop8), $0
1382; SIMD128-NEXT:    i32.const $push0=, 1
1383; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
1384; SIMD128-NEXT:    i32.const $push2=, 3
1385; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1386; SIMD128-NEXT:    i32.or $push4=, $2, $pop3
1387; SIMD128-NEXT:    i64.load $push5=, 0($pop4)
1388; SIMD128-NEXT:    return $pop5
1389;
1390; NO-SIMD128-LABEL: extract_var_v2i64:
1391; NO-SIMD128:         .functype extract_var_v2i64 (i64, i64, i32) -> (i64)
1392; NO-SIMD128-NEXT:  # %bb.0:
1393; NO-SIMD128-NEXT:    global.get $push6=, __stack_pointer
1394; NO-SIMD128-NEXT:    i32.const $push7=, 16
1395; NO-SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1396; NO-SIMD128-NEXT:    local.tee $push8=, $3=, $pop9
1397; NO-SIMD128-NEXT:    i64.store 8($pop8), $1
1398; NO-SIMD128-NEXT:    i64.store 0($3), $0
1399; NO-SIMD128-NEXT:    i32.const $push0=, 1
1400; NO-SIMD128-NEXT:    i32.and $push1=, $2, $pop0
1401; NO-SIMD128-NEXT:    i32.const $push2=, 3
1402; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1403; NO-SIMD128-NEXT:    i32.or $push4=, $3, $pop3
1404; NO-SIMD128-NEXT:    i64.load $push5=, 0($pop4)
1405; NO-SIMD128-NEXT:    return $pop5
1406  %elem = extractelement <2 x i64> %v, i32 %i
1407  ret i64 %elem
1408}
1409
1410define i64 @extract_zero_v2i64(<2 x i64> %v) {
1411; SIMD128-LABEL: extract_zero_v2i64:
1412; SIMD128:         .functype extract_zero_v2i64 (v128) -> (i64)
1413; SIMD128-NEXT:  # %bb.0:
1414; SIMD128-NEXT:    i64x2.extract_lane $push0=, $0, 0
1415; SIMD128-NEXT:    return $pop0
1416;
1417; NO-SIMD128-LABEL: extract_zero_v2i64:
1418; NO-SIMD128:         .functype extract_zero_v2i64 (i64, i64) -> (i64)
1419; NO-SIMD128-NEXT:  # %bb.0:
1420; NO-SIMD128-NEXT:    return $0
1421  %elem = extractelement <2 x i64> %v, i64 0
1422  ret i64 %elem
1423}
1424
1425define <2 x i64> @replace_v2i64(<2 x i64> %v, i64 %x) {
1426; SIMD128-LABEL: replace_v2i64:
1427; SIMD128:         .functype replace_v2i64 (v128, i64) -> (v128)
1428; SIMD128-NEXT:  # %bb.0:
1429; SIMD128-NEXT:    i64x2.replace_lane $push0=, $0, 0, $1
1430; SIMD128-NEXT:    return $pop0
1431;
1432; NO-SIMD128-LABEL: replace_v2i64:
1433; NO-SIMD128:         .functype replace_v2i64 (i32, i64, i64, i64) -> ()
1434; NO-SIMD128-NEXT:  # %bb.0:
1435; NO-SIMD128-NEXT:    i64.store 8($0), $2
1436; NO-SIMD128-NEXT:    i64.store 0($0), $3
1437; NO-SIMD128-NEXT:    return
1438  %res = insertelement <2 x i64> %v, i64 %x, i32 0
1439  ret <2 x i64> %res
1440}
1441
1442define <2 x i64> @replace_var_v2i64(<2 x i64> %v, i32 %i, i64 %x) {
1443; SIMD128-LABEL: replace_var_v2i64:
1444; SIMD128:         .functype replace_var_v2i64 (v128, i32, i64) -> (v128)
1445; SIMD128-NEXT:  # %bb.0:
1446; SIMD128-NEXT:    global.get $push6=, __stack_pointer
1447; SIMD128-NEXT:    i32.const $push7=, 16
1448; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1449; SIMD128-NEXT:    local.tee $push8=, $3=, $pop9
1450; SIMD128-NEXT:    v128.store 0($pop8), $0
1451; SIMD128-NEXT:    i32.const $push0=, 1
1452; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
1453; SIMD128-NEXT:    i32.const $push2=, 3
1454; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1455; SIMD128-NEXT:    i32.or $push4=, $3, $pop3
1456; SIMD128-NEXT:    i64.store 0($pop4), $2
1457; SIMD128-NEXT:    v128.load $push5=, 0($3)
1458; SIMD128-NEXT:    return $pop5
1459;
1460; NO-SIMD128-LABEL: replace_var_v2i64:
1461; NO-SIMD128:         .functype replace_var_v2i64 (i32, i64, i64, i32, i64) -> ()
1462; NO-SIMD128-NEXT:  # %bb.0:
1463; NO-SIMD128-NEXT:    global.get $push7=, __stack_pointer
1464; NO-SIMD128-NEXT:    i32.const $push8=, 16
1465; NO-SIMD128-NEXT:    i32.sub $push10=, $pop7, $pop8
1466; NO-SIMD128-NEXT:    local.tee $push9=, $5=, $pop10
1467; NO-SIMD128-NEXT:    i64.store 8($pop9), $2
1468; NO-SIMD128-NEXT:    i64.store 0($5), $1
1469; NO-SIMD128-NEXT:    i32.const $push0=, 1
1470; NO-SIMD128-NEXT:    i32.and $push1=, $3, $pop0
1471; NO-SIMD128-NEXT:    i32.const $push2=, 3
1472; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1473; NO-SIMD128-NEXT:    i32.or $push4=, $5, $pop3
1474; NO-SIMD128-NEXT:    i64.store 0($pop4), $4
1475; NO-SIMD128-NEXT:    i64.load $push5=, 8($5)
1476; NO-SIMD128-NEXT:    i64.store 8($0), $pop5
1477; NO-SIMD128-NEXT:    i64.load $push6=, 0($5)
1478; NO-SIMD128-NEXT:    i64.store 0($0), $pop6
1479; NO-SIMD128-NEXT:    return
1480  %res = insertelement <2 x i64> %v, i64 %x, i32 %i
1481  ret <2 x i64> %res
1482}
1483
1484define <2 x i64> @replace_zero_v2i64(<2 x i64> %v, i64 %x) {
1485; SIMD128-LABEL: replace_zero_v2i64:
1486; SIMD128:         .functype replace_zero_v2i64 (v128, i64) -> (v128)
1487; SIMD128-NEXT:  # %bb.0:
1488; SIMD128-NEXT:    i64x2.replace_lane $push0=, $0, 0, $1
1489; SIMD128-NEXT:    return $pop0
1490;
1491; NO-SIMD128-LABEL: replace_zero_v2i64:
1492; NO-SIMD128:         .functype replace_zero_v2i64 (i32, i64, i64, i64) -> ()
1493; NO-SIMD128-NEXT:  # %bb.0:
1494; NO-SIMD128-NEXT:    i64.store 8($0), $2
1495; NO-SIMD128-NEXT:    i64.store 0($0), $3
1496; NO-SIMD128-NEXT:    return
1497  %res = insertelement <2 x i64> %v, i64 %x, i32 0
1498  ret <2 x i64> %res
1499}
1500
1501define <2 x i64> @shuffle_v2i64(<2 x i64> %x, <2 x i64> %y) {
1502; SIMD128-LABEL: shuffle_v2i64:
1503; SIMD128:         .functype shuffle_v2i64 (v128, v128) -> (v128)
1504; SIMD128-NEXT:  # %bb.0:
1505; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $1, 0, 1, 2, 3, 4, 5, 6, 7, 24, 25, 26, 27, 28, 29, 30, 31
1506; SIMD128-NEXT:    return $pop0
1507;
1508; NO-SIMD128-LABEL: shuffle_v2i64:
1509; NO-SIMD128:         .functype shuffle_v2i64 (i32, i64, i64, i64, i64) -> ()
1510; NO-SIMD128-NEXT:  # %bb.0:
1511; NO-SIMD128-NEXT:    i64.store 8($0), $4
1512; NO-SIMD128-NEXT:    i64.store 0($0), $1
1513; NO-SIMD128-NEXT:    return
1514  %res = shufflevector <2 x i64> %x, <2 x i64> %y, <2 x i32> <i32 0, i32 3>
1515  ret <2 x i64> %res
1516}
1517
1518define <2 x i64> @shuffle_undef_v2i64(<2 x i64> %x, <2 x i64> %y) {
1519; SIMD128-LABEL: shuffle_undef_v2i64:
1520; SIMD128:         .functype shuffle_undef_v2i64 (v128, v128) -> (v128)
1521; SIMD128-NEXT:  # %bb.0:
1522; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
1523; SIMD128-NEXT:    return $pop0
1524;
1525; NO-SIMD128-LABEL: shuffle_undef_v2i64:
1526; NO-SIMD128:         .functype shuffle_undef_v2i64 (i32, i64, i64, i64, i64) -> ()
1527; NO-SIMD128-NEXT:  # %bb.0:
1528; NO-SIMD128-NEXT:    i64.store 0($0), $2
1529; NO-SIMD128-NEXT:    return
1530  %res = shufflevector <2 x i64> %x, <2 x i64> %y,
1531    <2 x i32> <i32 1, i32 undef>
1532  ret <2 x i64> %res
1533}
1534
1535define <2 x i64> @build_v2i64(i64 %x0, i64 %x1) {
1536; SIMD128-LABEL: build_v2i64:
1537; SIMD128:         .functype build_v2i64 (i64, i64) -> (v128)
1538; SIMD128-NEXT:  # %bb.0:
1539; SIMD128-NEXT:    i64x2.splat $push0=, $0
1540; SIMD128-NEXT:    i64x2.replace_lane $push1=, $pop0, 1, $1
1541; SIMD128-NEXT:    return $pop1
1542;
1543; NO-SIMD128-LABEL: build_v2i64:
1544; NO-SIMD128:         .functype build_v2i64 (i32, i64, i64) -> ()
1545; NO-SIMD128-NEXT:  # %bb.0:
1546; NO-SIMD128-NEXT:    i64.store 8($0), $2
1547; NO-SIMD128-NEXT:    i64.store 0($0), $1
1548; NO-SIMD128-NEXT:    return
1549  %t0 = insertelement <2 x i64> undef, i64 %x0, i32 0
1550  %res = insertelement <2 x i64> %t0, i64 %x1, i32 1
1551  ret <2 x i64> %res
1552}
1553
1554; ==============================================================================
1555; 4 x f32
1556; ==============================================================================
1557define <4 x float> @const_v4f32() {
1558; SIMD128-LABEL: const_v4f32:
1559; SIMD128:         .functype const_v4f32 () -> (v128)
1560; SIMD128-NEXT:  # %bb.0:
1561; SIMD128-NEXT:    v128.const $push0=, 0x1.0402p-121, 0x1.0c0a08p-113, 0x1.14121p-105, 0x1.1c1a18p-97
1562; SIMD128-NEXT:    return $pop0
1563;
1564; NO-SIMD128-LABEL: const_v4f32:
1565; NO-SIMD128:         .functype const_v4f32 (i32) -> ()
1566; NO-SIMD128-NEXT:  # %bb.0:
1567; NO-SIMD128-NEXT:    i64.const $push0=, 1084818905618843912
1568; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
1569; NO-SIMD128-NEXT:    i64.const $push1=, 506097522914230528
1570; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
1571; NO-SIMD128-NEXT:    return
1572  ret <4 x float> <float 0x3860402000000000, float 0x38e0c0a080000000,
1573                   float 0x3961412100000000, float 0x39e1c1a180000000>
1574}
1575
1576define <4 x float> @splat_v4f32(float %x) {
1577; SIMD128-LABEL: splat_v4f32:
1578; SIMD128:         .functype splat_v4f32 (f32) -> (v128)
1579; SIMD128-NEXT:  # %bb.0:
1580; SIMD128-NEXT:    f32x4.splat $push0=, $0
1581; SIMD128-NEXT:    return $pop0
1582;
1583; NO-SIMD128-LABEL: splat_v4f32:
1584; NO-SIMD128:         .functype splat_v4f32 (i32, f32) -> ()
1585; NO-SIMD128-NEXT:  # %bb.0:
1586; NO-SIMD128-NEXT:    f32.store 12($0), $1
1587; NO-SIMD128-NEXT:    f32.store 8($0), $1
1588; NO-SIMD128-NEXT:    f32.store 4($0), $1
1589; NO-SIMD128-NEXT:    f32.store 0($0), $1
1590; NO-SIMD128-NEXT:    return
1591  %v = insertelement <4 x float> undef, float %x, i32 0
1592  %res = shufflevector <4 x float> %v, <4 x float> undef,
1593    <4 x i32> <i32 0, i32 0, i32 0, i32 0>
1594  ret <4 x float> %res
1595}
1596
1597define <4 x float> @const_splat_v4f32() {
1598; SIMD128-LABEL: const_splat_v4f32:
1599; SIMD128:         .functype const_splat_v4f32 () -> (v128)
1600; SIMD128-NEXT:  # %bb.0:
1601; SIMD128-NEXT:    v128.const $push0=, 0x1.5p5, 0x1.5p5, 0x1.5p5, 0x1.5p5
1602; SIMD128-NEXT:    return $pop0
1603;
1604; NO-SIMD128-LABEL: const_splat_v4f32:
1605; NO-SIMD128:         .functype const_splat_v4f32 (i32) -> ()
1606; NO-SIMD128-NEXT:  # %bb.0:
1607; NO-SIMD128-NEXT:    i64.const $push0=, 4767060206681587712
1608; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
1609; NO-SIMD128-NEXT:    i64.const $push1=, 4767060206681587712
1610; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
1611; NO-SIMD128-NEXT:    return
1612  ret <4 x float> <float 42., float 42., float 42., float 42.>
1613}
1614
1615define float @extract_v4f32(<4 x float> %v) {
1616; SIMD128-LABEL: extract_v4f32:
1617; SIMD128:         .functype extract_v4f32 (v128) -> (f32)
1618; SIMD128-NEXT:  # %bb.0:
1619; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 3
1620; SIMD128-NEXT:    return $pop0
1621;
1622; NO-SIMD128-LABEL: extract_v4f32:
1623; NO-SIMD128:         .functype extract_v4f32 (f32, f32, f32, f32) -> (f32)
1624; NO-SIMD128-NEXT:  # %bb.0:
1625; NO-SIMD128-NEXT:    return $3
1626  %elem = extractelement <4 x float> %v, i32 3
1627  ret float %elem
1628}
1629
1630define float @extract_var_v4f32(<4 x float> %v, i32 %i) {
1631; SIMD128-LABEL: extract_var_v4f32:
1632; SIMD128:         .functype extract_var_v4f32 (v128, i32) -> (f32)
1633; SIMD128-NEXT:  # %bb.0:
1634; SIMD128-NEXT:    global.get $push6=, __stack_pointer
1635; SIMD128-NEXT:    i32.const $push7=, 16
1636; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1637; SIMD128-NEXT:    local.tee $push8=, $2=, $pop9
1638; SIMD128-NEXT:    v128.store 0($pop8), $0
1639; SIMD128-NEXT:    i32.const $push0=, 3
1640; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
1641; SIMD128-NEXT:    i32.const $push2=, 2
1642; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1643; SIMD128-NEXT:    i32.or $push4=, $2, $pop3
1644; SIMD128-NEXT:    f32.load $push5=, 0($pop4)
1645; SIMD128-NEXT:    return $pop5
1646;
1647; NO-SIMD128-LABEL: extract_var_v4f32:
1648; NO-SIMD128:         .functype extract_var_v4f32 (f32, f32, f32, f32, i32) -> (f32)
1649; NO-SIMD128-NEXT:  # %bb.0:
1650; NO-SIMD128-NEXT:    global.get $push6=, __stack_pointer
1651; NO-SIMD128-NEXT:    i32.const $push7=, 16
1652; NO-SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1653; NO-SIMD128-NEXT:    local.tee $push8=, $5=, $pop9
1654; NO-SIMD128-NEXT:    f32.store 12($pop8), $3
1655; NO-SIMD128-NEXT:    f32.store 8($5), $2
1656; NO-SIMD128-NEXT:    f32.store 4($5), $1
1657; NO-SIMD128-NEXT:    f32.store 0($5), $0
1658; NO-SIMD128-NEXT:    i32.const $push0=, 3
1659; NO-SIMD128-NEXT:    i32.and $push1=, $4, $pop0
1660; NO-SIMD128-NEXT:    i32.const $push2=, 2
1661; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1662; NO-SIMD128-NEXT:    i32.or $push4=, $5, $pop3
1663; NO-SIMD128-NEXT:    f32.load $push5=, 0($pop4)
1664; NO-SIMD128-NEXT:    return $pop5
1665  %elem = extractelement <4 x float> %v, i32 %i
1666  ret float %elem
1667}
1668
1669define float @extract_zero_v4f32(<4 x float> %v) {
1670; SIMD128-LABEL: extract_zero_v4f32:
1671; SIMD128:         .functype extract_zero_v4f32 (v128) -> (f32)
1672; SIMD128-NEXT:  # %bb.0:
1673; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 0
1674; SIMD128-NEXT:    return $pop0
1675;
1676; NO-SIMD128-LABEL: extract_zero_v4f32:
1677; NO-SIMD128:         .functype extract_zero_v4f32 (f32, f32, f32, f32) -> (f32)
1678; NO-SIMD128-NEXT:  # %bb.0:
1679; NO-SIMD128-NEXT:    return $0
1680  %elem = extractelement <4 x float> %v, i32 0
1681  ret float %elem
1682}
1683
1684define <4 x float> @replace_v4f32(<4 x float> %v, float %x) {
1685; SIMD128-LABEL: replace_v4f32:
1686; SIMD128:         .functype replace_v4f32 (v128, f32) -> (v128)
1687; SIMD128-NEXT:  # %bb.0:
1688; SIMD128-NEXT:    f32x4.replace_lane $push0=, $0, 2, $1
1689; SIMD128-NEXT:    return $pop0
1690;
1691; NO-SIMD128-LABEL: replace_v4f32:
1692; NO-SIMD128:         .functype replace_v4f32 (i32, f32, f32, f32, f32, f32) -> ()
1693; NO-SIMD128-NEXT:  # %bb.0:
1694; NO-SIMD128-NEXT:    f32.store 12($0), $4
1695; NO-SIMD128-NEXT:    f32.store 8($0), $5
1696; NO-SIMD128-NEXT:    f32.store 4($0), $2
1697; NO-SIMD128-NEXT:    f32.store 0($0), $1
1698; NO-SIMD128-NEXT:    return
1699  %res = insertelement <4 x float> %v, float %x, i32 2
1700  ret <4 x float> %res
1701}
1702
1703define <4 x float> @replace_var_v4f32(<4 x float> %v, i32 %i, float %x) {
1704; SIMD128-LABEL: replace_var_v4f32:
1705; SIMD128:         .functype replace_var_v4f32 (v128, i32, f32) -> (v128)
1706; SIMD128-NEXT:  # %bb.0:
1707; SIMD128-NEXT:    global.get $push6=, __stack_pointer
1708; SIMD128-NEXT:    i32.const $push7=, 16
1709; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1710; SIMD128-NEXT:    local.tee $push8=, $3=, $pop9
1711; SIMD128-NEXT:    v128.store 0($pop8), $0
1712; SIMD128-NEXT:    i32.const $push0=, 3
1713; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
1714; SIMD128-NEXT:    i32.const $push2=, 2
1715; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1716; SIMD128-NEXT:    i32.or $push4=, $3, $pop3
1717; SIMD128-NEXT:    f32.store 0($pop4), $2
1718; SIMD128-NEXT:    v128.load $push5=, 0($3)
1719; SIMD128-NEXT:    return $pop5
1720;
1721; NO-SIMD128-LABEL: replace_var_v4f32:
1722; NO-SIMD128:         .functype replace_var_v4f32 (i32, f32, f32, f32, f32, i32, f32) -> ()
1723; NO-SIMD128-NEXT:  # %bb.0:
1724; NO-SIMD128-NEXT:    global.get $push7=, __stack_pointer
1725; NO-SIMD128-NEXT:    i32.const $push8=, 16
1726; NO-SIMD128-NEXT:    i32.sub $push10=, $pop7, $pop8
1727; NO-SIMD128-NEXT:    local.tee $push9=, $7=, $pop10
1728; NO-SIMD128-NEXT:    f32.store 12($pop9), $4
1729; NO-SIMD128-NEXT:    f32.store 8($7), $3
1730; NO-SIMD128-NEXT:    f32.store 4($7), $2
1731; NO-SIMD128-NEXT:    f32.store 0($7), $1
1732; NO-SIMD128-NEXT:    i32.const $push0=, 3
1733; NO-SIMD128-NEXT:    i32.and $push1=, $5, $pop0
1734; NO-SIMD128-NEXT:    i32.const $push2=, 2
1735; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1736; NO-SIMD128-NEXT:    i32.or $push4=, $7, $pop3
1737; NO-SIMD128-NEXT:    f32.store 0($pop4), $6
1738; NO-SIMD128-NEXT:    i64.load $push5=, 8($7)
1739; NO-SIMD128-NEXT:    i64.store 8($0), $pop5
1740; NO-SIMD128-NEXT:    i64.load $push6=, 0($7)
1741; NO-SIMD128-NEXT:    i64.store 0($0), $pop6
1742; NO-SIMD128-NEXT:    return
1743  %res = insertelement <4 x float> %v, float %x, i32 %i
1744  ret <4 x float> %res
1745}
1746
1747define <4 x float> @replace_zero_v4f32(<4 x float> %v, float %x) {
1748; SIMD128-LABEL: replace_zero_v4f32:
1749; SIMD128:         .functype replace_zero_v4f32 (v128, f32) -> (v128)
1750; SIMD128-NEXT:  # %bb.0:
1751; SIMD128-NEXT:    f32x4.replace_lane $push0=, $0, 0, $1
1752; SIMD128-NEXT:    return $pop0
1753;
1754; NO-SIMD128-LABEL: replace_zero_v4f32:
1755; NO-SIMD128:         .functype replace_zero_v4f32 (i32, f32, f32, f32, f32, f32) -> ()
1756; NO-SIMD128-NEXT:  # %bb.0:
1757; NO-SIMD128-NEXT:    f32.store 12($0), $4
1758; NO-SIMD128-NEXT:    f32.store 8($0), $3
1759; NO-SIMD128-NEXT:    f32.store 4($0), $2
1760; NO-SIMD128-NEXT:    f32.store 0($0), $5
1761; NO-SIMD128-NEXT:    return
1762  %res = insertelement <4 x float> %v, float %x, i32 0
1763  ret <4 x float> %res
1764}
1765
1766define <4 x float> @shuffle_v4f32(<4 x float> %x, <4 x float> %y) {
1767; SIMD128-LABEL: shuffle_v4f32:
1768; SIMD128:         .functype shuffle_v4f32 (v128, v128) -> (v128)
1769; SIMD128-NEXT:  # %bb.0:
1770; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $1, 0, 1, 2, 3, 20, 21, 22, 23, 8, 9, 10, 11, 28, 29, 30, 31
1771; SIMD128-NEXT:    return $pop0
1772;
1773; NO-SIMD128-LABEL: shuffle_v4f32:
1774; NO-SIMD128:         .functype shuffle_v4f32 (i32, f32, f32, f32, f32, f32, f32, f32, f32) -> ()
1775; NO-SIMD128-NEXT:  # %bb.0:
1776; NO-SIMD128-NEXT:    f32.store 12($0), $8
1777; NO-SIMD128-NEXT:    f32.store 8($0), $3
1778; NO-SIMD128-NEXT:    f32.store 4($0), $6
1779; NO-SIMD128-NEXT:    f32.store 0($0), $1
1780; NO-SIMD128-NEXT:    return
1781  %res = shufflevector <4 x float> %x, <4 x float> %y,
1782    <4 x i32> <i32 0, i32 5, i32 2, i32 7>
1783  ret <4 x float> %res
1784}
1785
1786define <4 x float> @shuffle_undef_v4f32(<4 x float> %x, <4 x float> %y) {
1787; SIMD128-LABEL: shuffle_undef_v4f32:
1788; SIMD128:         .functype shuffle_undef_v4f32 (v128, v128) -> (v128)
1789; SIMD128-NEXT:  # %bb.0:
1790; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
1791; SIMD128-NEXT:    return $pop0
1792;
1793; NO-SIMD128-LABEL: shuffle_undef_v4f32:
1794; NO-SIMD128:         .functype shuffle_undef_v4f32 (i32, f32, f32, f32, f32, f32, f32, f32, f32) -> ()
1795; NO-SIMD128-NEXT:  # %bb.0:
1796; NO-SIMD128-NEXT:    f32.store 0($0), $2
1797; NO-SIMD128-NEXT:    return
1798  %res = shufflevector <4 x float> %x, <4 x float> %y,
1799    <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
1800  ret <4 x float> %res
1801}
1802
1803define <4 x float> @build_v4f32(float %x0, float %x1, float %x2, float %x3) {
1804; SIMD128-LABEL: build_v4f32:
1805; SIMD128:         .functype build_v4f32 (f32, f32, f32, f32) -> (v128)
1806; SIMD128-NEXT:  # %bb.0:
1807; SIMD128-NEXT:    f32x4.splat $push0=, $0
1808; SIMD128-NEXT:    f32x4.replace_lane $push1=, $pop0, 1, $1
1809; SIMD128-NEXT:    f32x4.replace_lane $push2=, $pop1, 2, $2
1810; SIMD128-NEXT:    f32x4.replace_lane $push3=, $pop2, 3, $3
1811; SIMD128-NEXT:    return $pop3
1812;
1813; NO-SIMD128-LABEL: build_v4f32:
1814; NO-SIMD128:         .functype build_v4f32 (i32, f32, f32, f32, f32) -> ()
1815; NO-SIMD128-NEXT:  # %bb.0:
1816; NO-SIMD128-NEXT:    f32.store 12($0), $4
1817; NO-SIMD128-NEXT:    f32.store 8($0), $3
1818; NO-SIMD128-NEXT:    f32.store 4($0), $2
1819; NO-SIMD128-NEXT:    f32.store 0($0), $1
1820; NO-SIMD128-NEXT:    return
1821  %t0 = insertelement <4 x float> undef, float %x0, i32 0
1822  %t1 = insertelement <4 x float> %t0, float %x1, i32 1
1823  %t2 = insertelement <4 x float> %t1, float %x2, i32 2
1824  %res = insertelement <4 x float> %t2, float %x3, i32 3
1825  ret <4 x float> %res
1826}
1827
1828; ==============================================================================
1829; 2 x f64
1830; ==============================================================================
1831define <2 x double> @const_v2f64() {
1832; SIMD128-LABEL: const_v2f64:
1833; SIMD128:         .functype const_v2f64 () -> (v128)
1834; SIMD128-NEXT:  # %bb.0:
1835; SIMD128-NEXT:    v128.const $push0=, 0x1.60504030201p-911, 0x1.e0d0c0b0a0908p-783
1836; SIMD128-NEXT:    return $pop0
1837;
1838; NO-SIMD128-LABEL: const_v2f64:
1839; NO-SIMD128:         .functype const_v2f64 (i32) -> ()
1840; NO-SIMD128-NEXT:  # %bb.0:
1841; NO-SIMD128-NEXT:    i64.const $push0=, 1084818905618843912
1842; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
1843; NO-SIMD128-NEXT:    i64.const $push1=, 506097522914230528
1844; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
1845; NO-SIMD128-NEXT:    return
1846  ret <2 x double> <double 0x0706050403020100, double 0x0F0E0D0C0B0A0908>
1847}
1848
1849define <2 x double> @splat_v2f64(double %x) {
1850; SIMD128-LABEL: splat_v2f64:
1851; SIMD128:         .functype splat_v2f64 (f64) -> (v128)
1852; SIMD128-NEXT:  # %bb.0:
1853; SIMD128-NEXT:    f64x2.splat $push0=, $0
1854; SIMD128-NEXT:    return $pop0
1855;
1856; NO-SIMD128-LABEL: splat_v2f64:
1857; NO-SIMD128:         .functype splat_v2f64 (i32, f64) -> ()
1858; NO-SIMD128-NEXT:  # %bb.0:
1859; NO-SIMD128-NEXT:    f64.store 8($0), $1
1860; NO-SIMD128-NEXT:    f64.store 0($0), $1
1861; NO-SIMD128-NEXT:    return
1862  %t1 = insertelement <2 x double> zeroinitializer, double %x, i3 0
1863  %res = insertelement <2 x double> %t1, double %x, i32 1
1864  ret <2 x double> %res
1865}
1866
1867define <2 x double> @const_splat_v2f64() {
1868; SIMD128-LABEL: const_splat_v2f64:
1869; SIMD128:         .functype const_splat_v2f64 () -> (v128)
1870; SIMD128-NEXT:  # %bb.0:
1871; SIMD128-NEXT:    v128.const $push0=, 0x1.5p5, 0x1.5p5
1872; SIMD128-NEXT:    return $pop0
1873;
1874; NO-SIMD128-LABEL: const_splat_v2f64:
1875; NO-SIMD128:         .functype const_splat_v2f64 (i32) -> ()
1876; NO-SIMD128-NEXT:  # %bb.0:
1877; NO-SIMD128-NEXT:    i64.const $push0=, 4631107791820423168
1878; NO-SIMD128-NEXT:    i64.store 8($0), $pop0
1879; NO-SIMD128-NEXT:    i64.const $push1=, 4631107791820423168
1880; NO-SIMD128-NEXT:    i64.store 0($0), $pop1
1881; NO-SIMD128-NEXT:    return
1882  ret <2 x double> <double 42., double 42.>
1883}
1884
1885define double @extract_v2f64(<2 x double> %v) {
1886; SIMD128-LABEL: extract_v2f64:
1887; SIMD128:         .functype extract_v2f64 (v128) -> (f64)
1888; SIMD128-NEXT:  # %bb.0:
1889; SIMD128-NEXT:    f64x2.extract_lane $push0=, $0, 1
1890; SIMD128-NEXT:    return $pop0
1891;
1892; NO-SIMD128-LABEL: extract_v2f64:
1893; NO-SIMD128:         .functype extract_v2f64 (f64, f64) -> (f64)
1894; NO-SIMD128-NEXT:  # %bb.0:
1895; NO-SIMD128-NEXT:    return $1
1896  %elem = extractelement <2 x double> %v, i32 1
1897  ret double %elem
1898}
1899
1900define double @extract_var_v2f64(<2 x double> %v, i32 %i) {
1901; SIMD128-LABEL: extract_var_v2f64:
1902; SIMD128:         .functype extract_var_v2f64 (v128, i32) -> (f64)
1903; SIMD128-NEXT:  # %bb.0:
1904; SIMD128-NEXT:    global.get $push6=, __stack_pointer
1905; SIMD128-NEXT:    i32.const $push7=, 16
1906; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1907; SIMD128-NEXT:    local.tee $push8=, $2=, $pop9
1908; SIMD128-NEXT:    v128.store 0($pop8), $0
1909; SIMD128-NEXT:    i32.const $push0=, 1
1910; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
1911; SIMD128-NEXT:    i32.const $push2=, 3
1912; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1913; SIMD128-NEXT:    i32.or $push4=, $2, $pop3
1914; SIMD128-NEXT:    f64.load $push5=, 0($pop4)
1915; SIMD128-NEXT:    return $pop5
1916;
1917; NO-SIMD128-LABEL: extract_var_v2f64:
1918; NO-SIMD128:         .functype extract_var_v2f64 (f64, f64, i32) -> (f64)
1919; NO-SIMD128-NEXT:  # %bb.0:
1920; NO-SIMD128-NEXT:    global.get $push6=, __stack_pointer
1921; NO-SIMD128-NEXT:    i32.const $push7=, 16
1922; NO-SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1923; NO-SIMD128-NEXT:    local.tee $push8=, $3=, $pop9
1924; NO-SIMD128-NEXT:    f64.store 8($pop8), $1
1925; NO-SIMD128-NEXT:    f64.store 0($3), $0
1926; NO-SIMD128-NEXT:    i32.const $push0=, 1
1927; NO-SIMD128-NEXT:    i32.and $push1=, $2, $pop0
1928; NO-SIMD128-NEXT:    i32.const $push2=, 3
1929; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1930; NO-SIMD128-NEXT:    i32.or $push4=, $3, $pop3
1931; NO-SIMD128-NEXT:    f64.load $push5=, 0($pop4)
1932; NO-SIMD128-NEXT:    return $pop5
1933  %elem = extractelement <2 x double> %v, i32 %i
1934  ret double %elem
1935}
1936
1937define double @extract_zero_v2f64(<2 x double> %v) {
1938; SIMD128-LABEL: extract_zero_v2f64:
1939; SIMD128:         .functype extract_zero_v2f64 (v128) -> (f64)
1940; SIMD128-NEXT:  # %bb.0:
1941; SIMD128-NEXT:    f64x2.extract_lane $push0=, $0, 0
1942; SIMD128-NEXT:    return $pop0
1943;
1944; NO-SIMD128-LABEL: extract_zero_v2f64:
1945; NO-SIMD128:         .functype extract_zero_v2f64 (f64, f64) -> (f64)
1946; NO-SIMD128-NEXT:  # %bb.0:
1947; NO-SIMD128-NEXT:    return $0
1948  %elem = extractelement <2 x double> %v, i32 0
1949  ret double %elem
1950}
1951
1952define <2 x double> @replace_v2f64(<2 x double> %v, double %x) {
1953; SIMD128-LABEL: replace_v2f64:
1954; SIMD128:         .functype replace_v2f64 (v128, f64) -> (v128)
1955; SIMD128-NEXT:  # %bb.0:
1956; SIMD128-NEXT:    f64x2.replace_lane $push0=, $0, 0, $1
1957; SIMD128-NEXT:    return $pop0
1958;
1959; NO-SIMD128-LABEL: replace_v2f64:
1960; NO-SIMD128:         .functype replace_v2f64 (i32, f64, f64, f64) -> ()
1961; NO-SIMD128-NEXT:  # %bb.0:
1962; NO-SIMD128-NEXT:    f64.store 8($0), $2
1963; NO-SIMD128-NEXT:    f64.store 0($0), $3
1964; NO-SIMD128-NEXT:    return
1965  %res = insertelement <2 x double> %v, double %x, i32 0
1966  ret <2 x double> %res
1967}
1968
1969define <2 x double> @replace_var_v2f64(<2 x double> %v, i32 %i, double %x) {
1970; SIMD128-LABEL: replace_var_v2f64:
1971; SIMD128:         .functype replace_var_v2f64 (v128, i32, f64) -> (v128)
1972; SIMD128-NEXT:  # %bb.0:
1973; SIMD128-NEXT:    global.get $push6=, __stack_pointer
1974; SIMD128-NEXT:    i32.const $push7=, 16
1975; SIMD128-NEXT:    i32.sub $push9=, $pop6, $pop7
1976; SIMD128-NEXT:    local.tee $push8=, $3=, $pop9
1977; SIMD128-NEXT:    v128.store 0($pop8), $0
1978; SIMD128-NEXT:    i32.const $push0=, 1
1979; SIMD128-NEXT:    i32.and $push1=, $1, $pop0
1980; SIMD128-NEXT:    i32.const $push2=, 3
1981; SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
1982; SIMD128-NEXT:    i32.or $push4=, $3, $pop3
1983; SIMD128-NEXT:    f64.store 0($pop4), $2
1984; SIMD128-NEXT:    v128.load $push5=, 0($3)
1985; SIMD128-NEXT:    return $pop5
1986;
1987; NO-SIMD128-LABEL: replace_var_v2f64:
1988; NO-SIMD128:         .functype replace_var_v2f64 (i32, f64, f64, i32, f64) -> ()
1989; NO-SIMD128-NEXT:  # %bb.0:
1990; NO-SIMD128-NEXT:    global.get $push7=, __stack_pointer
1991; NO-SIMD128-NEXT:    i32.const $push8=, 16
1992; NO-SIMD128-NEXT:    i32.sub $push10=, $pop7, $pop8
1993; NO-SIMD128-NEXT:    local.tee $push9=, $5=, $pop10
1994; NO-SIMD128-NEXT:    f64.store 8($pop9), $2
1995; NO-SIMD128-NEXT:    f64.store 0($5), $1
1996; NO-SIMD128-NEXT:    i32.const $push0=, 1
1997; NO-SIMD128-NEXT:    i32.and $push1=, $3, $pop0
1998; NO-SIMD128-NEXT:    i32.const $push2=, 3
1999; NO-SIMD128-NEXT:    i32.shl $push3=, $pop1, $pop2
2000; NO-SIMD128-NEXT:    i32.or $push4=, $5, $pop3
2001; NO-SIMD128-NEXT:    f64.store 0($pop4), $4
2002; NO-SIMD128-NEXT:    f64.load $push5=, 8($5)
2003; NO-SIMD128-NEXT:    f64.store 8($0), $pop5
2004; NO-SIMD128-NEXT:    f64.load $push6=, 0($5)
2005; NO-SIMD128-NEXT:    f64.store 0($0), $pop6
2006; NO-SIMD128-NEXT:    return
2007  %res = insertelement <2 x double> %v, double %x, i32 %i
2008  ret <2 x double> %res
2009}
2010
2011define <2 x double> @replace_zero_v2f64(<2 x double> %v, double %x) {
2012; SIMD128-LABEL: replace_zero_v2f64:
2013; SIMD128:         .functype replace_zero_v2f64 (v128, f64) -> (v128)
2014; SIMD128-NEXT:  # %bb.0:
2015; SIMD128-NEXT:    f64x2.replace_lane $push0=, $0, 0, $1
2016; SIMD128-NEXT:    return $pop0
2017;
2018; NO-SIMD128-LABEL: replace_zero_v2f64:
2019; NO-SIMD128:         .functype replace_zero_v2f64 (i32, f64, f64, f64) -> ()
2020; NO-SIMD128-NEXT:  # %bb.0:
2021; NO-SIMD128-NEXT:    f64.store 8($0), $2
2022; NO-SIMD128-NEXT:    f64.store 0($0), $3
2023; NO-SIMD128-NEXT:    return
2024  %res = insertelement <2 x double> %v, double %x, i32 0
2025  ret <2 x double> %res
2026}
2027
2028define <2 x double> @shuffle_v2f64(<2 x double> %x, <2 x double> %y) {
2029; SIMD128-LABEL: shuffle_v2f64:
2030; SIMD128:         .functype shuffle_v2f64 (v128, v128) -> (v128)
2031; SIMD128-NEXT:  # %bb.0:
2032; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $1, 0, 1, 2, 3, 4, 5, 6, 7, 24, 25, 26, 27, 28, 29, 30, 31
2033; SIMD128-NEXT:    return $pop0
2034;
2035; NO-SIMD128-LABEL: shuffle_v2f64:
2036; NO-SIMD128:         .functype shuffle_v2f64 (i32, f64, f64, f64, f64) -> ()
2037; NO-SIMD128-NEXT:  # %bb.0:
2038; NO-SIMD128-NEXT:    f64.store 8($0), $4
2039; NO-SIMD128-NEXT:    f64.store 0($0), $1
2040; NO-SIMD128-NEXT:    return
2041  %res = shufflevector <2 x double> %x, <2 x double> %y,
2042    <2 x i32> <i32 0, i32 3>
2043  ret <2 x double> %res
2044}
2045
2046define <2 x double> @shuffle_undef_v2f64(<2 x double> %x, <2 x double> %y) {
2047; SIMD128-LABEL: shuffle_undef_v2f64:
2048; SIMD128:         .functype shuffle_undef_v2f64 (v128, v128) -> (v128)
2049; SIMD128-NEXT:  # %bb.0:
2050; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
2051; SIMD128-NEXT:    return $pop0
2052;
2053; NO-SIMD128-LABEL: shuffle_undef_v2f64:
2054; NO-SIMD128:         .functype shuffle_undef_v2f64 (i32, f64, f64, f64, f64) -> ()
2055; NO-SIMD128-NEXT:  # %bb.0:
2056; NO-SIMD128-NEXT:    f64.store 0($0), $2
2057; NO-SIMD128-NEXT:    return
2058  %res = shufflevector <2 x double> %x, <2 x double> %y,
2059    <2 x i32> <i32 1, i32 undef>
2060  ret <2 x double> %res
2061}
2062
2063define <2 x double> @build_v2f64(double %x0, double %x1) {
2064; SIMD128-LABEL: build_v2f64:
2065; SIMD128:         .functype build_v2f64 (f64, f64) -> (v128)
2066; SIMD128-NEXT:  # %bb.0:
2067; SIMD128-NEXT:    f64x2.splat $push0=, $0
2068; SIMD128-NEXT:    f64x2.replace_lane $push1=, $pop0, 1, $1
2069; SIMD128-NEXT:    return $pop1
2070;
2071; NO-SIMD128-LABEL: build_v2f64:
2072; NO-SIMD128:         .functype build_v2f64 (i32, f64, f64) -> ()
2073; NO-SIMD128-NEXT:  # %bb.0:
2074; NO-SIMD128-NEXT:    f64.store 8($0), $2
2075; NO-SIMD128-NEXT:    f64.store 0($0), $1
2076; NO-SIMD128-NEXT:    return
2077  %t0 = insertelement <2 x double> undef, double %x0, i32 0
2078  %res = insertelement <2 x double> %t0, double %x1, i32 1
2079  ret <2 x double> %res
2080}
2081