1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=wasm32-unknown-unknown -mattr=+simd128,+nontrapping-fptoint | FileCheck %s
3
4; i32 saturate
5
6define <2 x i32> @stest_f64i32(<2 x double> %x) {
7; CHECK-LABEL: stest_f64i32:
8; CHECK:         .functype stest_f64i32 (v128) -> (v128)
9; CHECK-NEXT:    .local v128
10; CHECK-NEXT:  # %bb.0: # %entry
11; CHECK-NEXT:    local.get 0
12; CHECK-NEXT:    f64x2.extract_lane 0
13; CHECK-NEXT:    i64.trunc_sat_f64_s
14; CHECK-NEXT:    i64x2.splat
15; CHECK-NEXT:    local.get 0
16; CHECK-NEXT:    f64x2.extract_lane 1
17; CHECK-NEXT:    i64.trunc_sat_f64_s
18; CHECK-NEXT:    i64x2.replace_lane 1
19; CHECK-NEXT:    local.tee 0
20; CHECK-NEXT:    v128.const 2147483647, 2147483647
21; CHECK-NEXT:    local.tee 1
22; CHECK-NEXT:    local.get 0
23; CHECK-NEXT:    local.get 1
24; CHECK-NEXT:    i64x2.lt_s
25; CHECK-NEXT:    v128.bitselect
26; CHECK-NEXT:    local.tee 0
27; CHECK-NEXT:    v128.const -2147483648, -2147483648
28; CHECK-NEXT:    local.tee 1
29; CHECK-NEXT:    local.get 0
30; CHECK-NEXT:    local.get 1
31; CHECK-NEXT:    i64x2.gt_s
32; CHECK-NEXT:    v128.bitselect
33; CHECK-NEXT:    local.get 0
34; CHECK-NEXT:    i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0
35; CHECK-NEXT:    # fallthrough-return
36entry:
37  %conv = fptosi <2 x double> %x to <2 x i64>
38  %0 = icmp slt <2 x i64> %conv, <i64 2147483647, i64 2147483647>
39  %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 2147483647, i64 2147483647>
40  %1 = icmp sgt <2 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648>
41  %spec.store.select7 = select <2 x i1> %1, <2 x i64> %spec.store.select, <2 x i64> <i64 -2147483648, i64 -2147483648>
42  %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
43  ret <2 x i32> %conv6
44}
45
46define <2 x i32> @utest_f64i32(<2 x double> %x) {
47; CHECK-LABEL: utest_f64i32:
48; CHECK:         .functype utest_f64i32 (v128) -> (v128)
49; CHECK-NEXT:    .local i64, i64
50; CHECK-NEXT:  # %bb.0: # %entry
51; CHECK-NEXT:    local.get 0
52; CHECK-NEXT:    f64x2.extract_lane 0
53; CHECK-NEXT:    i64.trunc_sat_f64_u
54; CHECK-NEXT:    local.tee 1
55; CHECK-NEXT:    i64x2.splat
56; CHECK-NEXT:    local.get 0
57; CHECK-NEXT:    f64x2.extract_lane 1
58; CHECK-NEXT:    i64.trunc_sat_f64_u
59; CHECK-NEXT:    local.tee 2
60; CHECK-NEXT:    i64x2.replace_lane 1
61; CHECK-NEXT:    v128.const 4294967295, 4294967295
62; CHECK-NEXT:    i64.const -1
63; CHECK-NEXT:    i64.const 0
64; CHECK-NEXT:    local.get 1
65; CHECK-NEXT:    i64.const 4294967295
66; CHECK-NEXT:    i64.lt_u
67; CHECK-NEXT:    i64.select
68; CHECK-NEXT:    i64x2.splat
69; CHECK-NEXT:    i64.const -1
70; CHECK-NEXT:    i64.const 0
71; CHECK-NEXT:    local.get 2
72; CHECK-NEXT:    i64.const 4294967295
73; CHECK-NEXT:    i64.lt_u
74; CHECK-NEXT:    i64.select
75; CHECK-NEXT:    i64x2.replace_lane 1
76; CHECK-NEXT:    v128.bitselect
77; CHECK-NEXT:    local.get 0
78; CHECK-NEXT:    i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0
79; CHECK-NEXT:    # fallthrough-return
80entry:
81  %conv = fptoui <2 x double> %x to <2 x i64>
82  %0 = icmp ult <2 x i64> %conv, <i64 4294967295, i64 4294967295>
83  %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>
84  %conv6 = trunc <2 x i64> %spec.store.select to <2 x i32>
85  ret <2 x i32> %conv6
86}
87
88define <2 x i32> @ustest_f64i32(<2 x double> %x) {
89; CHECK-LABEL: ustest_f64i32:
90; CHECK:         .functype ustest_f64i32 (v128) -> (v128)
91; CHECK-NEXT:    .local v128
92; CHECK-NEXT:  # %bb.0: # %entry
93; CHECK-NEXT:    local.get 0
94; CHECK-NEXT:    f64x2.extract_lane 0
95; CHECK-NEXT:    i64.trunc_sat_f64_s
96; CHECK-NEXT:    i64x2.splat
97; CHECK-NEXT:    local.get 0
98; CHECK-NEXT:    f64x2.extract_lane 1
99; CHECK-NEXT:    i64.trunc_sat_f64_s
100; CHECK-NEXT:    i64x2.replace_lane 1
101; CHECK-NEXT:    local.tee 0
102; CHECK-NEXT:    v128.const 4294967295, 4294967295
103; CHECK-NEXT:    local.tee 1
104; CHECK-NEXT:    local.get 0
105; CHECK-NEXT:    local.get 1
106; CHECK-NEXT:    i64x2.lt_s
107; CHECK-NEXT:    v128.bitselect
108; CHECK-NEXT:    local.tee 0
109; CHECK-NEXT:    v128.const 0, 0
110; CHECK-NEXT:    local.tee 1
111; CHECK-NEXT:    local.get 0
112; CHECK-NEXT:    local.get 1
113; CHECK-NEXT:    i64x2.gt_s
114; CHECK-NEXT:    v128.bitselect
115; CHECK-NEXT:    local.get 0
116; CHECK-NEXT:    i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0
117; CHECK-NEXT:    # fallthrough-return
118entry:
119  %conv = fptosi <2 x double> %x to <2 x i64>
120  %0 = icmp slt <2 x i64> %conv, <i64 4294967295, i64 4294967295>
121  %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>
122  %1 = icmp sgt <2 x i64> %spec.store.select, zeroinitializer
123  %spec.store.select7 = select <2 x i1> %1, <2 x i64> %spec.store.select, <2 x i64> zeroinitializer
124  %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
125  ret <2 x i32> %conv6
126}
127
128define <4 x i32> @stest_f32i32(<4 x float> %x) {
129; CHECK-LABEL: stest_f32i32:
130; CHECK:         .functype stest_f32i32 (v128) -> (v128)
131; CHECK-NEXT:  # %bb.0: # %entry
132; CHECK-NEXT:    local.get 0
133; CHECK-NEXT:    i32x4.trunc_sat_f32x4_s
134; CHECK-NEXT:    # fallthrough-return
135entry:
136  %conv = fptosi <4 x float> %x to <4 x i64>
137  %0 = icmp slt <4 x i64> %conv, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
138  %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
139  %1 = icmp sgt <4 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
140  %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
141  %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
142  ret <4 x i32> %conv6
143}
144
145define <4 x i32> @utest_f32i32(<4 x float> %x) {
146; CHECK-LABEL: utest_f32i32:
147; CHECK:         .functype utest_f32i32 (v128) -> (v128)
148; CHECK-NEXT:    .local i64, i64, v128
149; CHECK-NEXT:  # %bb.0: # %entry
150; CHECK-NEXT:    local.get 0
151; CHECK-NEXT:    f32x4.extract_lane 0
152; CHECK-NEXT:    i64.trunc_sat_f32_u
153; CHECK-NEXT:    local.tee 1
154; CHECK-NEXT:    i64x2.splat
155; CHECK-NEXT:    local.get 0
156; CHECK-NEXT:    f32x4.extract_lane 1
157; CHECK-NEXT:    i64.trunc_sat_f32_u
158; CHECK-NEXT:    local.tee 2
159; CHECK-NEXT:    i64x2.replace_lane 1
160; CHECK-NEXT:    v128.const 4294967295, 4294967295
161; CHECK-NEXT:    local.tee 3
162; CHECK-NEXT:    i64.const -1
163; CHECK-NEXT:    i64.const 0
164; CHECK-NEXT:    local.get 1
165; CHECK-NEXT:    i64.const 4294967295
166; CHECK-NEXT:    i64.lt_u
167; CHECK-NEXT:    i64.select
168; CHECK-NEXT:    i64x2.splat
169; CHECK-NEXT:    i64.const -1
170; CHECK-NEXT:    i64.const 0
171; CHECK-NEXT:    local.get 2
172; CHECK-NEXT:    i64.const 4294967295
173; CHECK-NEXT:    i64.lt_u
174; CHECK-NEXT:    i64.select
175; CHECK-NEXT:    i64x2.replace_lane 1
176; CHECK-NEXT:    v128.bitselect
177; CHECK-NEXT:    local.get 0
178; CHECK-NEXT:    f32x4.extract_lane 2
179; CHECK-NEXT:    i64.trunc_sat_f32_u
180; CHECK-NEXT:    local.tee 1
181; CHECK-NEXT:    i64x2.splat
182; CHECK-NEXT:    local.get 0
183; CHECK-NEXT:    f32x4.extract_lane 3
184; CHECK-NEXT:    i64.trunc_sat_f32_u
185; CHECK-NEXT:    local.tee 2
186; CHECK-NEXT:    i64x2.replace_lane 1
187; CHECK-NEXT:    local.get 3
188; CHECK-NEXT:    i64.const -1
189; CHECK-NEXT:    i64.const 0
190; CHECK-NEXT:    local.get 1
191; CHECK-NEXT:    i64.const 4294967295
192; CHECK-NEXT:    i64.lt_u
193; CHECK-NEXT:    i64.select
194; CHECK-NEXT:    i64x2.splat
195; CHECK-NEXT:    i64.const -1
196; CHECK-NEXT:    i64.const 0
197; CHECK-NEXT:    local.get 2
198; CHECK-NEXT:    i64.const 4294967295
199; CHECK-NEXT:    i64.lt_u
200; CHECK-NEXT:    i64.select
201; CHECK-NEXT:    i64x2.replace_lane 1
202; CHECK-NEXT:    v128.bitselect
203; CHECK-NEXT:    i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27
204; CHECK-NEXT:    # fallthrough-return
205entry:
206  %conv = fptoui <4 x float> %x to <4 x i64>
207  %0 = icmp ult <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
208  %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
209  %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
210  ret <4 x i32> %conv6
211}
212
213define <4 x i32> @ustest_f32i32(<4 x float> %x) {
214; CHECK-LABEL: ustest_f32i32:
215; CHECK:         .functype ustest_f32i32 (v128) -> (v128)
216; CHECK-NEXT:  # %bb.0: # %entry
217; CHECK-NEXT:    local.get 0
218; CHECK-NEXT:    i32x4.trunc_sat_f32x4_u
219; CHECK-NEXT:    # fallthrough-return
220entry:
221  %conv = fptosi <4 x float> %x to <4 x i64>
222  %0 = icmp slt <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
223  %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
224  %1 = icmp sgt <4 x i64> %spec.store.select, zeroinitializer
225  %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> zeroinitializer
226  %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
227  ret <4 x i32> %conv6
228}
229
230define <4 x i32> @stest_f16i32(<4 x half> %x) {
231; CHECK-LABEL: stest_f16i32:
232; CHECK:         .functype stest_f16i32 (f32, f32, f32, f32) -> (v128)
233; CHECK-NEXT:  # %bb.0: # %entry
234; CHECK-NEXT:    local.get 1
235; CHECK-NEXT:    call __truncsfhf2
236; CHECK-NEXT:    call __extendhfsf2
237; CHECK-NEXT:    local.set 1
238; CHECK-NEXT:    local.get 0
239; CHECK-NEXT:    call __truncsfhf2
240; CHECK-NEXT:    call __extendhfsf2
241; CHECK-NEXT:    i32.trunc_sat_f32_s
242; CHECK-NEXT:    i32x4.splat
243; CHECK-NEXT:    local.get 1
244; CHECK-NEXT:    i32.trunc_sat_f32_s
245; CHECK-NEXT:    i32x4.replace_lane 1
246; CHECK-NEXT:    local.get 2
247; CHECK-NEXT:    call __truncsfhf2
248; CHECK-NEXT:    call __extendhfsf2
249; CHECK-NEXT:    i32.trunc_sat_f32_s
250; CHECK-NEXT:    i32x4.replace_lane 2
251; CHECK-NEXT:    local.get 3
252; CHECK-NEXT:    call __truncsfhf2
253; CHECK-NEXT:    call __extendhfsf2
254; CHECK-NEXT:    i32.trunc_sat_f32_s
255; CHECK-NEXT:    i32x4.replace_lane 3
256; CHECK-NEXT:    # fallthrough-return
257entry:
258  %conv = fptosi <4 x half> %x to <4 x i64>
259  %0 = icmp slt <4 x i64> %conv, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
260  %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
261  %1 = icmp sgt <4 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
262  %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
263  %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
264  ret <4 x i32> %conv6
265}
266
267define <4 x i32> @utesth_f16i32(<4 x half> %x) {
268; CHECK-LABEL: utesth_f16i32:
269; CHECK:         .functype utesth_f16i32 (f32, f32, f32, f32) -> (v128)
270; CHECK-NEXT:    .local i64, i64, v128
271; CHECK-NEXT:  # %bb.0: # %entry
272; CHECK-NEXT:    local.get 3
273; CHECK-NEXT:    call __truncsfhf2
274; CHECK-NEXT:    call __extendhfsf2
275; CHECK-NEXT:    local.set 3
276; CHECK-NEXT:    local.get 2
277; CHECK-NEXT:    call __truncsfhf2
278; CHECK-NEXT:    call __extendhfsf2
279; CHECK-NEXT:    local.set 2
280; CHECK-NEXT:    local.get 1
281; CHECK-NEXT:    call __truncsfhf2
282; CHECK-NEXT:    call __extendhfsf2
283; CHECK-NEXT:    local.set 1
284; CHECK-NEXT:    local.get 0
285; CHECK-NEXT:    call __truncsfhf2
286; CHECK-NEXT:    call __extendhfsf2
287; CHECK-NEXT:    i64.trunc_sat_f32_u
288; CHECK-NEXT:    local.tee 4
289; CHECK-NEXT:    i64x2.splat
290; CHECK-NEXT:    local.get 1
291; CHECK-NEXT:    i64.trunc_sat_f32_u
292; CHECK-NEXT:    local.tee 5
293; CHECK-NEXT:    i64x2.replace_lane 1
294; CHECK-NEXT:    v128.const 4294967295, 4294967295
295; CHECK-NEXT:    local.tee 6
296; CHECK-NEXT:    i64.const -1
297; CHECK-NEXT:    i64.const 0
298; CHECK-NEXT:    local.get 4
299; CHECK-NEXT:    i64.const 4294967295
300; CHECK-NEXT:    i64.lt_u
301; CHECK-NEXT:    i64.select
302; CHECK-NEXT:    i64x2.splat
303; CHECK-NEXT:    i64.const -1
304; CHECK-NEXT:    i64.const 0
305; CHECK-NEXT:    local.get 5
306; CHECK-NEXT:    i64.const 4294967295
307; CHECK-NEXT:    i64.lt_u
308; CHECK-NEXT:    i64.select
309; CHECK-NEXT:    i64x2.replace_lane 1
310; CHECK-NEXT:    v128.bitselect
311; CHECK-NEXT:    local.get 2
312; CHECK-NEXT:    i64.trunc_sat_f32_u
313; CHECK-NEXT:    local.tee 4
314; CHECK-NEXT:    i64x2.splat
315; CHECK-NEXT:    local.get 3
316; CHECK-NEXT:    i64.trunc_sat_f32_u
317; CHECK-NEXT:    local.tee 5
318; CHECK-NEXT:    i64x2.replace_lane 1
319; CHECK-NEXT:    local.get 6
320; CHECK-NEXT:    i64.const -1
321; CHECK-NEXT:    i64.const 0
322; CHECK-NEXT:    local.get 4
323; CHECK-NEXT:    i64.const 4294967295
324; CHECK-NEXT:    i64.lt_u
325; CHECK-NEXT:    i64.select
326; CHECK-NEXT:    i64x2.splat
327; CHECK-NEXT:    i64.const -1
328; CHECK-NEXT:    i64.const 0
329; CHECK-NEXT:    local.get 5
330; CHECK-NEXT:    i64.const 4294967295
331; CHECK-NEXT:    i64.lt_u
332; CHECK-NEXT:    i64.select
333; CHECK-NEXT:    i64x2.replace_lane 1
334; CHECK-NEXT:    v128.bitselect
335; CHECK-NEXT:    i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27
336; CHECK-NEXT:    # fallthrough-return
337entry:
338  %conv = fptoui <4 x half> %x to <4 x i64>
339  %0 = icmp ult <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
340  %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
341  %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
342  ret <4 x i32> %conv6
343}
344
345define <4 x i32> @ustest_f16i32(<4 x half> %x) {
346; CHECK-LABEL: ustest_f16i32:
347; CHECK:         .functype ustest_f16i32 (f32, f32, f32, f32) -> (v128)
348; CHECK-NEXT:  # %bb.0: # %entry
349; CHECK-NEXT:    local.get 1
350; CHECK-NEXT:    call __truncsfhf2
351; CHECK-NEXT:    call __extendhfsf2
352; CHECK-NEXT:    local.set 1
353; CHECK-NEXT:    local.get 0
354; CHECK-NEXT:    call __truncsfhf2
355; CHECK-NEXT:    call __extendhfsf2
356; CHECK-NEXT:    i32.trunc_sat_f32_u
357; CHECK-NEXT:    i32x4.splat
358; CHECK-NEXT:    local.get 1
359; CHECK-NEXT:    i32.trunc_sat_f32_u
360; CHECK-NEXT:    i32x4.replace_lane 1
361; CHECK-NEXT:    local.get 2
362; CHECK-NEXT:    call __truncsfhf2
363; CHECK-NEXT:    call __extendhfsf2
364; CHECK-NEXT:    i32.trunc_sat_f32_u
365; CHECK-NEXT:    i32x4.replace_lane 2
366; CHECK-NEXT:    local.get 3
367; CHECK-NEXT:    call __truncsfhf2
368; CHECK-NEXT:    call __extendhfsf2
369; CHECK-NEXT:    i32.trunc_sat_f32_u
370; CHECK-NEXT:    i32x4.replace_lane 3
371; CHECK-NEXT:    # fallthrough-return
372entry:
373  %conv = fptosi <4 x half> %x to <4 x i64>
374  %0 = icmp slt <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
375  %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
376  %1 = icmp sgt <4 x i64> %spec.store.select, zeroinitializer
377  %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> zeroinitializer
378  %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
379  ret <4 x i32> %conv6
380}
381
382; i16 saturate
383
384define <2 x i16> @stest_f64i16(<2 x double> %x) {
385; CHECK-LABEL: stest_f64i16:
386; CHECK:         .functype stest_f64i16 (v128) -> (v128)
387; CHECK-NEXT:  # %bb.0: # %entry
388; CHECK-NEXT:    local.get 0
389; CHECK-NEXT:    f64x2.extract_lane 0
390; CHECK-NEXT:    i32.trunc_sat_f64_s
391; CHECK-NEXT:    i32x4.splat
392; CHECK-NEXT:    local.get 0
393; CHECK-NEXT:    f64x2.extract_lane 1
394; CHECK-NEXT:    i32.trunc_sat_f64_s
395; CHECK-NEXT:    i32x4.replace_lane 1
396; CHECK-NEXT:    v128.const 32767, 32767, 0, 0
397; CHECK-NEXT:    i32x4.min_s
398; CHECK-NEXT:    v128.const -32768, -32768, 0, 0
399; CHECK-NEXT:    i32x4.max_s
400; CHECK-NEXT:    local.get 0
401; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
402; CHECK-NEXT:    # fallthrough-return
403entry:
404  %conv = fptosi <2 x double> %x to <2 x i32>
405  %0 = icmp slt <2 x i32> %conv, <i32 32767, i32 32767>
406  %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 32767, i32 32767>
407  %1 = icmp sgt <2 x i32> %spec.store.select, <i32 -32768, i32 -32768>
408  %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> <i32 -32768, i32 -32768>
409  %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
410  ret <2 x i16> %conv6
411}
412
413define <2 x i16> @utest_f64i16(<2 x double> %x) {
414; CHECK-LABEL: utest_f64i16:
415; CHECK:         .functype utest_f64i16 (v128) -> (v128)
416; CHECK-NEXT:  # %bb.0: # %entry
417; CHECK-NEXT:    local.get 0
418; CHECK-NEXT:    f64x2.extract_lane 0
419; CHECK-NEXT:    i32.trunc_sat_f64_u
420; CHECK-NEXT:    i32x4.splat
421; CHECK-NEXT:    local.get 0
422; CHECK-NEXT:    f64x2.extract_lane 1
423; CHECK-NEXT:    i32.trunc_sat_f64_u
424; CHECK-NEXT:    i32x4.replace_lane 1
425; CHECK-NEXT:    v128.const 65535, 65535, 0, 0
426; CHECK-NEXT:    i32x4.min_u
427; CHECK-NEXT:    local.get 0
428; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
429; CHECK-NEXT:    # fallthrough-return
430entry:
431  %conv = fptoui <2 x double> %x to <2 x i32>
432  %0 = icmp ult <2 x i32> %conv, <i32 65535, i32 65535>
433  %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>
434  %conv6 = trunc <2 x i32> %spec.store.select to <2 x i16>
435  ret <2 x i16> %conv6
436}
437
438define <2 x i16> @ustest_f64i16(<2 x double> %x) {
439; CHECK-LABEL: ustest_f64i16:
440; CHECK:         .functype ustest_f64i16 (v128) -> (v128)
441; CHECK-NEXT:  # %bb.0: # %entry
442; CHECK-NEXT:    local.get 0
443; CHECK-NEXT:    f64x2.extract_lane 0
444; CHECK-NEXT:    i32.trunc_sat_f64_s
445; CHECK-NEXT:    i32x4.splat
446; CHECK-NEXT:    local.get 0
447; CHECK-NEXT:    f64x2.extract_lane 1
448; CHECK-NEXT:    i32.trunc_sat_f64_s
449; CHECK-NEXT:    i32x4.replace_lane 1
450; CHECK-NEXT:    v128.const 65535, 65535, 0, 0
451; CHECK-NEXT:    i32x4.min_s
452; CHECK-NEXT:    v128.const 0, 0, 0, 0
453; CHECK-NEXT:    i32x4.max_s
454; CHECK-NEXT:    local.get 0
455; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
456; CHECK-NEXT:    # fallthrough-return
457entry:
458  %conv = fptosi <2 x double> %x to <2 x i32>
459  %0 = icmp slt <2 x i32> %conv, <i32 65535, i32 65535>
460  %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>
461  %1 = icmp sgt <2 x i32> %spec.store.select, zeroinitializer
462  %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> zeroinitializer
463  %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
464  ret <2 x i16> %conv6
465}
466
467define <4 x i16> @stest_f32i16(<4 x float> %x) {
468; CHECK-LABEL: stest_f32i16:
469; CHECK:         .functype stest_f32i16 (v128) -> (v128)
470; CHECK-NEXT:  # %bb.0: # %entry
471; CHECK-NEXT:    local.get 0
472; CHECK-NEXT:    i32x4.trunc_sat_f32x4_s
473; CHECK-NEXT:    v128.const 32767, 32767, 32767, 32767
474; CHECK-NEXT:    i32x4.min_s
475; CHECK-NEXT:    v128.const -32768, -32768, -32768, -32768
476; CHECK-NEXT:    i32x4.max_s
477; CHECK-NEXT:    local.get 0
478; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0
479; CHECK-NEXT:    # fallthrough-return
480entry:
481  %conv = fptosi <4 x float> %x to <4 x i32>
482  %0 = icmp slt <4 x i32> %conv, <i32 32767, i32 32767, i32 32767, i32 32767>
483  %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
484  %1 = icmp sgt <4 x i32> %spec.store.select, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
485  %spec.store.select7 = select <4 x i1> %1, <4 x i32> %spec.store.select, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
486  %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
487  ret <4 x i16> %conv6
488}
489
490define <4 x i16> @utest_f32i16(<4 x float> %x) {
491; CHECK-LABEL: utest_f32i16:
492; CHECK:         .functype utest_f32i16 (v128) -> (v128)
493; CHECK-NEXT:  # %bb.0: # %entry
494; CHECK-NEXT:    local.get 0
495; CHECK-NEXT:    i32x4.trunc_sat_f32x4_u
496; CHECK-NEXT:    v128.const 65535, 65535, 65535, 65535
497; CHECK-NEXT:    i32x4.min_u
498; CHECK-NEXT:    local.get 0
499; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0
500; CHECK-NEXT:    # fallthrough-return
501entry:
502  %conv = fptoui <4 x float> %x to <4 x i32>
503  %0 = icmp ult <4 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535>
504  %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
505  %conv6 = trunc <4 x i32> %spec.store.select to <4 x i16>
506  ret <4 x i16> %conv6
507}
508
509define <4 x i16> @ustest_f32i16(<4 x float> %x) {
510; CHECK-LABEL: ustest_f32i16:
511; CHECK:         .functype ustest_f32i16 (v128) -> (v128)
512; CHECK-NEXT:  # %bb.0: # %entry
513; CHECK-NEXT:    local.get 0
514; CHECK-NEXT:    i32x4.trunc_sat_f32x4_s
515; CHECK-NEXT:    v128.const 65535, 65535, 65535, 65535
516; CHECK-NEXT:    i32x4.min_s
517; CHECK-NEXT:    v128.const 0, 0, 0, 0
518; CHECK-NEXT:    i32x4.max_s
519; CHECK-NEXT:    local.get 0
520; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0
521; CHECK-NEXT:    # fallthrough-return
522entry:
523  %conv = fptosi <4 x float> %x to <4 x i32>
524  %0 = icmp slt <4 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535>
525  %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
526  %1 = icmp sgt <4 x i32> %spec.store.select, zeroinitializer
527  %spec.store.select7 = select <4 x i1> %1, <4 x i32> %spec.store.select, <4 x i32> zeroinitializer
528  %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
529  ret <4 x i16> %conv6
530}
531
532define <8 x i16> @stest_f16i16(<8 x half> %x) {
533; CHECK-LABEL: stest_f16i16:
534; CHECK:         .functype stest_f16i16 (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)
535; CHECK-NEXT:    .local v128, v128, v128
536; CHECK-NEXT:  # %bb.0: # %entry
537; CHECK-NEXT:    local.get 5
538; CHECK-NEXT:    call __truncsfhf2
539; CHECK-NEXT:    call __extendhfsf2
540; CHECK-NEXT:    local.set 5
541; CHECK-NEXT:    local.get 4
542; CHECK-NEXT:    call __truncsfhf2
543; CHECK-NEXT:    call __extendhfsf2
544; CHECK-NEXT:    local.set 4
545; CHECK-NEXT:    local.get 6
546; CHECK-NEXT:    call __truncsfhf2
547; CHECK-NEXT:    call __extendhfsf2
548; CHECK-NEXT:    local.set 6
549; CHECK-NEXT:    local.get 7
550; CHECK-NEXT:    call __truncsfhf2
551; CHECK-NEXT:    call __extendhfsf2
552; CHECK-NEXT:    local.set 7
553; CHECK-NEXT:    local.get 1
554; CHECK-NEXT:    call __truncsfhf2
555; CHECK-NEXT:    call __extendhfsf2
556; CHECK-NEXT:    local.set 1
557; CHECK-NEXT:    local.get 0
558; CHECK-NEXT:    call __truncsfhf2
559; CHECK-NEXT:    call __extendhfsf2
560; CHECK-NEXT:    i32.trunc_sat_f32_s
561; CHECK-NEXT:    i32x4.splat
562; CHECK-NEXT:    local.get 1
563; CHECK-NEXT:    i32.trunc_sat_f32_s
564; CHECK-NEXT:    i32x4.replace_lane 1
565; CHECK-NEXT:    local.get 2
566; CHECK-NEXT:    call __truncsfhf2
567; CHECK-NEXT:    call __extendhfsf2
568; CHECK-NEXT:    i32.trunc_sat_f32_s
569; CHECK-NEXT:    i32x4.replace_lane 2
570; CHECK-NEXT:    local.get 3
571; CHECK-NEXT:    call __truncsfhf2
572; CHECK-NEXT:    call __extendhfsf2
573; CHECK-NEXT:    i32.trunc_sat_f32_s
574; CHECK-NEXT:    i32x4.replace_lane 3
575; CHECK-NEXT:    v128.const 32767, 32767, 32767, 32767
576; CHECK-NEXT:    local.tee 8
577; CHECK-NEXT:    i32x4.min_s
578; CHECK-NEXT:    v128.const -32768, -32768, -32768, -32768
579; CHECK-NEXT:    local.tee 9
580; CHECK-NEXT:    i32x4.max_s
581; CHECK-NEXT:    v128.const 65535, 65535, 65535, 65535
582; CHECK-NEXT:    local.tee 10
583; CHECK-NEXT:    v128.and
584; CHECK-NEXT:    local.get 4
585; CHECK-NEXT:    i32.trunc_sat_f32_s
586; CHECK-NEXT:    i32x4.splat
587; CHECK-NEXT:    local.get 5
588; CHECK-NEXT:    i32.trunc_sat_f32_s
589; CHECK-NEXT:    i32x4.replace_lane 1
590; CHECK-NEXT:    local.get 6
591; CHECK-NEXT:    i32.trunc_sat_f32_s
592; CHECK-NEXT:    i32x4.replace_lane 2
593; CHECK-NEXT:    local.get 7
594; CHECK-NEXT:    i32.trunc_sat_f32_s
595; CHECK-NEXT:    i32x4.replace_lane 3
596; CHECK-NEXT:    local.get 8
597; CHECK-NEXT:    i32x4.min_s
598; CHECK-NEXT:    local.get 9
599; CHECK-NEXT:    i32x4.max_s
600; CHECK-NEXT:    local.get 10
601; CHECK-NEXT:    v128.and
602; CHECK-NEXT:    i16x8.narrow_i32x4_u
603; CHECK-NEXT:    # fallthrough-return
604entry:
605  %conv = fptosi <8 x half> %x to <8 x i32>
606  %0 = icmp slt <8 x i32> %conv, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
607  %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
608  %1 = icmp sgt <8 x i32> %spec.store.select, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
609  %spec.store.select7 = select <8 x i1> %1, <8 x i32> %spec.store.select, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
610  %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
611  ret <8 x i16> %conv6
612}
613
614define <8 x i16> @utesth_f16i16(<8 x half> %x) {
615; CHECK-LABEL: utesth_f16i16:
616; CHECK:         .functype utesth_f16i16 (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)
617; CHECK-NEXT:    .local v128
618; CHECK-NEXT:  # %bb.0: # %entry
619; CHECK-NEXT:    local.get 5
620; CHECK-NEXT:    call __truncsfhf2
621; CHECK-NEXT:    call __extendhfsf2
622; CHECK-NEXT:    local.set 5
623; CHECK-NEXT:    local.get 4
624; CHECK-NEXT:    call __truncsfhf2
625; CHECK-NEXT:    call __extendhfsf2
626; CHECK-NEXT:    local.set 4
627; CHECK-NEXT:    local.get 6
628; CHECK-NEXT:    call __truncsfhf2
629; CHECK-NEXT:    call __extendhfsf2
630; CHECK-NEXT:    local.set 6
631; CHECK-NEXT:    local.get 7
632; CHECK-NEXT:    call __truncsfhf2
633; CHECK-NEXT:    call __extendhfsf2
634; CHECK-NEXT:    local.set 7
635; CHECK-NEXT:    local.get 1
636; CHECK-NEXT:    call __truncsfhf2
637; CHECK-NEXT:    call __extendhfsf2
638; CHECK-NEXT:    local.set 1
639; CHECK-NEXT:    local.get 0
640; CHECK-NEXT:    call __truncsfhf2
641; CHECK-NEXT:    call __extendhfsf2
642; CHECK-NEXT:    i32.trunc_sat_f32_u
643; CHECK-NEXT:    i32x4.splat
644; CHECK-NEXT:    local.get 1
645; CHECK-NEXT:    i32.trunc_sat_f32_u
646; CHECK-NEXT:    i32x4.replace_lane 1
647; CHECK-NEXT:    local.get 2
648; CHECK-NEXT:    call __truncsfhf2
649; CHECK-NEXT:    call __extendhfsf2
650; CHECK-NEXT:    i32.trunc_sat_f32_u
651; CHECK-NEXT:    i32x4.replace_lane 2
652; CHECK-NEXT:    local.get 3
653; CHECK-NEXT:    call __truncsfhf2
654; CHECK-NEXT:    call __extendhfsf2
655; CHECK-NEXT:    i32.trunc_sat_f32_u
656; CHECK-NEXT:    i32x4.replace_lane 3
657; CHECK-NEXT:    v128.const 65535, 65535, 65535, 65535
658; CHECK-NEXT:    local.tee 8
659; CHECK-NEXT:    i32x4.min_u
660; CHECK-NEXT:    local.get 4
661; CHECK-NEXT:    i32.trunc_sat_f32_u
662; CHECK-NEXT:    i32x4.splat
663; CHECK-NEXT:    local.get 5
664; CHECK-NEXT:    i32.trunc_sat_f32_u
665; CHECK-NEXT:    i32x4.replace_lane 1
666; CHECK-NEXT:    local.get 6
667; CHECK-NEXT:    i32.trunc_sat_f32_u
668; CHECK-NEXT:    i32x4.replace_lane 2
669; CHECK-NEXT:    local.get 7
670; CHECK-NEXT:    i32.trunc_sat_f32_u
671; CHECK-NEXT:    i32x4.replace_lane 3
672; CHECK-NEXT:    local.get 8
673; CHECK-NEXT:    i32x4.min_u
674; CHECK-NEXT:    i16x8.narrow_i32x4_u
675; CHECK-NEXT:    # fallthrough-return
676entry:
677  %conv = fptoui <8 x half> %x to <8 x i32>
678  %0 = icmp ult <8 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
679  %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
680  %conv6 = trunc <8 x i32> %spec.store.select to <8 x i16>
681  ret <8 x i16> %conv6
682}
683
684define <8 x i16> @ustest_f16i16(<8 x half> %x) {
685; CHECK-LABEL: ustest_f16i16:
686; CHECK:         .functype ustest_f16i16 (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)
687; CHECK-NEXT:    .local v128, v128
688; CHECK-NEXT:  # %bb.0: # %entry
689; CHECK-NEXT:    local.get 5
690; CHECK-NEXT:    call __truncsfhf2
691; CHECK-NEXT:    call __extendhfsf2
692; CHECK-NEXT:    local.set 5
693; CHECK-NEXT:    local.get 4
694; CHECK-NEXT:    call __truncsfhf2
695; CHECK-NEXT:    call __extendhfsf2
696; CHECK-NEXT:    local.set 4
697; CHECK-NEXT:    local.get 6
698; CHECK-NEXT:    call __truncsfhf2
699; CHECK-NEXT:    call __extendhfsf2
700; CHECK-NEXT:    local.set 6
701; CHECK-NEXT:    local.get 7
702; CHECK-NEXT:    call __truncsfhf2
703; CHECK-NEXT:    call __extendhfsf2
704; CHECK-NEXT:    local.set 7
705; CHECK-NEXT:    local.get 1
706; CHECK-NEXT:    call __truncsfhf2
707; CHECK-NEXT:    call __extendhfsf2
708; CHECK-NEXT:    local.set 1
709; CHECK-NEXT:    local.get 0
710; CHECK-NEXT:    call __truncsfhf2
711; CHECK-NEXT:    call __extendhfsf2
712; CHECK-NEXT:    i32.trunc_sat_f32_s
713; CHECK-NEXT:    i32x4.splat
714; CHECK-NEXT:    local.get 1
715; CHECK-NEXT:    i32.trunc_sat_f32_s
716; CHECK-NEXT:    i32x4.replace_lane 1
717; CHECK-NEXT:    local.get 2
718; CHECK-NEXT:    call __truncsfhf2
719; CHECK-NEXT:    call __extendhfsf2
720; CHECK-NEXT:    i32.trunc_sat_f32_s
721; CHECK-NEXT:    i32x4.replace_lane 2
722; CHECK-NEXT:    local.get 3
723; CHECK-NEXT:    call __truncsfhf2
724; CHECK-NEXT:    call __extendhfsf2
725; CHECK-NEXT:    i32.trunc_sat_f32_s
726; CHECK-NEXT:    i32x4.replace_lane 3
727; CHECK-NEXT:    v128.const 65535, 65535, 65535, 65535
728; CHECK-NEXT:    local.tee 8
729; CHECK-NEXT:    i32x4.min_s
730; CHECK-NEXT:    v128.const 0, 0, 0, 0
731; CHECK-NEXT:    local.tee 9
732; CHECK-NEXT:    i32x4.max_s
733; CHECK-NEXT:    local.get 4
734; CHECK-NEXT:    i32.trunc_sat_f32_s
735; CHECK-NEXT:    i32x4.splat
736; CHECK-NEXT:    local.get 5
737; CHECK-NEXT:    i32.trunc_sat_f32_s
738; CHECK-NEXT:    i32x4.replace_lane 1
739; CHECK-NEXT:    local.get 6
740; CHECK-NEXT:    i32.trunc_sat_f32_s
741; CHECK-NEXT:    i32x4.replace_lane 2
742; CHECK-NEXT:    local.get 7
743; CHECK-NEXT:    i32.trunc_sat_f32_s
744; CHECK-NEXT:    i32x4.replace_lane 3
745; CHECK-NEXT:    local.get 8
746; CHECK-NEXT:    i32x4.min_s
747; CHECK-NEXT:    local.get 9
748; CHECK-NEXT:    i32x4.max_s
749; CHECK-NEXT:    i16x8.narrow_i32x4_u
750; CHECK-NEXT:    # fallthrough-return
751entry:
752  %conv = fptosi <8 x half> %x to <8 x i32>
753  %0 = icmp slt <8 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
754  %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
755  %1 = icmp sgt <8 x i32> %spec.store.select, zeroinitializer
756  %spec.store.select7 = select <8 x i1> %1, <8 x i32> %spec.store.select, <8 x i32> zeroinitializer
757  %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
758  ret <8 x i16> %conv6
759}
760
761; i64 saturate
762
763define <2 x i64> @stest_f64i64(<2 x double> %x) {
764; CHECK-LABEL: stest_f64i64:
765; CHECK:         .functype stest_f64i64 (v128) -> (v128)
766; CHECK-NEXT:    .local i32, i64, i64, i64, i64
767; CHECK-NEXT:  # %bb.0: # %entry
768; CHECK-NEXT:    global.get __stack_pointer
769; CHECK-NEXT:    i32.const 32
770; CHECK-NEXT:    i32.sub
771; CHECK-NEXT:    local.tee 1
772; CHECK-NEXT:    global.set __stack_pointer
773; CHECK-NEXT:    local.get 1
774; CHECK-NEXT:    i32.const 16
775; CHECK-NEXT:    i32.add
776; CHECK-NEXT:    local.get 0
777; CHECK-NEXT:    f64x2.extract_lane 1
778; CHECK-NEXT:    call __fixdfti
779; CHECK-NEXT:    local.get 1
780; CHECK-NEXT:    local.get 0
781; CHECK-NEXT:    f64x2.extract_lane 0
782; CHECK-NEXT:    call __fixdfti
783; CHECK-NEXT:    local.get 1
784; CHECK-NEXT:    i32.const 16
785; CHECK-NEXT:    i32.add
786; CHECK-NEXT:    i32.const 8
787; CHECK-NEXT:    i32.add
788; CHECK-NEXT:    i64.load 0
789; CHECK-NEXT:    local.set 2
790; CHECK-NEXT:    local.get 1
791; CHECK-NEXT:    i64.load 16
792; CHECK-NEXT:    local.set 3
793; CHECK-NEXT:    local.get 1
794; CHECK-NEXT:    i32.const 8
795; CHECK-NEXT:    i32.add
796; CHECK-NEXT:    i64.load 0
797; CHECK-NEXT:    local.set 4
798; CHECK-NEXT:    local.get 1
799; CHECK-NEXT:    i64.load 0
800; CHECK-NEXT:    local.set 5
801; CHECK-NEXT:    local.get 1
802; CHECK-NEXT:    i32.const 32
803; CHECK-NEXT:    i32.add
804; CHECK-NEXT:    global.set __stack_pointer
805; CHECK-NEXT:    local.get 5
806; CHECK-NEXT:    i64.const 9223372036854775807
807; CHECK-NEXT:    local.get 5
808; CHECK-NEXT:    i64.const 9223372036854775807
809; CHECK-NEXT:    i64.lt_u
810; CHECK-NEXT:    local.get 4
811; CHECK-NEXT:    i64.const 0
812; CHECK-NEXT:    i64.lt_s
813; CHECK-NEXT:    local.get 4
814; CHECK-NEXT:    i64.eqz
815; CHECK-NEXT:    i32.select
816; CHECK-NEXT:    local.tee 1
817; CHECK-NEXT:    i64.select
818; CHECK-NEXT:    local.tee 5
819; CHECK-NEXT:    i64.const -9223372036854775808
820; CHECK-NEXT:    local.get 5
821; CHECK-NEXT:    i64.const -9223372036854775808
822; CHECK-NEXT:    i64.gt_u
823; CHECK-NEXT:    local.get 4
824; CHECK-NEXT:    i64.const 0
825; CHECK-NEXT:    local.get 1
826; CHECK-NEXT:    i64.select
827; CHECK-NEXT:    local.tee 4
828; CHECK-NEXT:    i64.const -1
829; CHECK-NEXT:    i64.gt_s
830; CHECK-NEXT:    local.get 4
831; CHECK-NEXT:    i64.const -1
832; CHECK-NEXT:    i64.eq
833; CHECK-NEXT:    i32.select
834; CHECK-NEXT:    i64.select
835; CHECK-NEXT:    i64x2.splat
836; CHECK-NEXT:    local.get 3
837; CHECK-NEXT:    i64.const 9223372036854775807
838; CHECK-NEXT:    local.get 3
839; CHECK-NEXT:    i64.const 9223372036854775807
840; CHECK-NEXT:    i64.lt_u
841; CHECK-NEXT:    local.get 2
842; CHECK-NEXT:    i64.const 0
843; CHECK-NEXT:    i64.lt_s
844; CHECK-NEXT:    local.get 2
845; CHECK-NEXT:    i64.eqz
846; CHECK-NEXT:    i32.select
847; CHECK-NEXT:    local.tee 1
848; CHECK-NEXT:    i64.select
849; CHECK-NEXT:    local.tee 4
850; CHECK-NEXT:    i64.const -9223372036854775808
851; CHECK-NEXT:    local.get 4
852; CHECK-NEXT:    i64.const -9223372036854775808
853; CHECK-NEXT:    i64.gt_u
854; CHECK-NEXT:    local.get 2
855; CHECK-NEXT:    i64.const 0
856; CHECK-NEXT:    local.get 1
857; CHECK-NEXT:    i64.select
858; CHECK-NEXT:    local.tee 2
859; CHECK-NEXT:    i64.const -1
860; CHECK-NEXT:    i64.gt_s
861; CHECK-NEXT:    local.get 2
862; CHECK-NEXT:    i64.const -1
863; CHECK-NEXT:    i64.eq
864; CHECK-NEXT:    i32.select
865; CHECK-NEXT:    i64.select
866; CHECK-NEXT:    i64x2.replace_lane 1
867; CHECK-NEXT:    # fallthrough-return
868entry:
869  %conv = fptosi <2 x double> %x to <2 x i128>
870  %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>
871  %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>
872  %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>
873  %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>
874  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
875  ret <2 x i64> %conv6
876}
877
878define <2 x i64> @utest_f64i64(<2 x double> %x) {
879; CHECK-LABEL: utest_f64i64:
880; CHECK:         .functype utest_f64i64 (v128) -> (v128)
881; CHECK-NEXT:    .local i32, i64, i64, i64, i64
882; CHECK-NEXT:  # %bb.0: # %entry
883; CHECK-NEXT:    global.get __stack_pointer
884; CHECK-NEXT:    i32.const 32
885; CHECK-NEXT:    i32.sub
886; CHECK-NEXT:    local.tee 1
887; CHECK-NEXT:    global.set __stack_pointer
888; CHECK-NEXT:    local.get 1
889; CHECK-NEXT:    i32.const 16
890; CHECK-NEXT:    i32.add
891; CHECK-NEXT:    local.get 0
892; CHECK-NEXT:    f64x2.extract_lane 1
893; CHECK-NEXT:    call __fixunsdfti
894; CHECK-NEXT:    local.get 1
895; CHECK-NEXT:    local.get 0
896; CHECK-NEXT:    f64x2.extract_lane 0
897; CHECK-NEXT:    call __fixunsdfti
898; CHECK-NEXT:    local.get 1
899; CHECK-NEXT:    i32.const 16
900; CHECK-NEXT:    i32.add
901; CHECK-NEXT:    i32.const 8
902; CHECK-NEXT:    i32.add
903; CHECK-NEXT:    i64.load 0
904; CHECK-NEXT:    local.set 2
905; CHECK-NEXT:    local.get 1
906; CHECK-NEXT:    i64.load 16
907; CHECK-NEXT:    local.set 3
908; CHECK-NEXT:    local.get 1
909; CHECK-NEXT:    i32.const 8
910; CHECK-NEXT:    i32.add
911; CHECK-NEXT:    i64.load 0
912; CHECK-NEXT:    local.set 4
913; CHECK-NEXT:    local.get 1
914; CHECK-NEXT:    i64.load 0
915; CHECK-NEXT:    local.set 5
916; CHECK-NEXT:    local.get 1
917; CHECK-NEXT:    i32.const 32
918; CHECK-NEXT:    i32.add
919; CHECK-NEXT:    global.set __stack_pointer
920; CHECK-NEXT:    local.get 5
921; CHECK-NEXT:    i64.const 0
922; CHECK-NEXT:    local.get 4
923; CHECK-NEXT:    i64.eqz
924; CHECK-NEXT:    i64.select
925; CHECK-NEXT:    i64x2.splat
926; CHECK-NEXT:    local.get 3
927; CHECK-NEXT:    i64.const 0
928; CHECK-NEXT:    local.get 2
929; CHECK-NEXT:    i64.eqz
930; CHECK-NEXT:    i64.select
931; CHECK-NEXT:    i64x2.replace_lane 1
932; CHECK-NEXT:    # fallthrough-return
933entry:
934  %conv = fptoui <2 x double> %x to <2 x i128>
935  %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
936  %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
937  %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
938  ret <2 x i64> %conv6
939}
940
941define <2 x i64> @ustest_f64i64(<2 x double> %x) {
942; CHECK-LABEL: ustest_f64i64:
943; CHECK:         .functype ustest_f64i64 (v128) -> (v128)
944; CHECK-NEXT:    .local i32, i64, i64, i64, i64
945; CHECK-NEXT:  # %bb.0: # %entry
946; CHECK-NEXT:    global.get __stack_pointer
947; CHECK-NEXT:    i32.const 32
948; CHECK-NEXT:    i32.sub
949; CHECK-NEXT:    local.tee 1
950; CHECK-NEXT:    global.set __stack_pointer
951; CHECK-NEXT:    local.get 1
952; CHECK-NEXT:    i32.const 16
953; CHECK-NEXT:    i32.add
954; CHECK-NEXT:    local.get 0
955; CHECK-NEXT:    f64x2.extract_lane 1
956; CHECK-NEXT:    call __fixdfti
957; CHECK-NEXT:    local.get 1
958; CHECK-NEXT:    local.get 0
959; CHECK-NEXT:    f64x2.extract_lane 0
960; CHECK-NEXT:    call __fixdfti
961; CHECK-NEXT:    local.get 1
962; CHECK-NEXT:    i32.const 16
963; CHECK-NEXT:    i32.add
964; CHECK-NEXT:    i32.const 8
965; CHECK-NEXT:    i32.add
966; CHECK-NEXT:    i64.load 0
967; CHECK-NEXT:    local.set 2
968; CHECK-NEXT:    local.get 1
969; CHECK-NEXT:    i64.load 16
970; CHECK-NEXT:    local.set 3
971; CHECK-NEXT:    local.get 1
972; CHECK-NEXT:    i32.const 8
973; CHECK-NEXT:    i32.add
974; CHECK-NEXT:    i64.load 0
975; CHECK-NEXT:    local.set 4
976; CHECK-NEXT:    local.get 1
977; CHECK-NEXT:    i64.load 0
978; CHECK-NEXT:    local.set 5
979; CHECK-NEXT:    local.get 1
980; CHECK-NEXT:    i32.const 32
981; CHECK-NEXT:    i32.add
982; CHECK-NEXT:    global.set __stack_pointer
983; CHECK-NEXT:    local.get 5
984; CHECK-NEXT:    i64.const 0
985; CHECK-NEXT:    local.get 4
986; CHECK-NEXT:    i64.const 1
987; CHECK-NEXT:    i64.lt_s
988; CHECK-NEXT:    local.tee 1
989; CHECK-NEXT:    i64.select
990; CHECK-NEXT:    local.tee 5
991; CHECK-NEXT:    i64.const 0
992; CHECK-NEXT:    local.get 5
993; CHECK-NEXT:    i64.const 0
994; CHECK-NEXT:    i64.ne
995; CHECK-NEXT:    local.get 4
996; CHECK-NEXT:    i64.const 1
997; CHECK-NEXT:    local.get 1
998; CHECK-NEXT:    i64.select
999; CHECK-NEXT:    local.tee 4
1000; CHECK-NEXT:    i64.const 0
1001; CHECK-NEXT:    i64.gt_s
1002; CHECK-NEXT:    local.get 4
1003; CHECK-NEXT:    i64.eqz
1004; CHECK-NEXT:    i32.select
1005; CHECK-NEXT:    i64.select
1006; CHECK-NEXT:    i64x2.splat
1007; CHECK-NEXT:    local.get 3
1008; CHECK-NEXT:    i64.const 0
1009; CHECK-NEXT:    local.get 2
1010; CHECK-NEXT:    i64.const 1
1011; CHECK-NEXT:    i64.lt_s
1012; CHECK-NEXT:    local.tee 1
1013; CHECK-NEXT:    i64.select
1014; CHECK-NEXT:    local.tee 4
1015; CHECK-NEXT:    i64.const 0
1016; CHECK-NEXT:    local.get 4
1017; CHECK-NEXT:    i64.const 0
1018; CHECK-NEXT:    i64.ne
1019; CHECK-NEXT:    local.get 2
1020; CHECK-NEXT:    i64.const 1
1021; CHECK-NEXT:    local.get 1
1022; CHECK-NEXT:    i64.select
1023; CHECK-NEXT:    local.tee 2
1024; CHECK-NEXT:    i64.const 0
1025; CHECK-NEXT:    i64.gt_s
1026; CHECK-NEXT:    local.get 2
1027; CHECK-NEXT:    i64.eqz
1028; CHECK-NEXT:    i32.select
1029; CHECK-NEXT:    i64.select
1030; CHECK-NEXT:    i64x2.replace_lane 1
1031; CHECK-NEXT:    # fallthrough-return
1032entry:
1033  %conv = fptosi <2 x double> %x to <2 x i128>
1034  %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
1035  %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
1036  %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer
1037  %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer
1038  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1039  ret <2 x i64> %conv6
1040}
1041
1042define <2 x i64> @stest_f32i64(<2 x float> %x) {
1043; CHECK-LABEL: stest_f32i64:
1044; CHECK:         .functype stest_f32i64 (v128) -> (v128)
1045; CHECK-NEXT:    .local i32, i64, i64, i64, i64
1046; CHECK-NEXT:  # %bb.0: # %entry
1047; CHECK-NEXT:    global.get __stack_pointer
1048; CHECK-NEXT:    i32.const 32
1049; CHECK-NEXT:    i32.sub
1050; CHECK-NEXT:    local.tee 1
1051; CHECK-NEXT:    global.set __stack_pointer
1052; CHECK-NEXT:    local.get 1
1053; CHECK-NEXT:    i32.const 16
1054; CHECK-NEXT:    i32.add
1055; CHECK-NEXT:    local.get 0
1056; CHECK-NEXT:    f32x4.extract_lane 1
1057; CHECK-NEXT:    call __fixsfti
1058; CHECK-NEXT:    local.get 1
1059; CHECK-NEXT:    local.get 0
1060; CHECK-NEXT:    f32x4.extract_lane 0
1061; CHECK-NEXT:    call __fixsfti
1062; CHECK-NEXT:    local.get 1
1063; CHECK-NEXT:    i32.const 16
1064; CHECK-NEXT:    i32.add
1065; CHECK-NEXT:    i32.const 8
1066; CHECK-NEXT:    i32.add
1067; CHECK-NEXT:    i64.load 0
1068; CHECK-NEXT:    local.set 2
1069; CHECK-NEXT:    local.get 1
1070; CHECK-NEXT:    i64.load 16
1071; CHECK-NEXT:    local.set 3
1072; CHECK-NEXT:    local.get 1
1073; CHECK-NEXT:    i32.const 8
1074; CHECK-NEXT:    i32.add
1075; CHECK-NEXT:    i64.load 0
1076; CHECK-NEXT:    local.set 4
1077; CHECK-NEXT:    local.get 1
1078; CHECK-NEXT:    i64.load 0
1079; CHECK-NEXT:    local.set 5
1080; CHECK-NEXT:    local.get 1
1081; CHECK-NEXT:    i32.const 32
1082; CHECK-NEXT:    i32.add
1083; CHECK-NEXT:    global.set __stack_pointer
1084; CHECK-NEXT:    local.get 5
1085; CHECK-NEXT:    i64.const 9223372036854775807
1086; CHECK-NEXT:    local.get 5
1087; CHECK-NEXT:    i64.const 9223372036854775807
1088; CHECK-NEXT:    i64.lt_u
1089; CHECK-NEXT:    local.get 4
1090; CHECK-NEXT:    i64.const 0
1091; CHECK-NEXT:    i64.lt_s
1092; CHECK-NEXT:    local.get 4
1093; CHECK-NEXT:    i64.eqz
1094; CHECK-NEXT:    i32.select
1095; CHECK-NEXT:    local.tee 1
1096; CHECK-NEXT:    i64.select
1097; CHECK-NEXT:    local.tee 5
1098; CHECK-NEXT:    i64.const -9223372036854775808
1099; CHECK-NEXT:    local.get 5
1100; CHECK-NEXT:    i64.const -9223372036854775808
1101; CHECK-NEXT:    i64.gt_u
1102; CHECK-NEXT:    local.get 4
1103; CHECK-NEXT:    i64.const 0
1104; CHECK-NEXT:    local.get 1
1105; CHECK-NEXT:    i64.select
1106; CHECK-NEXT:    local.tee 4
1107; CHECK-NEXT:    i64.const -1
1108; CHECK-NEXT:    i64.gt_s
1109; CHECK-NEXT:    local.get 4
1110; CHECK-NEXT:    i64.const -1
1111; CHECK-NEXT:    i64.eq
1112; CHECK-NEXT:    i32.select
1113; CHECK-NEXT:    i64.select
1114; CHECK-NEXT:    i64x2.splat
1115; CHECK-NEXT:    local.get 3
1116; CHECK-NEXT:    i64.const 9223372036854775807
1117; CHECK-NEXT:    local.get 3
1118; CHECK-NEXT:    i64.const 9223372036854775807
1119; CHECK-NEXT:    i64.lt_u
1120; CHECK-NEXT:    local.get 2
1121; CHECK-NEXT:    i64.const 0
1122; CHECK-NEXT:    i64.lt_s
1123; CHECK-NEXT:    local.get 2
1124; CHECK-NEXT:    i64.eqz
1125; CHECK-NEXT:    i32.select
1126; CHECK-NEXT:    local.tee 1
1127; CHECK-NEXT:    i64.select
1128; CHECK-NEXT:    local.tee 4
1129; CHECK-NEXT:    i64.const -9223372036854775808
1130; CHECK-NEXT:    local.get 4
1131; CHECK-NEXT:    i64.const -9223372036854775808
1132; CHECK-NEXT:    i64.gt_u
1133; CHECK-NEXT:    local.get 2
1134; CHECK-NEXT:    i64.const 0
1135; CHECK-NEXT:    local.get 1
1136; CHECK-NEXT:    i64.select
1137; CHECK-NEXT:    local.tee 2
1138; CHECK-NEXT:    i64.const -1
1139; CHECK-NEXT:    i64.gt_s
1140; CHECK-NEXT:    local.get 2
1141; CHECK-NEXT:    i64.const -1
1142; CHECK-NEXT:    i64.eq
1143; CHECK-NEXT:    i32.select
1144; CHECK-NEXT:    i64.select
1145; CHECK-NEXT:    i64x2.replace_lane 1
1146; CHECK-NEXT:    # fallthrough-return
1147entry:
1148  %conv = fptosi <2 x float> %x to <2 x i128>
1149  %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>
1150  %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>
1151  %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>
1152  %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>
1153  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1154  ret <2 x i64> %conv6
1155}
1156
1157define <2 x i64> @utest_f32i64(<2 x float> %x) {
1158; CHECK-LABEL: utest_f32i64:
1159; CHECK:         .functype utest_f32i64 (v128) -> (v128)
1160; CHECK-NEXT:    .local i32, i64, i64, i64, i64
1161; CHECK-NEXT:  # %bb.0: # %entry
1162; CHECK-NEXT:    global.get __stack_pointer
1163; CHECK-NEXT:    i32.const 32
1164; CHECK-NEXT:    i32.sub
1165; CHECK-NEXT:    local.tee 1
1166; CHECK-NEXT:    global.set __stack_pointer
1167; CHECK-NEXT:    local.get 1
1168; CHECK-NEXT:    i32.const 16
1169; CHECK-NEXT:    i32.add
1170; CHECK-NEXT:    local.get 0
1171; CHECK-NEXT:    f32x4.extract_lane 1
1172; CHECK-NEXT:    call __fixunssfti
1173; CHECK-NEXT:    local.get 1
1174; CHECK-NEXT:    local.get 0
1175; CHECK-NEXT:    f32x4.extract_lane 0
1176; CHECK-NEXT:    call __fixunssfti
1177; CHECK-NEXT:    local.get 1
1178; CHECK-NEXT:    i32.const 16
1179; CHECK-NEXT:    i32.add
1180; CHECK-NEXT:    i32.const 8
1181; CHECK-NEXT:    i32.add
1182; CHECK-NEXT:    i64.load 0
1183; CHECK-NEXT:    local.set 2
1184; CHECK-NEXT:    local.get 1
1185; CHECK-NEXT:    i64.load 16
1186; CHECK-NEXT:    local.set 3
1187; CHECK-NEXT:    local.get 1
1188; CHECK-NEXT:    i32.const 8
1189; CHECK-NEXT:    i32.add
1190; CHECK-NEXT:    i64.load 0
1191; CHECK-NEXT:    local.set 4
1192; CHECK-NEXT:    local.get 1
1193; CHECK-NEXT:    i64.load 0
1194; CHECK-NEXT:    local.set 5
1195; CHECK-NEXT:    local.get 1
1196; CHECK-NEXT:    i32.const 32
1197; CHECK-NEXT:    i32.add
1198; CHECK-NEXT:    global.set __stack_pointer
1199; CHECK-NEXT:    local.get 5
1200; CHECK-NEXT:    i64.const 0
1201; CHECK-NEXT:    local.get 4
1202; CHECK-NEXT:    i64.eqz
1203; CHECK-NEXT:    i64.select
1204; CHECK-NEXT:    i64x2.splat
1205; CHECK-NEXT:    local.get 3
1206; CHECK-NEXT:    i64.const 0
1207; CHECK-NEXT:    local.get 2
1208; CHECK-NEXT:    i64.eqz
1209; CHECK-NEXT:    i64.select
1210; CHECK-NEXT:    i64x2.replace_lane 1
1211; CHECK-NEXT:    # fallthrough-return
1212entry:
1213  %conv = fptoui <2 x float> %x to <2 x i128>
1214  %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
1215  %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
1216  %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
1217  ret <2 x i64> %conv6
1218}
1219
1220define <2 x i64> @ustest_f32i64(<2 x float> %x) {
1221; CHECK-LABEL: ustest_f32i64:
1222; CHECK:         .functype ustest_f32i64 (v128) -> (v128)
1223; CHECK-NEXT:    .local i32, i64, i64, i64, i64
1224; CHECK-NEXT:  # %bb.0: # %entry
1225; CHECK-NEXT:    global.get __stack_pointer
1226; CHECK-NEXT:    i32.const 32
1227; CHECK-NEXT:    i32.sub
1228; CHECK-NEXT:    local.tee 1
1229; CHECK-NEXT:    global.set __stack_pointer
1230; CHECK-NEXT:    local.get 1
1231; CHECK-NEXT:    i32.const 16
1232; CHECK-NEXT:    i32.add
1233; CHECK-NEXT:    local.get 0
1234; CHECK-NEXT:    f32x4.extract_lane 1
1235; CHECK-NEXT:    call __fixsfti
1236; CHECK-NEXT:    local.get 1
1237; CHECK-NEXT:    local.get 0
1238; CHECK-NEXT:    f32x4.extract_lane 0
1239; CHECK-NEXT:    call __fixsfti
1240; CHECK-NEXT:    local.get 1
1241; CHECK-NEXT:    i32.const 16
1242; CHECK-NEXT:    i32.add
1243; CHECK-NEXT:    i32.const 8
1244; CHECK-NEXT:    i32.add
1245; CHECK-NEXT:    i64.load 0
1246; CHECK-NEXT:    local.set 2
1247; CHECK-NEXT:    local.get 1
1248; CHECK-NEXT:    i64.load 16
1249; CHECK-NEXT:    local.set 3
1250; CHECK-NEXT:    local.get 1
1251; CHECK-NEXT:    i32.const 8
1252; CHECK-NEXT:    i32.add
1253; CHECK-NEXT:    i64.load 0
1254; CHECK-NEXT:    local.set 4
1255; CHECK-NEXT:    local.get 1
1256; CHECK-NEXT:    i64.load 0
1257; CHECK-NEXT:    local.set 5
1258; CHECK-NEXT:    local.get 1
1259; CHECK-NEXT:    i32.const 32
1260; CHECK-NEXT:    i32.add
1261; CHECK-NEXT:    global.set __stack_pointer
1262; CHECK-NEXT:    local.get 5
1263; CHECK-NEXT:    i64.const 0
1264; CHECK-NEXT:    local.get 4
1265; CHECK-NEXT:    i64.const 1
1266; CHECK-NEXT:    i64.lt_s
1267; CHECK-NEXT:    local.tee 1
1268; CHECK-NEXT:    i64.select
1269; CHECK-NEXT:    local.tee 5
1270; CHECK-NEXT:    i64.const 0
1271; CHECK-NEXT:    local.get 5
1272; CHECK-NEXT:    i64.const 0
1273; CHECK-NEXT:    i64.ne
1274; CHECK-NEXT:    local.get 4
1275; CHECK-NEXT:    i64.const 1
1276; CHECK-NEXT:    local.get 1
1277; CHECK-NEXT:    i64.select
1278; CHECK-NEXT:    local.tee 4
1279; CHECK-NEXT:    i64.const 0
1280; CHECK-NEXT:    i64.gt_s
1281; CHECK-NEXT:    local.get 4
1282; CHECK-NEXT:    i64.eqz
1283; CHECK-NEXT:    i32.select
1284; CHECK-NEXT:    i64.select
1285; CHECK-NEXT:    i64x2.splat
1286; CHECK-NEXT:    local.get 3
1287; CHECK-NEXT:    i64.const 0
1288; CHECK-NEXT:    local.get 2
1289; CHECK-NEXT:    i64.const 1
1290; CHECK-NEXT:    i64.lt_s
1291; CHECK-NEXT:    local.tee 1
1292; CHECK-NEXT:    i64.select
1293; CHECK-NEXT:    local.tee 4
1294; CHECK-NEXT:    i64.const 0
1295; CHECK-NEXT:    local.get 4
1296; CHECK-NEXT:    i64.const 0
1297; CHECK-NEXT:    i64.ne
1298; CHECK-NEXT:    local.get 2
1299; CHECK-NEXT:    i64.const 1
1300; CHECK-NEXT:    local.get 1
1301; CHECK-NEXT:    i64.select
1302; CHECK-NEXT:    local.tee 2
1303; CHECK-NEXT:    i64.const 0
1304; CHECK-NEXT:    i64.gt_s
1305; CHECK-NEXT:    local.get 2
1306; CHECK-NEXT:    i64.eqz
1307; CHECK-NEXT:    i32.select
1308; CHECK-NEXT:    i64.select
1309; CHECK-NEXT:    i64x2.replace_lane 1
1310; CHECK-NEXT:    # fallthrough-return
1311entry:
1312  %conv = fptosi <2 x float> %x to <2 x i128>
1313  %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
1314  %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
1315  %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer
1316  %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer
1317  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1318  ret <2 x i64> %conv6
1319}
1320
1321define <2 x i64> @stest_f16i64(<2 x half> %x) {
1322; CHECK-LABEL: stest_f16i64:
1323; CHECK:         .functype stest_f16i64 (f32, f32) -> (v128)
1324; CHECK-NEXT:    .local i32, i64, i64, i64, i64
1325; CHECK-NEXT:  # %bb.0: # %entry
1326; CHECK-NEXT:    global.get __stack_pointer
1327; CHECK-NEXT:    i32.const 32
1328; CHECK-NEXT:    i32.sub
1329; CHECK-NEXT:    local.tee 2
1330; CHECK-NEXT:    global.set __stack_pointer
1331; CHECK-NEXT:    local.get 2
1332; CHECK-NEXT:    i32.const 16
1333; CHECK-NEXT:    i32.add
1334; CHECK-NEXT:    local.get 1
1335; CHECK-NEXT:    call __truncsfhf2
1336; CHECK-NEXT:    call __extendhfsf2
1337; CHECK-NEXT:    call __fixsfti
1338; CHECK-NEXT:    local.get 2
1339; CHECK-NEXT:    local.get 0
1340; CHECK-NEXT:    call __truncsfhf2
1341; CHECK-NEXT:    call __extendhfsf2
1342; CHECK-NEXT:    call __fixsfti
1343; CHECK-NEXT:    local.get 2
1344; CHECK-NEXT:    i32.const 16
1345; CHECK-NEXT:    i32.add
1346; CHECK-NEXT:    i32.const 8
1347; CHECK-NEXT:    i32.add
1348; CHECK-NEXT:    i64.load 0
1349; CHECK-NEXT:    local.set 3
1350; CHECK-NEXT:    local.get 2
1351; CHECK-NEXT:    i64.load 16
1352; CHECK-NEXT:    local.set 4
1353; CHECK-NEXT:    local.get 2
1354; CHECK-NEXT:    i32.const 8
1355; CHECK-NEXT:    i32.add
1356; CHECK-NEXT:    i64.load 0
1357; CHECK-NEXT:    local.set 5
1358; CHECK-NEXT:    local.get 2
1359; CHECK-NEXT:    i64.load 0
1360; CHECK-NEXT:    local.set 6
1361; CHECK-NEXT:    local.get 2
1362; CHECK-NEXT:    i32.const 32
1363; CHECK-NEXT:    i32.add
1364; CHECK-NEXT:    global.set __stack_pointer
1365; CHECK-NEXT:    local.get 6
1366; CHECK-NEXT:    i64.const 9223372036854775807
1367; CHECK-NEXT:    local.get 6
1368; CHECK-NEXT:    i64.const 9223372036854775807
1369; CHECK-NEXT:    i64.lt_u
1370; CHECK-NEXT:    local.get 5
1371; CHECK-NEXT:    i64.const 0
1372; CHECK-NEXT:    i64.lt_s
1373; CHECK-NEXT:    local.get 5
1374; CHECK-NEXT:    i64.eqz
1375; CHECK-NEXT:    i32.select
1376; CHECK-NEXT:    local.tee 2
1377; CHECK-NEXT:    i64.select
1378; CHECK-NEXT:    local.tee 6
1379; CHECK-NEXT:    i64.const -9223372036854775808
1380; CHECK-NEXT:    local.get 6
1381; CHECK-NEXT:    i64.const -9223372036854775808
1382; CHECK-NEXT:    i64.gt_u
1383; CHECK-NEXT:    local.get 5
1384; CHECK-NEXT:    i64.const 0
1385; CHECK-NEXT:    local.get 2
1386; CHECK-NEXT:    i64.select
1387; CHECK-NEXT:    local.tee 5
1388; CHECK-NEXT:    i64.const -1
1389; CHECK-NEXT:    i64.gt_s
1390; CHECK-NEXT:    local.get 5
1391; CHECK-NEXT:    i64.const -1
1392; CHECK-NEXT:    i64.eq
1393; CHECK-NEXT:    i32.select
1394; CHECK-NEXT:    i64.select
1395; CHECK-NEXT:    i64x2.splat
1396; CHECK-NEXT:    local.get 4
1397; CHECK-NEXT:    i64.const 9223372036854775807
1398; CHECK-NEXT:    local.get 4
1399; CHECK-NEXT:    i64.const 9223372036854775807
1400; CHECK-NEXT:    i64.lt_u
1401; CHECK-NEXT:    local.get 3
1402; CHECK-NEXT:    i64.const 0
1403; CHECK-NEXT:    i64.lt_s
1404; CHECK-NEXT:    local.get 3
1405; CHECK-NEXT:    i64.eqz
1406; CHECK-NEXT:    i32.select
1407; CHECK-NEXT:    local.tee 2
1408; CHECK-NEXT:    i64.select
1409; CHECK-NEXT:    local.tee 5
1410; CHECK-NEXT:    i64.const -9223372036854775808
1411; CHECK-NEXT:    local.get 5
1412; CHECK-NEXT:    i64.const -9223372036854775808
1413; CHECK-NEXT:    i64.gt_u
1414; CHECK-NEXT:    local.get 3
1415; CHECK-NEXT:    i64.const 0
1416; CHECK-NEXT:    local.get 2
1417; CHECK-NEXT:    i64.select
1418; CHECK-NEXT:    local.tee 3
1419; CHECK-NEXT:    i64.const -1
1420; CHECK-NEXT:    i64.gt_s
1421; CHECK-NEXT:    local.get 3
1422; CHECK-NEXT:    i64.const -1
1423; CHECK-NEXT:    i64.eq
1424; CHECK-NEXT:    i32.select
1425; CHECK-NEXT:    i64.select
1426; CHECK-NEXT:    i64x2.replace_lane 1
1427; CHECK-NEXT:    # fallthrough-return
1428entry:
1429  %conv = fptosi <2 x half> %x to <2 x i128>
1430  %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>
1431  %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>
1432  %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>
1433  %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>
1434  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1435  ret <2 x i64> %conv6
1436}
1437
1438define <2 x i64> @utesth_f16i64(<2 x half> %x) {
1439; CHECK-LABEL: utesth_f16i64:
1440; CHECK:         .functype utesth_f16i64 (f32, f32) -> (v128)
1441; CHECK-NEXT:    .local i32, i64, i64, i64, i64
1442; CHECK-NEXT:  # %bb.0: # %entry
1443; CHECK-NEXT:    global.get __stack_pointer
1444; CHECK-NEXT:    i32.const 32
1445; CHECK-NEXT:    i32.sub
1446; CHECK-NEXT:    local.tee 2
1447; CHECK-NEXT:    global.set __stack_pointer
1448; CHECK-NEXT:    local.get 2
1449; CHECK-NEXT:    i32.const 16
1450; CHECK-NEXT:    i32.add
1451; CHECK-NEXT:    local.get 1
1452; CHECK-NEXT:    call __truncsfhf2
1453; CHECK-NEXT:    call __extendhfsf2
1454; CHECK-NEXT:    call __fixunssfti
1455; CHECK-NEXT:    local.get 2
1456; CHECK-NEXT:    local.get 0
1457; CHECK-NEXT:    call __truncsfhf2
1458; CHECK-NEXT:    call __extendhfsf2
1459; CHECK-NEXT:    call __fixunssfti
1460; CHECK-NEXT:    local.get 2
1461; CHECK-NEXT:    i32.const 16
1462; CHECK-NEXT:    i32.add
1463; CHECK-NEXT:    i32.const 8
1464; CHECK-NEXT:    i32.add
1465; CHECK-NEXT:    i64.load 0
1466; CHECK-NEXT:    local.set 3
1467; CHECK-NEXT:    local.get 2
1468; CHECK-NEXT:    i64.load 16
1469; CHECK-NEXT:    local.set 4
1470; CHECK-NEXT:    local.get 2
1471; CHECK-NEXT:    i32.const 8
1472; CHECK-NEXT:    i32.add
1473; CHECK-NEXT:    i64.load 0
1474; CHECK-NEXT:    local.set 5
1475; CHECK-NEXT:    local.get 2
1476; CHECK-NEXT:    i64.load 0
1477; CHECK-NEXT:    local.set 6
1478; CHECK-NEXT:    local.get 2
1479; CHECK-NEXT:    i32.const 32
1480; CHECK-NEXT:    i32.add
1481; CHECK-NEXT:    global.set __stack_pointer
1482; CHECK-NEXT:    local.get 6
1483; CHECK-NEXT:    i64.const 0
1484; CHECK-NEXT:    local.get 5
1485; CHECK-NEXT:    i64.eqz
1486; CHECK-NEXT:    i64.select
1487; CHECK-NEXT:    i64x2.splat
1488; CHECK-NEXT:    local.get 4
1489; CHECK-NEXT:    i64.const 0
1490; CHECK-NEXT:    local.get 3
1491; CHECK-NEXT:    i64.eqz
1492; CHECK-NEXT:    i64.select
1493; CHECK-NEXT:    i64x2.replace_lane 1
1494; CHECK-NEXT:    # fallthrough-return
1495entry:
1496  %conv = fptoui <2 x half> %x to <2 x i128>
1497  %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
1498  %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
1499  %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
1500  ret <2 x i64> %conv6
1501}
1502
1503define <2 x i64> @ustest_f16i64(<2 x half> %x) {
1504; CHECK-LABEL: ustest_f16i64:
1505; CHECK:         .functype ustest_f16i64 (f32, f32) -> (v128)
1506; CHECK-NEXT:    .local i32, i64, i64, i64, i64
1507; CHECK-NEXT:  # %bb.0: # %entry
1508; CHECK-NEXT:    global.get __stack_pointer
1509; CHECK-NEXT:    i32.const 32
1510; CHECK-NEXT:    i32.sub
1511; CHECK-NEXT:    local.tee 2
1512; CHECK-NEXT:    global.set __stack_pointer
1513; CHECK-NEXT:    local.get 2
1514; CHECK-NEXT:    i32.const 16
1515; CHECK-NEXT:    i32.add
1516; CHECK-NEXT:    local.get 1
1517; CHECK-NEXT:    call __truncsfhf2
1518; CHECK-NEXT:    call __extendhfsf2
1519; CHECK-NEXT:    call __fixsfti
1520; CHECK-NEXT:    local.get 2
1521; CHECK-NEXT:    local.get 0
1522; CHECK-NEXT:    call __truncsfhf2
1523; CHECK-NEXT:    call __extendhfsf2
1524; CHECK-NEXT:    call __fixsfti
1525; CHECK-NEXT:    local.get 2
1526; CHECK-NEXT:    i32.const 16
1527; CHECK-NEXT:    i32.add
1528; CHECK-NEXT:    i32.const 8
1529; CHECK-NEXT:    i32.add
1530; CHECK-NEXT:    i64.load 0
1531; CHECK-NEXT:    local.set 3
1532; CHECK-NEXT:    local.get 2
1533; CHECK-NEXT:    i64.load 16
1534; CHECK-NEXT:    local.set 4
1535; CHECK-NEXT:    local.get 2
1536; CHECK-NEXT:    i32.const 8
1537; CHECK-NEXT:    i32.add
1538; CHECK-NEXT:    i64.load 0
1539; CHECK-NEXT:    local.set 5
1540; CHECK-NEXT:    local.get 2
1541; CHECK-NEXT:    i64.load 0
1542; CHECK-NEXT:    local.set 6
1543; CHECK-NEXT:    local.get 2
1544; CHECK-NEXT:    i32.const 32
1545; CHECK-NEXT:    i32.add
1546; CHECK-NEXT:    global.set __stack_pointer
1547; CHECK-NEXT:    local.get 6
1548; CHECK-NEXT:    i64.const 0
1549; CHECK-NEXT:    local.get 5
1550; CHECK-NEXT:    i64.const 1
1551; CHECK-NEXT:    i64.lt_s
1552; CHECK-NEXT:    local.tee 2
1553; CHECK-NEXT:    i64.select
1554; CHECK-NEXT:    local.tee 6
1555; CHECK-NEXT:    i64.const 0
1556; CHECK-NEXT:    local.get 6
1557; CHECK-NEXT:    i64.const 0
1558; CHECK-NEXT:    i64.ne
1559; CHECK-NEXT:    local.get 5
1560; CHECK-NEXT:    i64.const 1
1561; CHECK-NEXT:    local.get 2
1562; CHECK-NEXT:    i64.select
1563; CHECK-NEXT:    local.tee 5
1564; CHECK-NEXT:    i64.const 0
1565; CHECK-NEXT:    i64.gt_s
1566; CHECK-NEXT:    local.get 5
1567; CHECK-NEXT:    i64.eqz
1568; CHECK-NEXT:    i32.select
1569; CHECK-NEXT:    i64.select
1570; CHECK-NEXT:    i64x2.splat
1571; CHECK-NEXT:    local.get 4
1572; CHECK-NEXT:    i64.const 0
1573; CHECK-NEXT:    local.get 3
1574; CHECK-NEXT:    i64.const 1
1575; CHECK-NEXT:    i64.lt_s
1576; CHECK-NEXT:    local.tee 2
1577; CHECK-NEXT:    i64.select
1578; CHECK-NEXT:    local.tee 5
1579; CHECK-NEXT:    i64.const 0
1580; CHECK-NEXT:    local.get 5
1581; CHECK-NEXT:    i64.const 0
1582; CHECK-NEXT:    i64.ne
1583; CHECK-NEXT:    local.get 3
1584; CHECK-NEXT:    i64.const 1
1585; CHECK-NEXT:    local.get 2
1586; CHECK-NEXT:    i64.select
1587; CHECK-NEXT:    local.tee 3
1588; CHECK-NEXT:    i64.const 0
1589; CHECK-NEXT:    i64.gt_s
1590; CHECK-NEXT:    local.get 3
1591; CHECK-NEXT:    i64.eqz
1592; CHECK-NEXT:    i32.select
1593; CHECK-NEXT:    i64.select
1594; CHECK-NEXT:    i64x2.replace_lane 1
1595; CHECK-NEXT:    # fallthrough-return
1596entry:
1597  %conv = fptosi <2 x half> %x to <2 x i128>
1598  %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
1599  %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
1600  %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer
1601  %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer
1602  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1603  ret <2 x i64> %conv6
1604}
1605
1606
1607
1608; i32 saturate
1609
1610define <2 x i32> @stest_f64i32_mm(<2 x double> %x) {
1611; CHECK-LABEL: stest_f64i32_mm:
1612; CHECK:         .functype stest_f64i32_mm (v128) -> (v128)
1613; CHECK-NEXT:    .local v128
1614; CHECK-NEXT:  # %bb.0: # %entry
1615; CHECK-NEXT:    local.get 0
1616; CHECK-NEXT:    f64x2.extract_lane 0
1617; CHECK-NEXT:    i64.trunc_sat_f64_s
1618; CHECK-NEXT:    i64x2.splat
1619; CHECK-NEXT:    local.get 0
1620; CHECK-NEXT:    f64x2.extract_lane 1
1621; CHECK-NEXT:    i64.trunc_sat_f64_s
1622; CHECK-NEXT:    i64x2.replace_lane 1
1623; CHECK-NEXT:    local.tee 0
1624; CHECK-NEXT:    v128.const 2147483647, 2147483647
1625; CHECK-NEXT:    local.tee 1
1626; CHECK-NEXT:    local.get 0
1627; CHECK-NEXT:    local.get 1
1628; CHECK-NEXT:    i64x2.lt_s
1629; CHECK-NEXT:    v128.bitselect
1630; CHECK-NEXT:    local.tee 0
1631; CHECK-NEXT:    v128.const -2147483648, -2147483648
1632; CHECK-NEXT:    local.tee 1
1633; CHECK-NEXT:    local.get 0
1634; CHECK-NEXT:    local.get 1
1635; CHECK-NEXT:    i64x2.gt_s
1636; CHECK-NEXT:    v128.bitselect
1637; CHECK-NEXT:    local.get 0
1638; CHECK-NEXT:    i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0
1639; CHECK-NEXT:    # fallthrough-return
1640entry:
1641  %conv = fptosi <2 x double> %x to <2 x i64>
1642  %spec.store.select = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %conv, <2 x i64> <i64 2147483647, i64 2147483647>)
1643  %spec.store.select7 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %spec.store.select, <2 x i64> <i64 -2147483648, i64 -2147483648>)
1644  %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
1645  ret <2 x i32> %conv6
1646}
1647
1648define <2 x i32> @utest_f64i32_mm(<2 x double> %x) {
1649; CHECK-LABEL: utest_f64i32_mm:
1650; CHECK:         .functype utest_f64i32_mm (v128) -> (v128)
1651; CHECK-NEXT:    .local i64, i64
1652; CHECK-NEXT:  # %bb.0: # %entry
1653; CHECK-NEXT:    local.get 0
1654; CHECK-NEXT:    f64x2.extract_lane 0
1655; CHECK-NEXT:    i64.trunc_sat_f64_u
1656; CHECK-NEXT:    local.tee 1
1657; CHECK-NEXT:    i64x2.splat
1658; CHECK-NEXT:    local.get 0
1659; CHECK-NEXT:    f64x2.extract_lane 1
1660; CHECK-NEXT:    i64.trunc_sat_f64_u
1661; CHECK-NEXT:    local.tee 2
1662; CHECK-NEXT:    i64x2.replace_lane 1
1663; CHECK-NEXT:    v128.const 4294967295, 4294967295
1664; CHECK-NEXT:    i64.const -1
1665; CHECK-NEXT:    i64.const 0
1666; CHECK-NEXT:    local.get 1
1667; CHECK-NEXT:    i64.const 4294967295
1668; CHECK-NEXT:    i64.lt_u
1669; CHECK-NEXT:    i64.select
1670; CHECK-NEXT:    i64x2.splat
1671; CHECK-NEXT:    i64.const -1
1672; CHECK-NEXT:    i64.const 0
1673; CHECK-NEXT:    local.get 2
1674; CHECK-NEXT:    i64.const 4294967295
1675; CHECK-NEXT:    i64.lt_u
1676; CHECK-NEXT:    i64.select
1677; CHECK-NEXT:    i64x2.replace_lane 1
1678; CHECK-NEXT:    v128.bitselect
1679; CHECK-NEXT:    local.get 0
1680; CHECK-NEXT:    i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0
1681; CHECK-NEXT:    # fallthrough-return
1682entry:
1683  %conv = fptoui <2 x double> %x to <2 x i64>
1684  %spec.store.select = call <2 x i64> @llvm.umin.v2i64(<2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>)
1685  %conv6 = trunc <2 x i64> %spec.store.select to <2 x i32>
1686  ret <2 x i32> %conv6
1687}
1688
1689define <2 x i32> @ustest_f64i32_mm(<2 x double> %x) {
1690; CHECK-LABEL: ustest_f64i32_mm:
1691; CHECK:         .functype ustest_f64i32_mm (v128) -> (v128)
1692; CHECK-NEXT:    .local v128
1693; CHECK-NEXT:  # %bb.0: # %entry
1694; CHECK-NEXT:    local.get 0
1695; CHECK-NEXT:    f64x2.extract_lane 0
1696; CHECK-NEXT:    i64.trunc_sat_f64_s
1697; CHECK-NEXT:    i64x2.splat
1698; CHECK-NEXT:    local.get 0
1699; CHECK-NEXT:    f64x2.extract_lane 1
1700; CHECK-NEXT:    i64.trunc_sat_f64_s
1701; CHECK-NEXT:    i64x2.replace_lane 1
1702; CHECK-NEXT:    local.tee 0
1703; CHECK-NEXT:    v128.const 4294967295, 4294967295
1704; CHECK-NEXT:    local.tee 1
1705; CHECK-NEXT:    local.get 0
1706; CHECK-NEXT:    local.get 1
1707; CHECK-NEXT:    i64x2.lt_s
1708; CHECK-NEXT:    v128.bitselect
1709; CHECK-NEXT:    local.tee 0
1710; CHECK-NEXT:    v128.const 0, 0
1711; CHECK-NEXT:    local.tee 1
1712; CHECK-NEXT:    local.get 0
1713; CHECK-NEXT:    local.get 1
1714; CHECK-NEXT:    i64x2.gt_s
1715; CHECK-NEXT:    v128.bitselect
1716; CHECK-NEXT:    local.get 0
1717; CHECK-NEXT:    i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0
1718; CHECK-NEXT:    # fallthrough-return
1719entry:
1720  %conv = fptosi <2 x double> %x to <2 x i64>
1721  %spec.store.select = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>)
1722  %spec.store.select7 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %spec.store.select, <2 x i64> zeroinitializer)
1723  %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
1724  ret <2 x i32> %conv6
1725}
1726
1727define <4 x i32> @stest_f32i32_mm(<4 x float> %x) {
1728; CHECK-LABEL: stest_f32i32_mm:
1729; CHECK:         .functype stest_f32i32_mm (v128) -> (v128)
1730; CHECK-NEXT:  # %bb.0: # %entry
1731; CHECK-NEXT:    local.get 0
1732; CHECK-NEXT:    i32x4.trunc_sat_f32x4_s
1733; CHECK-NEXT:    # fallthrough-return
1734entry:
1735  %conv = fptosi <4 x float> %x to <4 x i64>
1736  %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>)
1737  %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>)
1738  %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
1739  ret <4 x i32> %conv6
1740}
1741
1742define <4 x i32> @utest_f32i32_mm(<4 x float> %x) {
1743; CHECK-LABEL: utest_f32i32_mm:
1744; CHECK:         .functype utest_f32i32_mm (v128) -> (v128)
1745; CHECK-NEXT:    .local i64, i64, v128
1746; CHECK-NEXT:  # %bb.0: # %entry
1747; CHECK-NEXT:    local.get 0
1748; CHECK-NEXT:    f32x4.extract_lane 0
1749; CHECK-NEXT:    i64.trunc_sat_f32_u
1750; CHECK-NEXT:    local.tee 1
1751; CHECK-NEXT:    i64x2.splat
1752; CHECK-NEXT:    local.get 0
1753; CHECK-NEXT:    f32x4.extract_lane 1
1754; CHECK-NEXT:    i64.trunc_sat_f32_u
1755; CHECK-NEXT:    local.tee 2
1756; CHECK-NEXT:    i64x2.replace_lane 1
1757; CHECK-NEXT:    v128.const 4294967295, 4294967295
1758; CHECK-NEXT:    local.tee 3
1759; CHECK-NEXT:    i64.const -1
1760; CHECK-NEXT:    i64.const 0
1761; CHECK-NEXT:    local.get 1
1762; CHECK-NEXT:    i64.const 4294967295
1763; CHECK-NEXT:    i64.lt_u
1764; CHECK-NEXT:    i64.select
1765; CHECK-NEXT:    i64x2.splat
1766; CHECK-NEXT:    i64.const -1
1767; CHECK-NEXT:    i64.const 0
1768; CHECK-NEXT:    local.get 2
1769; CHECK-NEXT:    i64.const 4294967295
1770; CHECK-NEXT:    i64.lt_u
1771; CHECK-NEXT:    i64.select
1772; CHECK-NEXT:    i64x2.replace_lane 1
1773; CHECK-NEXT:    v128.bitselect
1774; CHECK-NEXT:    local.get 0
1775; CHECK-NEXT:    f32x4.extract_lane 2
1776; CHECK-NEXT:    i64.trunc_sat_f32_u
1777; CHECK-NEXT:    local.tee 1
1778; CHECK-NEXT:    i64x2.splat
1779; CHECK-NEXT:    local.get 0
1780; CHECK-NEXT:    f32x4.extract_lane 3
1781; CHECK-NEXT:    i64.trunc_sat_f32_u
1782; CHECK-NEXT:    local.tee 2
1783; CHECK-NEXT:    i64x2.replace_lane 1
1784; CHECK-NEXT:    local.get 3
1785; CHECK-NEXT:    i64.const -1
1786; CHECK-NEXT:    i64.const 0
1787; CHECK-NEXT:    local.get 1
1788; CHECK-NEXT:    i64.const 4294967295
1789; CHECK-NEXT:    i64.lt_u
1790; CHECK-NEXT:    i64.select
1791; CHECK-NEXT:    i64x2.splat
1792; CHECK-NEXT:    i64.const -1
1793; CHECK-NEXT:    i64.const 0
1794; CHECK-NEXT:    local.get 2
1795; CHECK-NEXT:    i64.const 4294967295
1796; CHECK-NEXT:    i64.lt_u
1797; CHECK-NEXT:    i64.select
1798; CHECK-NEXT:    i64x2.replace_lane 1
1799; CHECK-NEXT:    v128.bitselect
1800; CHECK-NEXT:    i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27
1801; CHECK-NEXT:    # fallthrough-return
1802entry:
1803  %conv = fptoui <4 x float> %x to <4 x i64>
1804  %spec.store.select = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
1805  %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
1806  ret <4 x i32> %conv6
1807}
1808
1809define <4 x i32> @ustest_f32i32_mm(<4 x float> %x) {
1810; CHECK-LABEL: ustest_f32i32_mm:
1811; CHECK:         .functype ustest_f32i32_mm (v128) -> (v128)
1812; CHECK-NEXT:  # %bb.0: # %entry
1813; CHECK-NEXT:    local.get 0
1814; CHECK-NEXT:    i32x4.trunc_sat_f32x4_u
1815; CHECK-NEXT:    # fallthrough-return
1816entry:
1817  %conv = fptosi <4 x float> %x to <4 x i64>
1818  %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
1819  %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> zeroinitializer)
1820  %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
1821  ret <4 x i32> %conv6
1822}
1823
1824define <4 x i32> @stest_f16i32_mm(<4 x half> %x) {
1825; CHECK-LABEL: stest_f16i32_mm:
1826; CHECK:         .functype stest_f16i32_mm (f32, f32, f32, f32) -> (v128)
1827; CHECK-NEXT:  # %bb.0: # %entry
1828; CHECK-NEXT:    local.get 1
1829; CHECK-NEXT:    call __truncsfhf2
1830; CHECK-NEXT:    call __extendhfsf2
1831; CHECK-NEXT:    local.set 1
1832; CHECK-NEXT:    local.get 0
1833; CHECK-NEXT:    call __truncsfhf2
1834; CHECK-NEXT:    call __extendhfsf2
1835; CHECK-NEXT:    i32.trunc_sat_f32_s
1836; CHECK-NEXT:    i32x4.splat
1837; CHECK-NEXT:    local.get 1
1838; CHECK-NEXT:    i32.trunc_sat_f32_s
1839; CHECK-NEXT:    i32x4.replace_lane 1
1840; CHECK-NEXT:    local.get 2
1841; CHECK-NEXT:    call __truncsfhf2
1842; CHECK-NEXT:    call __extendhfsf2
1843; CHECK-NEXT:    i32.trunc_sat_f32_s
1844; CHECK-NEXT:    i32x4.replace_lane 2
1845; CHECK-NEXT:    local.get 3
1846; CHECK-NEXT:    call __truncsfhf2
1847; CHECK-NEXT:    call __extendhfsf2
1848; CHECK-NEXT:    i32.trunc_sat_f32_s
1849; CHECK-NEXT:    i32x4.replace_lane 3
1850; CHECK-NEXT:    # fallthrough-return
1851entry:
1852  %conv = fptosi <4 x half> %x to <4 x i64>
1853  %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>)
1854  %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>)
1855  %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
1856  ret <4 x i32> %conv6
1857}
1858
1859define <4 x i32> @utesth_f16i32_mm(<4 x half> %x) {
1860; CHECK-LABEL: utesth_f16i32_mm:
1861; CHECK:         .functype utesth_f16i32_mm (f32, f32, f32, f32) -> (v128)
1862; CHECK-NEXT:    .local i64, i64, v128
1863; CHECK-NEXT:  # %bb.0: # %entry
1864; CHECK-NEXT:    local.get 3
1865; CHECK-NEXT:    call __truncsfhf2
1866; CHECK-NEXT:    call __extendhfsf2
1867; CHECK-NEXT:    local.set 3
1868; CHECK-NEXT:    local.get 2
1869; CHECK-NEXT:    call __truncsfhf2
1870; CHECK-NEXT:    call __extendhfsf2
1871; CHECK-NEXT:    local.set 2
1872; CHECK-NEXT:    local.get 1
1873; CHECK-NEXT:    call __truncsfhf2
1874; CHECK-NEXT:    call __extendhfsf2
1875; CHECK-NEXT:    local.set 1
1876; CHECK-NEXT:    local.get 0
1877; CHECK-NEXT:    call __truncsfhf2
1878; CHECK-NEXT:    call __extendhfsf2
1879; CHECK-NEXT:    i64.trunc_sat_f32_u
1880; CHECK-NEXT:    local.tee 4
1881; CHECK-NEXT:    i64x2.splat
1882; CHECK-NEXT:    local.get 1
1883; CHECK-NEXT:    i64.trunc_sat_f32_u
1884; CHECK-NEXT:    local.tee 5
1885; CHECK-NEXT:    i64x2.replace_lane 1
1886; CHECK-NEXT:    v128.const 4294967295, 4294967295
1887; CHECK-NEXT:    local.tee 6
1888; CHECK-NEXT:    i64.const -1
1889; CHECK-NEXT:    i64.const 0
1890; CHECK-NEXT:    local.get 4
1891; CHECK-NEXT:    i64.const 4294967295
1892; CHECK-NEXT:    i64.lt_u
1893; CHECK-NEXT:    i64.select
1894; CHECK-NEXT:    i64x2.splat
1895; CHECK-NEXT:    i64.const -1
1896; CHECK-NEXT:    i64.const 0
1897; CHECK-NEXT:    local.get 5
1898; CHECK-NEXT:    i64.const 4294967295
1899; CHECK-NEXT:    i64.lt_u
1900; CHECK-NEXT:    i64.select
1901; CHECK-NEXT:    i64x2.replace_lane 1
1902; CHECK-NEXT:    v128.bitselect
1903; CHECK-NEXT:    local.get 2
1904; CHECK-NEXT:    i64.trunc_sat_f32_u
1905; CHECK-NEXT:    local.tee 4
1906; CHECK-NEXT:    i64x2.splat
1907; CHECK-NEXT:    local.get 3
1908; CHECK-NEXT:    i64.trunc_sat_f32_u
1909; CHECK-NEXT:    local.tee 5
1910; CHECK-NEXT:    i64x2.replace_lane 1
1911; CHECK-NEXT:    local.get 6
1912; CHECK-NEXT:    i64.const -1
1913; CHECK-NEXT:    i64.const 0
1914; CHECK-NEXT:    local.get 4
1915; CHECK-NEXT:    i64.const 4294967295
1916; CHECK-NEXT:    i64.lt_u
1917; CHECK-NEXT:    i64.select
1918; CHECK-NEXT:    i64x2.splat
1919; CHECK-NEXT:    i64.const -1
1920; CHECK-NEXT:    i64.const 0
1921; CHECK-NEXT:    local.get 5
1922; CHECK-NEXT:    i64.const 4294967295
1923; CHECK-NEXT:    i64.lt_u
1924; CHECK-NEXT:    i64.select
1925; CHECK-NEXT:    i64x2.replace_lane 1
1926; CHECK-NEXT:    v128.bitselect
1927; CHECK-NEXT:    i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27
1928; CHECK-NEXT:    # fallthrough-return
1929entry:
1930  %conv = fptoui <4 x half> %x to <4 x i64>
1931  %spec.store.select = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
1932  %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
1933  ret <4 x i32> %conv6
1934}
1935
1936define <4 x i32> @ustest_f16i32_mm(<4 x half> %x) {
1937; CHECK-LABEL: ustest_f16i32_mm:
1938; CHECK:         .functype ustest_f16i32_mm (f32, f32, f32, f32) -> (v128)
1939; CHECK-NEXT:  # %bb.0: # %entry
1940; CHECK-NEXT:    local.get 1
1941; CHECK-NEXT:    call __truncsfhf2
1942; CHECK-NEXT:    call __extendhfsf2
1943; CHECK-NEXT:    local.set 1
1944; CHECK-NEXT:    local.get 0
1945; CHECK-NEXT:    call __truncsfhf2
1946; CHECK-NEXT:    call __extendhfsf2
1947; CHECK-NEXT:    i32.trunc_sat_f32_u
1948; CHECK-NEXT:    i32x4.splat
1949; CHECK-NEXT:    local.get 1
1950; CHECK-NEXT:    i32.trunc_sat_f32_u
1951; CHECK-NEXT:    i32x4.replace_lane 1
1952; CHECK-NEXT:    local.get 2
1953; CHECK-NEXT:    call __truncsfhf2
1954; CHECK-NEXT:    call __extendhfsf2
1955; CHECK-NEXT:    i32.trunc_sat_f32_u
1956; CHECK-NEXT:    i32x4.replace_lane 2
1957; CHECK-NEXT:    local.get 3
1958; CHECK-NEXT:    call __truncsfhf2
1959; CHECK-NEXT:    call __extendhfsf2
1960; CHECK-NEXT:    i32.trunc_sat_f32_u
1961; CHECK-NEXT:    i32x4.replace_lane 3
1962; CHECK-NEXT:    # fallthrough-return
1963entry:
1964  %conv = fptosi <4 x half> %x to <4 x i64>
1965  %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
1966  %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> zeroinitializer)
1967  %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
1968  ret <4 x i32> %conv6
1969}
1970
1971; i16 saturate
1972
1973define <2 x i16> @stest_f64i16_mm(<2 x double> %x) {
1974; CHECK-LABEL: stest_f64i16_mm:
1975; CHECK:         .functype stest_f64i16_mm (v128) -> (v128)
1976; CHECK-NEXT:  # %bb.0: # %entry
1977; CHECK-NEXT:    local.get 0
1978; CHECK-NEXT:    f64x2.extract_lane 0
1979; CHECK-NEXT:    i32.trunc_sat_f64_s
1980; CHECK-NEXT:    i32x4.splat
1981; CHECK-NEXT:    local.get 0
1982; CHECK-NEXT:    f64x2.extract_lane 1
1983; CHECK-NEXT:    i32.trunc_sat_f64_s
1984; CHECK-NEXT:    i32x4.replace_lane 1
1985; CHECK-NEXT:    v128.const 32767, 32767, 0, 0
1986; CHECK-NEXT:    i32x4.min_s
1987; CHECK-NEXT:    v128.const -32768, -32768, 0, 0
1988; CHECK-NEXT:    i32x4.max_s
1989; CHECK-NEXT:    local.get 0
1990; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1991; CHECK-NEXT:    # fallthrough-return
1992entry:
1993  %conv = fptosi <2 x double> %x to <2 x i32>
1994  %spec.store.select = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %conv, <2 x i32> <i32 32767, i32 32767>)
1995  %spec.store.select7 = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %spec.store.select, <2 x i32> <i32 -32768, i32 -32768>)
1996  %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
1997  ret <2 x i16> %conv6
1998}
1999
2000define <2 x i16> @utest_f64i16_mm(<2 x double> %x) {
2001; CHECK-LABEL: utest_f64i16_mm:
2002; CHECK:         .functype utest_f64i16_mm (v128) -> (v128)
2003; CHECK-NEXT:  # %bb.0: # %entry
2004; CHECK-NEXT:    local.get 0
2005; CHECK-NEXT:    f64x2.extract_lane 0
2006; CHECK-NEXT:    i32.trunc_sat_f64_u
2007; CHECK-NEXT:    i32x4.splat
2008; CHECK-NEXT:    local.get 0
2009; CHECK-NEXT:    f64x2.extract_lane 1
2010; CHECK-NEXT:    i32.trunc_sat_f64_u
2011; CHECK-NEXT:    i32x4.replace_lane 1
2012; CHECK-NEXT:    v128.const 65535, 65535, 0, 0
2013; CHECK-NEXT:    i32x4.min_u
2014; CHECK-NEXT:    local.get 0
2015; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
2016; CHECK-NEXT:    # fallthrough-return
2017entry:
2018  %conv = fptoui <2 x double> %x to <2 x i32>
2019  %spec.store.select = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>)
2020  %conv6 = trunc <2 x i32> %spec.store.select to <2 x i16>
2021  ret <2 x i16> %conv6
2022}
2023
2024define <2 x i16> @ustest_f64i16_mm(<2 x double> %x) {
2025; CHECK-LABEL: ustest_f64i16_mm:
2026; CHECK:         .functype ustest_f64i16_mm (v128) -> (v128)
2027; CHECK-NEXT:  # %bb.0: # %entry
2028; CHECK-NEXT:    local.get 0
2029; CHECK-NEXT:    f64x2.extract_lane 0
2030; CHECK-NEXT:    i32.trunc_sat_f64_s
2031; CHECK-NEXT:    i32x4.splat
2032; CHECK-NEXT:    local.get 0
2033; CHECK-NEXT:    f64x2.extract_lane 1
2034; CHECK-NEXT:    i32.trunc_sat_f64_s
2035; CHECK-NEXT:    i32x4.replace_lane 1
2036; CHECK-NEXT:    v128.const 65535, 65535, 0, 0
2037; CHECK-NEXT:    i32x4.min_s
2038; CHECK-NEXT:    v128.const 0, 0, 0, 0
2039; CHECK-NEXT:    i32x4.max_s
2040; CHECK-NEXT:    local.get 0
2041; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
2042; CHECK-NEXT:    # fallthrough-return
2043entry:
2044  %conv = fptosi <2 x double> %x to <2 x i32>
2045  %spec.store.select = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>)
2046  %spec.store.select7 = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %spec.store.select, <2 x i32> zeroinitializer)
2047  %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
2048  ret <2 x i16> %conv6
2049}
2050
2051define <4 x i16> @stest_f32i16_mm(<4 x float> %x) {
2052; CHECK-LABEL: stest_f32i16_mm:
2053; CHECK:         .functype stest_f32i16_mm (v128) -> (v128)
2054; CHECK-NEXT:  # %bb.0: # %entry
2055; CHECK-NEXT:    local.get 0
2056; CHECK-NEXT:    i32x4.trunc_sat_f32x4_s
2057; CHECK-NEXT:    v128.const 32767, 32767, 32767, 32767
2058; CHECK-NEXT:    i32x4.min_s
2059; CHECK-NEXT:    v128.const -32768, -32768, -32768, -32768
2060; CHECK-NEXT:    i32x4.max_s
2061; CHECK-NEXT:    local.get 0
2062; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0
2063; CHECK-NEXT:    # fallthrough-return
2064entry:
2065  %conv = fptosi <4 x float> %x to <4 x i32>
2066  %spec.store.select = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %conv, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>)
2067  %spec.store.select7 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %spec.store.select, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>)
2068  %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
2069  ret <4 x i16> %conv6
2070}
2071
2072define <4 x i16> @utest_f32i16_mm(<4 x float> %x) {
2073; CHECK-LABEL: utest_f32i16_mm:
2074; CHECK:         .functype utest_f32i16_mm (v128) -> (v128)
2075; CHECK-NEXT:  # %bb.0: # %entry
2076; CHECK-NEXT:    local.get 0
2077; CHECK-NEXT:    i32x4.trunc_sat_f32x4_u
2078; CHECK-NEXT:    v128.const 65535, 65535, 65535, 65535
2079; CHECK-NEXT:    i32x4.min_u
2080; CHECK-NEXT:    local.get 0
2081; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0
2082; CHECK-NEXT:    # fallthrough-return
2083entry:
2084  %conv = fptoui <4 x float> %x to <4 x i32>
2085  %spec.store.select = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>)
2086  %conv6 = trunc <4 x i32> %spec.store.select to <4 x i16>
2087  ret <4 x i16> %conv6
2088}
2089
2090define <4 x i16> @ustest_f32i16_mm(<4 x float> %x) {
2091; CHECK-LABEL: ustest_f32i16_mm:
2092; CHECK:         .functype ustest_f32i16_mm (v128) -> (v128)
2093; CHECK-NEXT:  # %bb.0: # %entry
2094; CHECK-NEXT:    local.get 0
2095; CHECK-NEXT:    i32x4.trunc_sat_f32x4_s
2096; CHECK-NEXT:    v128.const 65535, 65535, 65535, 65535
2097; CHECK-NEXT:    i32x4.min_s
2098; CHECK-NEXT:    v128.const 0, 0, 0, 0
2099; CHECK-NEXT:    i32x4.max_s
2100; CHECK-NEXT:    local.get 0
2101; CHECK-NEXT:    i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0
2102; CHECK-NEXT:    # fallthrough-return
2103entry:
2104  %conv = fptosi <4 x float> %x to <4 x i32>
2105  %spec.store.select = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>)
2106  %spec.store.select7 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %spec.store.select, <4 x i32> zeroinitializer)
2107  %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
2108  ret <4 x i16> %conv6
2109}
2110
2111define <8 x i16> @stest_f16i16_mm(<8 x half> %x) {
2112; CHECK-LABEL: stest_f16i16_mm:
2113; CHECK:         .functype stest_f16i16_mm (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)
2114; CHECK-NEXT:    .local v128, v128, v128
2115; CHECK-NEXT:  # %bb.0: # %entry
2116; CHECK-NEXT:    local.get 5
2117; CHECK-NEXT:    call __truncsfhf2
2118; CHECK-NEXT:    call __extendhfsf2
2119; CHECK-NEXT:    local.set 5
2120; CHECK-NEXT:    local.get 4
2121; CHECK-NEXT:    call __truncsfhf2
2122; CHECK-NEXT:    call __extendhfsf2
2123; CHECK-NEXT:    local.set 4
2124; CHECK-NEXT:    local.get 6
2125; CHECK-NEXT:    call __truncsfhf2
2126; CHECK-NEXT:    call __extendhfsf2
2127; CHECK-NEXT:    local.set 6
2128; CHECK-NEXT:    local.get 7
2129; CHECK-NEXT:    call __truncsfhf2
2130; CHECK-NEXT:    call __extendhfsf2
2131; CHECK-NEXT:    local.set 7
2132; CHECK-NEXT:    local.get 1
2133; CHECK-NEXT:    call __truncsfhf2
2134; CHECK-NEXT:    call __extendhfsf2
2135; CHECK-NEXT:    local.set 1
2136; CHECK-NEXT:    local.get 0
2137; CHECK-NEXT:    call __truncsfhf2
2138; CHECK-NEXT:    call __extendhfsf2
2139; CHECK-NEXT:    i32.trunc_sat_f32_s
2140; CHECK-NEXT:    i32x4.splat
2141; CHECK-NEXT:    local.get 1
2142; CHECK-NEXT:    i32.trunc_sat_f32_s
2143; CHECK-NEXT:    i32x4.replace_lane 1
2144; CHECK-NEXT:    local.get 2
2145; CHECK-NEXT:    call __truncsfhf2
2146; CHECK-NEXT:    call __extendhfsf2
2147; CHECK-NEXT:    i32.trunc_sat_f32_s
2148; CHECK-NEXT:    i32x4.replace_lane 2
2149; CHECK-NEXT:    local.get 3
2150; CHECK-NEXT:    call __truncsfhf2
2151; CHECK-NEXT:    call __extendhfsf2
2152; CHECK-NEXT:    i32.trunc_sat_f32_s
2153; CHECK-NEXT:    i32x4.replace_lane 3
2154; CHECK-NEXT:    v128.const 32767, 32767, 32767, 32767
2155; CHECK-NEXT:    local.tee 8
2156; CHECK-NEXT:    i32x4.min_s
2157; CHECK-NEXT:    v128.const -32768, -32768, -32768, -32768
2158; CHECK-NEXT:    local.tee 9
2159; CHECK-NEXT:    i32x4.max_s
2160; CHECK-NEXT:    v128.const 65535, 65535, 65535, 65535
2161; CHECK-NEXT:    local.tee 10
2162; CHECK-NEXT:    v128.and
2163; CHECK-NEXT:    local.get 4
2164; CHECK-NEXT:    i32.trunc_sat_f32_s
2165; CHECK-NEXT:    i32x4.splat
2166; CHECK-NEXT:    local.get 5
2167; CHECK-NEXT:    i32.trunc_sat_f32_s
2168; CHECK-NEXT:    i32x4.replace_lane 1
2169; CHECK-NEXT:    local.get 6
2170; CHECK-NEXT:    i32.trunc_sat_f32_s
2171; CHECK-NEXT:    i32x4.replace_lane 2
2172; CHECK-NEXT:    local.get 7
2173; CHECK-NEXT:    i32.trunc_sat_f32_s
2174; CHECK-NEXT:    i32x4.replace_lane 3
2175; CHECK-NEXT:    local.get 8
2176; CHECK-NEXT:    i32x4.min_s
2177; CHECK-NEXT:    local.get 9
2178; CHECK-NEXT:    i32x4.max_s
2179; CHECK-NEXT:    local.get 10
2180; CHECK-NEXT:    v128.and
2181; CHECK-NEXT:    i16x8.narrow_i32x4_u
2182; CHECK-NEXT:    # fallthrough-return
2183entry:
2184  %conv = fptosi <8 x half> %x to <8 x i32>
2185  %spec.store.select = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %conv, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>)
2186  %spec.store.select7 = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %spec.store.select, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>)
2187  %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
2188  ret <8 x i16> %conv6
2189}
2190
2191define <8 x i16> @utesth_f16i16_mm(<8 x half> %x) {
2192; CHECK-LABEL: utesth_f16i16_mm:
2193; CHECK:         .functype utesth_f16i16_mm (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)
2194; CHECK-NEXT:    .local v128
2195; CHECK-NEXT:  # %bb.0: # %entry
2196; CHECK-NEXT:    local.get 5
2197; CHECK-NEXT:    call __truncsfhf2
2198; CHECK-NEXT:    call __extendhfsf2
2199; CHECK-NEXT:    local.set 5
2200; CHECK-NEXT:    local.get 4
2201; CHECK-NEXT:    call __truncsfhf2
2202; CHECK-NEXT:    call __extendhfsf2
2203; CHECK-NEXT:    local.set 4
2204; CHECK-NEXT:    local.get 6
2205; CHECK-NEXT:    call __truncsfhf2
2206; CHECK-NEXT:    call __extendhfsf2
2207; CHECK-NEXT:    local.set 6
2208; CHECK-NEXT:    local.get 7
2209; CHECK-NEXT:    call __truncsfhf2
2210; CHECK-NEXT:    call __extendhfsf2
2211; CHECK-NEXT:    local.set 7
2212; CHECK-NEXT:    local.get 1
2213; CHECK-NEXT:    call __truncsfhf2
2214; CHECK-NEXT:    call __extendhfsf2
2215; CHECK-NEXT:    local.set 1
2216; CHECK-NEXT:    local.get 0
2217; CHECK-NEXT:    call __truncsfhf2
2218; CHECK-NEXT:    call __extendhfsf2
2219; CHECK-NEXT:    i32.trunc_sat_f32_u
2220; CHECK-NEXT:    i32x4.splat
2221; CHECK-NEXT:    local.get 1
2222; CHECK-NEXT:    i32.trunc_sat_f32_u
2223; CHECK-NEXT:    i32x4.replace_lane 1
2224; CHECK-NEXT:    local.get 2
2225; CHECK-NEXT:    call __truncsfhf2
2226; CHECK-NEXT:    call __extendhfsf2
2227; CHECK-NEXT:    i32.trunc_sat_f32_u
2228; CHECK-NEXT:    i32x4.replace_lane 2
2229; CHECK-NEXT:    local.get 3
2230; CHECK-NEXT:    call __truncsfhf2
2231; CHECK-NEXT:    call __extendhfsf2
2232; CHECK-NEXT:    i32.trunc_sat_f32_u
2233; CHECK-NEXT:    i32x4.replace_lane 3
2234; CHECK-NEXT:    v128.const 65535, 65535, 65535, 65535
2235; CHECK-NEXT:    local.tee 8
2236; CHECK-NEXT:    i32x4.min_u
2237; CHECK-NEXT:    local.get 4
2238; CHECK-NEXT:    i32.trunc_sat_f32_u
2239; CHECK-NEXT:    i32x4.splat
2240; CHECK-NEXT:    local.get 5
2241; CHECK-NEXT:    i32.trunc_sat_f32_u
2242; CHECK-NEXT:    i32x4.replace_lane 1
2243; CHECK-NEXT:    local.get 6
2244; CHECK-NEXT:    i32.trunc_sat_f32_u
2245; CHECK-NEXT:    i32x4.replace_lane 2
2246; CHECK-NEXT:    local.get 7
2247; CHECK-NEXT:    i32.trunc_sat_f32_u
2248; CHECK-NEXT:    i32x4.replace_lane 3
2249; CHECK-NEXT:    local.get 8
2250; CHECK-NEXT:    i32x4.min_u
2251; CHECK-NEXT:    i16x8.narrow_i32x4_u
2252; CHECK-NEXT:    # fallthrough-return
2253entry:
2254  %conv = fptoui <8 x half> %x to <8 x i32>
2255  %spec.store.select = call <8 x i32> @llvm.umin.v8i32(<8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>)
2256  %conv6 = trunc <8 x i32> %spec.store.select to <8 x i16>
2257  ret <8 x i16> %conv6
2258}
2259
2260define <8 x i16> @ustest_f16i16_mm(<8 x half> %x) {
2261; CHECK-LABEL: ustest_f16i16_mm:
2262; CHECK:         .functype ustest_f16i16_mm (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)
2263; CHECK-NEXT:    .local v128, v128
2264; CHECK-NEXT:  # %bb.0: # %entry
2265; CHECK-NEXT:    local.get 5
2266; CHECK-NEXT:    call __truncsfhf2
2267; CHECK-NEXT:    call __extendhfsf2
2268; CHECK-NEXT:    local.set 5
2269; CHECK-NEXT:    local.get 4
2270; CHECK-NEXT:    call __truncsfhf2
2271; CHECK-NEXT:    call __extendhfsf2
2272; CHECK-NEXT:    local.set 4
2273; CHECK-NEXT:    local.get 6
2274; CHECK-NEXT:    call __truncsfhf2
2275; CHECK-NEXT:    call __extendhfsf2
2276; CHECK-NEXT:    local.set 6
2277; CHECK-NEXT:    local.get 7
2278; CHECK-NEXT:    call __truncsfhf2
2279; CHECK-NEXT:    call __extendhfsf2
2280; CHECK-NEXT:    local.set 7
2281; CHECK-NEXT:    local.get 1
2282; CHECK-NEXT:    call __truncsfhf2
2283; CHECK-NEXT:    call __extendhfsf2
2284; CHECK-NEXT:    local.set 1
2285; CHECK-NEXT:    local.get 0
2286; CHECK-NEXT:    call __truncsfhf2
2287; CHECK-NEXT:    call __extendhfsf2
2288; CHECK-NEXT:    i32.trunc_sat_f32_s
2289; CHECK-NEXT:    i32x4.splat
2290; CHECK-NEXT:    local.get 1
2291; CHECK-NEXT:    i32.trunc_sat_f32_s
2292; CHECK-NEXT:    i32x4.replace_lane 1
2293; CHECK-NEXT:    local.get 2
2294; CHECK-NEXT:    call __truncsfhf2
2295; CHECK-NEXT:    call __extendhfsf2
2296; CHECK-NEXT:    i32.trunc_sat_f32_s
2297; CHECK-NEXT:    i32x4.replace_lane 2
2298; CHECK-NEXT:    local.get 3
2299; CHECK-NEXT:    call __truncsfhf2
2300; CHECK-NEXT:    call __extendhfsf2
2301; CHECK-NEXT:    i32.trunc_sat_f32_s
2302; CHECK-NEXT:    i32x4.replace_lane 3
2303; CHECK-NEXT:    v128.const 65535, 65535, 65535, 65535
2304; CHECK-NEXT:    local.tee 8
2305; CHECK-NEXT:    i32x4.min_s
2306; CHECK-NEXT:    v128.const 0, 0, 0, 0
2307; CHECK-NEXT:    local.tee 9
2308; CHECK-NEXT:    i32x4.max_s
2309; CHECK-NEXT:    local.get 4
2310; CHECK-NEXT:    i32.trunc_sat_f32_s
2311; CHECK-NEXT:    i32x4.splat
2312; CHECK-NEXT:    local.get 5
2313; CHECK-NEXT:    i32.trunc_sat_f32_s
2314; CHECK-NEXT:    i32x4.replace_lane 1
2315; CHECK-NEXT:    local.get 6
2316; CHECK-NEXT:    i32.trunc_sat_f32_s
2317; CHECK-NEXT:    i32x4.replace_lane 2
2318; CHECK-NEXT:    local.get 7
2319; CHECK-NEXT:    i32.trunc_sat_f32_s
2320; CHECK-NEXT:    i32x4.replace_lane 3
2321; CHECK-NEXT:    local.get 8
2322; CHECK-NEXT:    i32x4.min_s
2323; CHECK-NEXT:    local.get 9
2324; CHECK-NEXT:    i32x4.max_s
2325; CHECK-NEXT:    i16x8.narrow_i32x4_u
2326; CHECK-NEXT:    # fallthrough-return
2327entry:
2328  %conv = fptosi <8 x half> %x to <8 x i32>
2329  %spec.store.select = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>)
2330  %spec.store.select7 = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %spec.store.select, <8 x i32> zeroinitializer)
2331  %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
2332  ret <8 x i16> %conv6
2333}
2334
2335; i64 saturate
2336
2337define <2 x i64> @stest_f64i64_mm(<2 x double> %x) {
2338; CHECK-LABEL: stest_f64i64_mm:
2339; CHECK:         .functype stest_f64i64_mm (v128) -> (v128)
2340; CHECK-NEXT:    .local i32, i64, i64, i64, i64
2341; CHECK-NEXT:  # %bb.0: # %entry
2342; CHECK-NEXT:    global.get __stack_pointer
2343; CHECK-NEXT:    i32.const 32
2344; CHECK-NEXT:    i32.sub
2345; CHECK-NEXT:    local.tee 1
2346; CHECK-NEXT:    global.set __stack_pointer
2347; CHECK-NEXT:    local.get 1
2348; CHECK-NEXT:    i32.const 16
2349; CHECK-NEXT:    i32.add
2350; CHECK-NEXT:    local.get 0
2351; CHECK-NEXT:    f64x2.extract_lane 1
2352; CHECK-NEXT:    call __fixdfti
2353; CHECK-NEXT:    local.get 1
2354; CHECK-NEXT:    local.get 0
2355; CHECK-NEXT:    f64x2.extract_lane 0
2356; CHECK-NEXT:    call __fixdfti
2357; CHECK-NEXT:    local.get 1
2358; CHECK-NEXT:    i32.const 16
2359; CHECK-NEXT:    i32.add
2360; CHECK-NEXT:    i32.const 8
2361; CHECK-NEXT:    i32.add
2362; CHECK-NEXT:    i64.load 0
2363; CHECK-NEXT:    local.set 2
2364; CHECK-NEXT:    local.get 1
2365; CHECK-NEXT:    i64.load 16
2366; CHECK-NEXT:    local.set 3
2367; CHECK-NEXT:    local.get 1
2368; CHECK-NEXT:    i32.const 8
2369; CHECK-NEXT:    i32.add
2370; CHECK-NEXT:    i64.load 0
2371; CHECK-NEXT:    local.set 4
2372; CHECK-NEXT:    local.get 1
2373; CHECK-NEXT:    i64.load 0
2374; CHECK-NEXT:    local.set 5
2375; CHECK-NEXT:    local.get 1
2376; CHECK-NEXT:    i32.const 32
2377; CHECK-NEXT:    i32.add
2378; CHECK-NEXT:    global.set __stack_pointer
2379; CHECK-NEXT:    local.get 5
2380; CHECK-NEXT:    i64.const 9223372036854775807
2381; CHECK-NEXT:    local.get 5
2382; CHECK-NEXT:    i64.const 9223372036854775807
2383; CHECK-NEXT:    i64.lt_u
2384; CHECK-NEXT:    i64.select
2385; CHECK-NEXT:    local.get 5
2386; CHECK-NEXT:    i64.const 9223372036854775807
2387; CHECK-NEXT:    local.get 4
2388; CHECK-NEXT:    i64.const 0
2389; CHECK-NEXT:    i64.lt_s
2390; CHECK-NEXT:    i64.select
2391; CHECK-NEXT:    local.get 4
2392; CHECK-NEXT:    i64.eqz
2393; CHECK-NEXT:    i64.select
2394; CHECK-NEXT:    local.tee 5
2395; CHECK-NEXT:    i64.const -9223372036854775808
2396; CHECK-NEXT:    local.get 5
2397; CHECK-NEXT:    i64.const -9223372036854775808
2398; CHECK-NEXT:    i64.gt_u
2399; CHECK-NEXT:    i64.select
2400; CHECK-NEXT:    local.get 5
2401; CHECK-NEXT:    i64.const -9223372036854775808
2402; CHECK-NEXT:    local.get 4
2403; CHECK-NEXT:    local.get 4
2404; CHECK-NEXT:    i64.const 63
2405; CHECK-NEXT:    i64.shr_s
2406; CHECK-NEXT:    i64.and
2407; CHECK-NEXT:    local.tee 4
2408; CHECK-NEXT:    i64.const -1
2409; CHECK-NEXT:    i64.gt_s
2410; CHECK-NEXT:    i64.select
2411; CHECK-NEXT:    local.get 4
2412; CHECK-NEXT:    i64.const -1
2413; CHECK-NEXT:    i64.eq
2414; CHECK-NEXT:    i64.select
2415; CHECK-NEXT:    i64x2.splat
2416; CHECK-NEXT:    local.get 3
2417; CHECK-NEXT:    i64.const 9223372036854775807
2418; CHECK-NEXT:    local.get 3
2419; CHECK-NEXT:    i64.const 9223372036854775807
2420; CHECK-NEXT:    i64.lt_u
2421; CHECK-NEXT:    i64.select
2422; CHECK-NEXT:    local.get 3
2423; CHECK-NEXT:    i64.const 9223372036854775807
2424; CHECK-NEXT:    local.get 2
2425; CHECK-NEXT:    i64.const 0
2426; CHECK-NEXT:    i64.lt_s
2427; CHECK-NEXT:    i64.select
2428; CHECK-NEXT:    local.get 2
2429; CHECK-NEXT:    i64.eqz
2430; CHECK-NEXT:    i64.select
2431; CHECK-NEXT:    local.tee 4
2432; CHECK-NEXT:    i64.const -9223372036854775808
2433; CHECK-NEXT:    local.get 4
2434; CHECK-NEXT:    i64.const -9223372036854775808
2435; CHECK-NEXT:    i64.gt_u
2436; CHECK-NEXT:    i64.select
2437; CHECK-NEXT:    local.get 4
2438; CHECK-NEXT:    i64.const -9223372036854775808
2439; CHECK-NEXT:    local.get 2
2440; CHECK-NEXT:    local.get 2
2441; CHECK-NEXT:    i64.const 63
2442; CHECK-NEXT:    i64.shr_s
2443; CHECK-NEXT:    i64.and
2444; CHECK-NEXT:    local.tee 2
2445; CHECK-NEXT:    i64.const -1
2446; CHECK-NEXT:    i64.gt_s
2447; CHECK-NEXT:    i64.select
2448; CHECK-NEXT:    local.get 2
2449; CHECK-NEXT:    i64.const -1
2450; CHECK-NEXT:    i64.eq
2451; CHECK-NEXT:    i64.select
2452; CHECK-NEXT:    i64x2.replace_lane 1
2453; CHECK-NEXT:    # fallthrough-return
2454entry:
2455  %conv = fptosi <2 x double> %x to <2 x i128>
2456  %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)
2457  %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)
2458  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2459  ret <2 x i64> %conv6
2460}
2461
2462define <2 x i64> @utest_f64i64_mm(<2 x double> %x) {
2463; CHECK-LABEL: utest_f64i64_mm:
2464; CHECK:         .functype utest_f64i64_mm (v128) -> (v128)
2465; CHECK-NEXT:    .local i32, i64, i64, i64, i64
2466; CHECK-NEXT:  # %bb.0: # %entry
2467; CHECK-NEXT:    global.get __stack_pointer
2468; CHECK-NEXT:    i32.const 32
2469; CHECK-NEXT:    i32.sub
2470; CHECK-NEXT:    local.tee 1
2471; CHECK-NEXT:    global.set __stack_pointer
2472; CHECK-NEXT:    local.get 1
2473; CHECK-NEXT:    i32.const 16
2474; CHECK-NEXT:    i32.add
2475; CHECK-NEXT:    local.get 0
2476; CHECK-NEXT:    f64x2.extract_lane 1
2477; CHECK-NEXT:    call __fixunsdfti
2478; CHECK-NEXT:    local.get 1
2479; CHECK-NEXT:    local.get 0
2480; CHECK-NEXT:    f64x2.extract_lane 0
2481; CHECK-NEXT:    call __fixunsdfti
2482; CHECK-NEXT:    local.get 1
2483; CHECK-NEXT:    i32.const 16
2484; CHECK-NEXT:    i32.add
2485; CHECK-NEXT:    i32.const 8
2486; CHECK-NEXT:    i32.add
2487; CHECK-NEXT:    i64.load 0
2488; CHECK-NEXT:    local.set 2
2489; CHECK-NEXT:    local.get 1
2490; CHECK-NEXT:    i64.load 16
2491; CHECK-NEXT:    local.set 3
2492; CHECK-NEXT:    local.get 1
2493; CHECK-NEXT:    i32.const 8
2494; CHECK-NEXT:    i32.add
2495; CHECK-NEXT:    i64.load 0
2496; CHECK-NEXT:    local.set 4
2497; CHECK-NEXT:    local.get 1
2498; CHECK-NEXT:    i64.load 0
2499; CHECK-NEXT:    local.set 5
2500; CHECK-NEXT:    local.get 1
2501; CHECK-NEXT:    i32.const 32
2502; CHECK-NEXT:    i32.add
2503; CHECK-NEXT:    global.set __stack_pointer
2504; CHECK-NEXT:    i64.const 0
2505; CHECK-NEXT:    local.get 5
2506; CHECK-NEXT:    i64.const 0
2507; CHECK-NEXT:    local.get 4
2508; CHECK-NEXT:    i64.eqz
2509; CHECK-NEXT:    i64.select
2510; CHECK-NEXT:    local.get 4
2511; CHECK-NEXT:    i64.const 1
2512; CHECK-NEXT:    i64.eq
2513; CHECK-NEXT:    i64.select
2514; CHECK-NEXT:    i64x2.splat
2515; CHECK-NEXT:    i64.const 0
2516; CHECK-NEXT:    local.get 3
2517; CHECK-NEXT:    i64.const 0
2518; CHECK-NEXT:    local.get 2
2519; CHECK-NEXT:    i64.eqz
2520; CHECK-NEXT:    i64.select
2521; CHECK-NEXT:    local.get 2
2522; CHECK-NEXT:    i64.const 1
2523; CHECK-NEXT:    i64.eq
2524; CHECK-NEXT:    i64.select
2525; CHECK-NEXT:    i64x2.replace_lane 1
2526; CHECK-NEXT:    # fallthrough-return
2527entry:
2528  %conv = fptoui <2 x double> %x to <2 x i128>
2529  %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
2530  %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
2531  ret <2 x i64> %conv6
2532}
2533
2534define <2 x i64> @ustest_f64i64_mm(<2 x double> %x) {
2535; CHECK-LABEL: ustest_f64i64_mm:
2536; CHECK:         .functype ustest_f64i64_mm (v128) -> (v128)
2537; CHECK-NEXT:    .local i32, i64, i64, i64, i64
2538; CHECK-NEXT:  # %bb.0: # %entry
2539; CHECK-NEXT:    global.get __stack_pointer
2540; CHECK-NEXT:    i32.const 32
2541; CHECK-NEXT:    i32.sub
2542; CHECK-NEXT:    local.tee 1
2543; CHECK-NEXT:    global.set __stack_pointer
2544; CHECK-NEXT:    local.get 1
2545; CHECK-NEXT:    i32.const 16
2546; CHECK-NEXT:    i32.add
2547; CHECK-NEXT:    local.get 0
2548; CHECK-NEXT:    f64x2.extract_lane 1
2549; CHECK-NEXT:    call __fixdfti
2550; CHECK-NEXT:    local.get 1
2551; CHECK-NEXT:    local.get 0
2552; CHECK-NEXT:    f64x2.extract_lane 0
2553; CHECK-NEXT:    call __fixdfti
2554; CHECK-NEXT:    local.get 1
2555; CHECK-NEXT:    i32.const 16
2556; CHECK-NEXT:    i32.add
2557; CHECK-NEXT:    i32.const 8
2558; CHECK-NEXT:    i32.add
2559; CHECK-NEXT:    i64.load 0
2560; CHECK-NEXT:    local.set 2
2561; CHECK-NEXT:    local.get 1
2562; CHECK-NEXT:    i64.load 16
2563; CHECK-NEXT:    local.set 3
2564; CHECK-NEXT:    local.get 1
2565; CHECK-NEXT:    i32.const 8
2566; CHECK-NEXT:    i32.add
2567; CHECK-NEXT:    i64.load 0
2568; CHECK-NEXT:    local.set 4
2569; CHECK-NEXT:    local.get 1
2570; CHECK-NEXT:    i64.load 0
2571; CHECK-NEXT:    local.set 5
2572; CHECK-NEXT:    local.get 1
2573; CHECK-NEXT:    i32.const 32
2574; CHECK-NEXT:    i32.add
2575; CHECK-NEXT:    global.set __stack_pointer
2576; CHECK-NEXT:    i64.const 0
2577; CHECK-NEXT:    local.get 5
2578; CHECK-NEXT:    i64.const 0
2579; CHECK-NEXT:    local.get 4
2580; CHECK-NEXT:    i64.const 1
2581; CHECK-NEXT:    i64.lt_s
2582; CHECK-NEXT:    local.tee 1
2583; CHECK-NEXT:    i64.select
2584; CHECK-NEXT:    local.get 4
2585; CHECK-NEXT:    i64.const 1
2586; CHECK-NEXT:    i64.eq
2587; CHECK-NEXT:    i64.select
2588; CHECK-NEXT:    local.tee 5
2589; CHECK-NEXT:    local.get 5
2590; CHECK-NEXT:    i64.const 0
2591; CHECK-NEXT:    local.get 4
2592; CHECK-NEXT:    i64.const 1
2593; CHECK-NEXT:    local.get 1
2594; CHECK-NEXT:    i64.select
2595; CHECK-NEXT:    local.tee 4
2596; CHECK-NEXT:    i64.const 0
2597; CHECK-NEXT:    i64.gt_s
2598; CHECK-NEXT:    i64.select
2599; CHECK-NEXT:    local.get 4
2600; CHECK-NEXT:    i64.eqz
2601; CHECK-NEXT:    i64.select
2602; CHECK-NEXT:    i64x2.splat
2603; CHECK-NEXT:    i64.const 0
2604; CHECK-NEXT:    local.get 3
2605; CHECK-NEXT:    i64.const 0
2606; CHECK-NEXT:    local.get 2
2607; CHECK-NEXT:    i64.const 1
2608; CHECK-NEXT:    i64.lt_s
2609; CHECK-NEXT:    local.tee 1
2610; CHECK-NEXT:    i64.select
2611; CHECK-NEXT:    local.get 2
2612; CHECK-NEXT:    i64.const 1
2613; CHECK-NEXT:    i64.eq
2614; CHECK-NEXT:    i64.select
2615; CHECK-NEXT:    local.tee 4
2616; CHECK-NEXT:    local.get 4
2617; CHECK-NEXT:    i64.const 0
2618; CHECK-NEXT:    local.get 2
2619; CHECK-NEXT:    i64.const 1
2620; CHECK-NEXT:    local.get 1
2621; CHECK-NEXT:    i64.select
2622; CHECK-NEXT:    local.tee 2
2623; CHECK-NEXT:    i64.const 0
2624; CHECK-NEXT:    i64.gt_s
2625; CHECK-NEXT:    i64.select
2626; CHECK-NEXT:    local.get 2
2627; CHECK-NEXT:    i64.eqz
2628; CHECK-NEXT:    i64.select
2629; CHECK-NEXT:    i64x2.replace_lane 1
2630; CHECK-NEXT:    # fallthrough-return
2631entry:
2632  %conv = fptosi <2 x double> %x to <2 x i128>
2633  %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
2634  %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)
2635  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2636  ret <2 x i64> %conv6
2637}
2638
2639define <2 x i64> @stest_f32i64_mm(<2 x float> %x) {
2640; CHECK-LABEL: stest_f32i64_mm:
2641; CHECK:         .functype stest_f32i64_mm (v128) -> (v128)
2642; CHECK-NEXT:    .local i32, i64, i64, i64, i64
2643; CHECK-NEXT:  # %bb.0: # %entry
2644; CHECK-NEXT:    global.get __stack_pointer
2645; CHECK-NEXT:    i32.const 32
2646; CHECK-NEXT:    i32.sub
2647; CHECK-NEXT:    local.tee 1
2648; CHECK-NEXT:    global.set __stack_pointer
2649; CHECK-NEXT:    local.get 1
2650; CHECK-NEXT:    i32.const 16
2651; CHECK-NEXT:    i32.add
2652; CHECK-NEXT:    local.get 0
2653; CHECK-NEXT:    f32x4.extract_lane 1
2654; CHECK-NEXT:    call __fixsfti
2655; CHECK-NEXT:    local.get 1
2656; CHECK-NEXT:    local.get 0
2657; CHECK-NEXT:    f32x4.extract_lane 0
2658; CHECK-NEXT:    call __fixsfti
2659; CHECK-NEXT:    local.get 1
2660; CHECK-NEXT:    i32.const 16
2661; CHECK-NEXT:    i32.add
2662; CHECK-NEXT:    i32.const 8
2663; CHECK-NEXT:    i32.add
2664; CHECK-NEXT:    i64.load 0
2665; CHECK-NEXT:    local.set 2
2666; CHECK-NEXT:    local.get 1
2667; CHECK-NEXT:    i64.load 16
2668; CHECK-NEXT:    local.set 3
2669; CHECK-NEXT:    local.get 1
2670; CHECK-NEXT:    i32.const 8
2671; CHECK-NEXT:    i32.add
2672; CHECK-NEXT:    i64.load 0
2673; CHECK-NEXT:    local.set 4
2674; CHECK-NEXT:    local.get 1
2675; CHECK-NEXT:    i64.load 0
2676; CHECK-NEXT:    local.set 5
2677; CHECK-NEXT:    local.get 1
2678; CHECK-NEXT:    i32.const 32
2679; CHECK-NEXT:    i32.add
2680; CHECK-NEXT:    global.set __stack_pointer
2681; CHECK-NEXT:    local.get 5
2682; CHECK-NEXT:    i64.const 9223372036854775807
2683; CHECK-NEXT:    local.get 5
2684; CHECK-NEXT:    i64.const 9223372036854775807
2685; CHECK-NEXT:    i64.lt_u
2686; CHECK-NEXT:    i64.select
2687; CHECK-NEXT:    local.get 5
2688; CHECK-NEXT:    i64.const 9223372036854775807
2689; CHECK-NEXT:    local.get 4
2690; CHECK-NEXT:    i64.const 0
2691; CHECK-NEXT:    i64.lt_s
2692; CHECK-NEXT:    i64.select
2693; CHECK-NEXT:    local.get 4
2694; CHECK-NEXT:    i64.eqz
2695; CHECK-NEXT:    i64.select
2696; CHECK-NEXT:    local.tee 5
2697; CHECK-NEXT:    i64.const -9223372036854775808
2698; CHECK-NEXT:    local.get 5
2699; CHECK-NEXT:    i64.const -9223372036854775808
2700; CHECK-NEXT:    i64.gt_u
2701; CHECK-NEXT:    i64.select
2702; CHECK-NEXT:    local.get 5
2703; CHECK-NEXT:    i64.const -9223372036854775808
2704; CHECK-NEXT:    local.get 4
2705; CHECK-NEXT:    local.get 4
2706; CHECK-NEXT:    i64.const 63
2707; CHECK-NEXT:    i64.shr_s
2708; CHECK-NEXT:    i64.and
2709; CHECK-NEXT:    local.tee 4
2710; CHECK-NEXT:    i64.const -1
2711; CHECK-NEXT:    i64.gt_s
2712; CHECK-NEXT:    i64.select
2713; CHECK-NEXT:    local.get 4
2714; CHECK-NEXT:    i64.const -1
2715; CHECK-NEXT:    i64.eq
2716; CHECK-NEXT:    i64.select
2717; CHECK-NEXT:    i64x2.splat
2718; CHECK-NEXT:    local.get 3
2719; CHECK-NEXT:    i64.const 9223372036854775807
2720; CHECK-NEXT:    local.get 3
2721; CHECK-NEXT:    i64.const 9223372036854775807
2722; CHECK-NEXT:    i64.lt_u
2723; CHECK-NEXT:    i64.select
2724; CHECK-NEXT:    local.get 3
2725; CHECK-NEXT:    i64.const 9223372036854775807
2726; CHECK-NEXT:    local.get 2
2727; CHECK-NEXT:    i64.const 0
2728; CHECK-NEXT:    i64.lt_s
2729; CHECK-NEXT:    i64.select
2730; CHECK-NEXT:    local.get 2
2731; CHECK-NEXT:    i64.eqz
2732; CHECK-NEXT:    i64.select
2733; CHECK-NEXT:    local.tee 4
2734; CHECK-NEXT:    i64.const -9223372036854775808
2735; CHECK-NEXT:    local.get 4
2736; CHECK-NEXT:    i64.const -9223372036854775808
2737; CHECK-NEXT:    i64.gt_u
2738; CHECK-NEXT:    i64.select
2739; CHECK-NEXT:    local.get 4
2740; CHECK-NEXT:    i64.const -9223372036854775808
2741; CHECK-NEXT:    local.get 2
2742; CHECK-NEXT:    local.get 2
2743; CHECK-NEXT:    i64.const 63
2744; CHECK-NEXT:    i64.shr_s
2745; CHECK-NEXT:    i64.and
2746; CHECK-NEXT:    local.tee 2
2747; CHECK-NEXT:    i64.const -1
2748; CHECK-NEXT:    i64.gt_s
2749; CHECK-NEXT:    i64.select
2750; CHECK-NEXT:    local.get 2
2751; CHECK-NEXT:    i64.const -1
2752; CHECK-NEXT:    i64.eq
2753; CHECK-NEXT:    i64.select
2754; CHECK-NEXT:    i64x2.replace_lane 1
2755; CHECK-NEXT:    # fallthrough-return
2756entry:
2757  %conv = fptosi <2 x float> %x to <2 x i128>
2758  %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)
2759  %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)
2760  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2761  ret <2 x i64> %conv6
2762}
2763
2764define <2 x i64> @utest_f32i64_mm(<2 x float> %x) {
2765; CHECK-LABEL: utest_f32i64_mm:
2766; CHECK:         .functype utest_f32i64_mm (v128) -> (v128)
2767; CHECK-NEXT:    .local i32, i64, i64, i64, i64
2768; CHECK-NEXT:  # %bb.0: # %entry
2769; CHECK-NEXT:    global.get __stack_pointer
2770; CHECK-NEXT:    i32.const 32
2771; CHECK-NEXT:    i32.sub
2772; CHECK-NEXT:    local.tee 1
2773; CHECK-NEXT:    global.set __stack_pointer
2774; CHECK-NEXT:    local.get 1
2775; CHECK-NEXT:    i32.const 16
2776; CHECK-NEXT:    i32.add
2777; CHECK-NEXT:    local.get 0
2778; CHECK-NEXT:    f32x4.extract_lane 1
2779; CHECK-NEXT:    call __fixunssfti
2780; CHECK-NEXT:    local.get 1
2781; CHECK-NEXT:    local.get 0
2782; CHECK-NEXT:    f32x4.extract_lane 0
2783; CHECK-NEXT:    call __fixunssfti
2784; CHECK-NEXT:    local.get 1
2785; CHECK-NEXT:    i32.const 16
2786; CHECK-NEXT:    i32.add
2787; CHECK-NEXT:    i32.const 8
2788; CHECK-NEXT:    i32.add
2789; CHECK-NEXT:    i64.load 0
2790; CHECK-NEXT:    local.set 2
2791; CHECK-NEXT:    local.get 1
2792; CHECK-NEXT:    i64.load 16
2793; CHECK-NEXT:    local.set 3
2794; CHECK-NEXT:    local.get 1
2795; CHECK-NEXT:    i32.const 8
2796; CHECK-NEXT:    i32.add
2797; CHECK-NEXT:    i64.load 0
2798; CHECK-NEXT:    local.set 4
2799; CHECK-NEXT:    local.get 1
2800; CHECK-NEXT:    i64.load 0
2801; CHECK-NEXT:    local.set 5
2802; CHECK-NEXT:    local.get 1
2803; CHECK-NEXT:    i32.const 32
2804; CHECK-NEXT:    i32.add
2805; CHECK-NEXT:    global.set __stack_pointer
2806; CHECK-NEXT:    i64.const 0
2807; CHECK-NEXT:    local.get 5
2808; CHECK-NEXT:    i64.const 0
2809; CHECK-NEXT:    local.get 4
2810; CHECK-NEXT:    i64.eqz
2811; CHECK-NEXT:    i64.select
2812; CHECK-NEXT:    local.get 4
2813; CHECK-NEXT:    i64.const 1
2814; CHECK-NEXT:    i64.eq
2815; CHECK-NEXT:    i64.select
2816; CHECK-NEXT:    i64x2.splat
2817; CHECK-NEXT:    i64.const 0
2818; CHECK-NEXT:    local.get 3
2819; CHECK-NEXT:    i64.const 0
2820; CHECK-NEXT:    local.get 2
2821; CHECK-NEXT:    i64.eqz
2822; CHECK-NEXT:    i64.select
2823; CHECK-NEXT:    local.get 2
2824; CHECK-NEXT:    i64.const 1
2825; CHECK-NEXT:    i64.eq
2826; CHECK-NEXT:    i64.select
2827; CHECK-NEXT:    i64x2.replace_lane 1
2828; CHECK-NEXT:    # fallthrough-return
2829entry:
2830  %conv = fptoui <2 x float> %x to <2 x i128>
2831  %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
2832  %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
2833  ret <2 x i64> %conv6
2834}
2835
2836define <2 x i64> @ustest_f32i64_mm(<2 x float> %x) {
2837; CHECK-LABEL: ustest_f32i64_mm:
2838; CHECK:         .functype ustest_f32i64_mm (v128) -> (v128)
2839; CHECK-NEXT:    .local i32, i64, i64, i64, i64
2840; CHECK-NEXT:  # %bb.0: # %entry
2841; CHECK-NEXT:    global.get __stack_pointer
2842; CHECK-NEXT:    i32.const 32
2843; CHECK-NEXT:    i32.sub
2844; CHECK-NEXT:    local.tee 1
2845; CHECK-NEXT:    global.set __stack_pointer
2846; CHECK-NEXT:    local.get 1
2847; CHECK-NEXT:    i32.const 16
2848; CHECK-NEXT:    i32.add
2849; CHECK-NEXT:    local.get 0
2850; CHECK-NEXT:    f32x4.extract_lane 1
2851; CHECK-NEXT:    call __fixsfti
2852; CHECK-NEXT:    local.get 1
2853; CHECK-NEXT:    local.get 0
2854; CHECK-NEXT:    f32x4.extract_lane 0
2855; CHECK-NEXT:    call __fixsfti
2856; CHECK-NEXT:    local.get 1
2857; CHECK-NEXT:    i32.const 16
2858; CHECK-NEXT:    i32.add
2859; CHECK-NEXT:    i32.const 8
2860; CHECK-NEXT:    i32.add
2861; CHECK-NEXT:    i64.load 0
2862; CHECK-NEXT:    local.set 2
2863; CHECK-NEXT:    local.get 1
2864; CHECK-NEXT:    i64.load 16
2865; CHECK-NEXT:    local.set 3
2866; CHECK-NEXT:    local.get 1
2867; CHECK-NEXT:    i32.const 8
2868; CHECK-NEXT:    i32.add
2869; CHECK-NEXT:    i64.load 0
2870; CHECK-NEXT:    local.set 4
2871; CHECK-NEXT:    local.get 1
2872; CHECK-NEXT:    i64.load 0
2873; CHECK-NEXT:    local.set 5
2874; CHECK-NEXT:    local.get 1
2875; CHECK-NEXT:    i32.const 32
2876; CHECK-NEXT:    i32.add
2877; CHECK-NEXT:    global.set __stack_pointer
2878; CHECK-NEXT:    i64.const 0
2879; CHECK-NEXT:    local.get 5
2880; CHECK-NEXT:    i64.const 0
2881; CHECK-NEXT:    local.get 4
2882; CHECK-NEXT:    i64.const 1
2883; CHECK-NEXT:    i64.lt_s
2884; CHECK-NEXT:    local.tee 1
2885; CHECK-NEXT:    i64.select
2886; CHECK-NEXT:    local.get 4
2887; CHECK-NEXT:    i64.const 1
2888; CHECK-NEXT:    i64.eq
2889; CHECK-NEXT:    i64.select
2890; CHECK-NEXT:    local.tee 5
2891; CHECK-NEXT:    local.get 5
2892; CHECK-NEXT:    i64.const 0
2893; CHECK-NEXT:    local.get 4
2894; CHECK-NEXT:    i64.const 1
2895; CHECK-NEXT:    local.get 1
2896; CHECK-NEXT:    i64.select
2897; CHECK-NEXT:    local.tee 4
2898; CHECK-NEXT:    i64.const 0
2899; CHECK-NEXT:    i64.gt_s
2900; CHECK-NEXT:    i64.select
2901; CHECK-NEXT:    local.get 4
2902; CHECK-NEXT:    i64.eqz
2903; CHECK-NEXT:    i64.select
2904; CHECK-NEXT:    i64x2.splat
2905; CHECK-NEXT:    i64.const 0
2906; CHECK-NEXT:    local.get 3
2907; CHECK-NEXT:    i64.const 0
2908; CHECK-NEXT:    local.get 2
2909; CHECK-NEXT:    i64.const 1
2910; CHECK-NEXT:    i64.lt_s
2911; CHECK-NEXT:    local.tee 1
2912; CHECK-NEXT:    i64.select
2913; CHECK-NEXT:    local.get 2
2914; CHECK-NEXT:    i64.const 1
2915; CHECK-NEXT:    i64.eq
2916; CHECK-NEXT:    i64.select
2917; CHECK-NEXT:    local.tee 4
2918; CHECK-NEXT:    local.get 4
2919; CHECK-NEXT:    i64.const 0
2920; CHECK-NEXT:    local.get 2
2921; CHECK-NEXT:    i64.const 1
2922; CHECK-NEXT:    local.get 1
2923; CHECK-NEXT:    i64.select
2924; CHECK-NEXT:    local.tee 2
2925; CHECK-NEXT:    i64.const 0
2926; CHECK-NEXT:    i64.gt_s
2927; CHECK-NEXT:    i64.select
2928; CHECK-NEXT:    local.get 2
2929; CHECK-NEXT:    i64.eqz
2930; CHECK-NEXT:    i64.select
2931; CHECK-NEXT:    i64x2.replace_lane 1
2932; CHECK-NEXT:    # fallthrough-return
2933entry:
2934  %conv = fptosi <2 x float> %x to <2 x i128>
2935  %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
2936  %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)
2937  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2938  ret <2 x i64> %conv6
2939}
2940
2941define <2 x i64> @stest_f16i64_mm(<2 x half> %x) {
2942; CHECK-LABEL: stest_f16i64_mm:
2943; CHECK:         .functype stest_f16i64_mm (f32, f32) -> (v128)
2944; CHECK-NEXT:    .local i32, i64, i64, i64, i64
2945; CHECK-NEXT:  # %bb.0: # %entry
2946; CHECK-NEXT:    global.get __stack_pointer
2947; CHECK-NEXT:    i32.const 32
2948; CHECK-NEXT:    i32.sub
2949; CHECK-NEXT:    local.tee 2
2950; CHECK-NEXT:    global.set __stack_pointer
2951; CHECK-NEXT:    local.get 2
2952; CHECK-NEXT:    i32.const 16
2953; CHECK-NEXT:    i32.add
2954; CHECK-NEXT:    local.get 1
2955; CHECK-NEXT:    call __truncsfhf2
2956; CHECK-NEXT:    call __extendhfsf2
2957; CHECK-NEXT:    call __fixsfti
2958; CHECK-NEXT:    local.get 2
2959; CHECK-NEXT:    local.get 0
2960; CHECK-NEXT:    call __truncsfhf2
2961; CHECK-NEXT:    call __extendhfsf2
2962; CHECK-NEXT:    call __fixsfti
2963; CHECK-NEXT:    local.get 2
2964; CHECK-NEXT:    i32.const 16
2965; CHECK-NEXT:    i32.add
2966; CHECK-NEXT:    i32.const 8
2967; CHECK-NEXT:    i32.add
2968; CHECK-NEXT:    i64.load 0
2969; CHECK-NEXT:    local.set 3
2970; CHECK-NEXT:    local.get 2
2971; CHECK-NEXT:    i64.load 16
2972; CHECK-NEXT:    local.set 4
2973; CHECK-NEXT:    local.get 2
2974; CHECK-NEXT:    i32.const 8
2975; CHECK-NEXT:    i32.add
2976; CHECK-NEXT:    i64.load 0
2977; CHECK-NEXT:    local.set 5
2978; CHECK-NEXT:    local.get 2
2979; CHECK-NEXT:    i64.load 0
2980; CHECK-NEXT:    local.set 6
2981; CHECK-NEXT:    local.get 2
2982; CHECK-NEXT:    i32.const 32
2983; CHECK-NEXT:    i32.add
2984; CHECK-NEXT:    global.set __stack_pointer
2985; CHECK-NEXT:    local.get 6
2986; CHECK-NEXT:    i64.const 9223372036854775807
2987; CHECK-NEXT:    local.get 6
2988; CHECK-NEXT:    i64.const 9223372036854775807
2989; CHECK-NEXT:    i64.lt_u
2990; CHECK-NEXT:    i64.select
2991; CHECK-NEXT:    local.get 6
2992; CHECK-NEXT:    i64.const 9223372036854775807
2993; CHECK-NEXT:    local.get 5
2994; CHECK-NEXT:    i64.const 0
2995; CHECK-NEXT:    i64.lt_s
2996; CHECK-NEXT:    i64.select
2997; CHECK-NEXT:    local.get 5
2998; CHECK-NEXT:    i64.eqz
2999; CHECK-NEXT:    i64.select
3000; CHECK-NEXT:    local.tee 6
3001; CHECK-NEXT:    i64.const -9223372036854775808
3002; CHECK-NEXT:    local.get 6
3003; CHECK-NEXT:    i64.const -9223372036854775808
3004; CHECK-NEXT:    i64.gt_u
3005; CHECK-NEXT:    i64.select
3006; CHECK-NEXT:    local.get 6
3007; CHECK-NEXT:    i64.const -9223372036854775808
3008; CHECK-NEXT:    local.get 5
3009; CHECK-NEXT:    local.get 5
3010; CHECK-NEXT:    i64.const 63
3011; CHECK-NEXT:    i64.shr_s
3012; CHECK-NEXT:    i64.and
3013; CHECK-NEXT:    local.tee 5
3014; CHECK-NEXT:    i64.const -1
3015; CHECK-NEXT:    i64.gt_s
3016; CHECK-NEXT:    i64.select
3017; CHECK-NEXT:    local.get 5
3018; CHECK-NEXT:    i64.const -1
3019; CHECK-NEXT:    i64.eq
3020; CHECK-NEXT:    i64.select
3021; CHECK-NEXT:    i64x2.splat
3022; CHECK-NEXT:    local.get 4
3023; CHECK-NEXT:    i64.const 9223372036854775807
3024; CHECK-NEXT:    local.get 4
3025; CHECK-NEXT:    i64.const 9223372036854775807
3026; CHECK-NEXT:    i64.lt_u
3027; CHECK-NEXT:    i64.select
3028; CHECK-NEXT:    local.get 4
3029; CHECK-NEXT:    i64.const 9223372036854775807
3030; CHECK-NEXT:    local.get 3
3031; CHECK-NEXT:    i64.const 0
3032; CHECK-NEXT:    i64.lt_s
3033; CHECK-NEXT:    i64.select
3034; CHECK-NEXT:    local.get 3
3035; CHECK-NEXT:    i64.eqz
3036; CHECK-NEXT:    i64.select
3037; CHECK-NEXT:    local.tee 5
3038; CHECK-NEXT:    i64.const -9223372036854775808
3039; CHECK-NEXT:    local.get 5
3040; CHECK-NEXT:    i64.const -9223372036854775808
3041; CHECK-NEXT:    i64.gt_u
3042; CHECK-NEXT:    i64.select
3043; CHECK-NEXT:    local.get 5
3044; CHECK-NEXT:    i64.const -9223372036854775808
3045; CHECK-NEXT:    local.get 3
3046; CHECK-NEXT:    local.get 3
3047; CHECK-NEXT:    i64.const 63
3048; CHECK-NEXT:    i64.shr_s
3049; CHECK-NEXT:    i64.and
3050; CHECK-NEXT:    local.tee 3
3051; CHECK-NEXT:    i64.const -1
3052; CHECK-NEXT:    i64.gt_s
3053; CHECK-NEXT:    i64.select
3054; CHECK-NEXT:    local.get 3
3055; CHECK-NEXT:    i64.const -1
3056; CHECK-NEXT:    i64.eq
3057; CHECK-NEXT:    i64.select
3058; CHECK-NEXT:    i64x2.replace_lane 1
3059; CHECK-NEXT:    # fallthrough-return
3060entry:
3061  %conv = fptosi <2 x half> %x to <2 x i128>
3062  %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)
3063  %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)
3064  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
3065  ret <2 x i64> %conv6
3066}
3067
3068define <2 x i64> @utesth_f16i64_mm(<2 x half> %x) {
3069; CHECK-LABEL: utesth_f16i64_mm:
3070; CHECK:         .functype utesth_f16i64_mm (f32, f32) -> (v128)
3071; CHECK-NEXT:    .local i32, i64, i64, i64, i64
3072; CHECK-NEXT:  # %bb.0: # %entry
3073; CHECK-NEXT:    global.get __stack_pointer
3074; CHECK-NEXT:    i32.const 32
3075; CHECK-NEXT:    i32.sub
3076; CHECK-NEXT:    local.tee 2
3077; CHECK-NEXT:    global.set __stack_pointer
3078; CHECK-NEXT:    local.get 2
3079; CHECK-NEXT:    i32.const 16
3080; CHECK-NEXT:    i32.add
3081; CHECK-NEXT:    local.get 1
3082; CHECK-NEXT:    call __truncsfhf2
3083; CHECK-NEXT:    call __extendhfsf2
3084; CHECK-NEXT:    call __fixunssfti
3085; CHECK-NEXT:    local.get 2
3086; CHECK-NEXT:    local.get 0
3087; CHECK-NEXT:    call __truncsfhf2
3088; CHECK-NEXT:    call __extendhfsf2
3089; CHECK-NEXT:    call __fixunssfti
3090; CHECK-NEXT:    local.get 2
3091; CHECK-NEXT:    i32.const 16
3092; CHECK-NEXT:    i32.add
3093; CHECK-NEXT:    i32.const 8
3094; CHECK-NEXT:    i32.add
3095; CHECK-NEXT:    i64.load 0
3096; CHECK-NEXT:    local.set 3
3097; CHECK-NEXT:    local.get 2
3098; CHECK-NEXT:    i64.load 16
3099; CHECK-NEXT:    local.set 4
3100; CHECK-NEXT:    local.get 2
3101; CHECK-NEXT:    i32.const 8
3102; CHECK-NEXT:    i32.add
3103; CHECK-NEXT:    i64.load 0
3104; CHECK-NEXT:    local.set 5
3105; CHECK-NEXT:    local.get 2
3106; CHECK-NEXT:    i64.load 0
3107; CHECK-NEXT:    local.set 6
3108; CHECK-NEXT:    local.get 2
3109; CHECK-NEXT:    i32.const 32
3110; CHECK-NEXT:    i32.add
3111; CHECK-NEXT:    global.set __stack_pointer
3112; CHECK-NEXT:    i64.const 0
3113; CHECK-NEXT:    local.get 6
3114; CHECK-NEXT:    i64.const 0
3115; CHECK-NEXT:    local.get 5
3116; CHECK-NEXT:    i64.eqz
3117; CHECK-NEXT:    i64.select
3118; CHECK-NEXT:    local.get 5
3119; CHECK-NEXT:    i64.const 1
3120; CHECK-NEXT:    i64.eq
3121; CHECK-NEXT:    i64.select
3122; CHECK-NEXT:    i64x2.splat
3123; CHECK-NEXT:    i64.const 0
3124; CHECK-NEXT:    local.get 4
3125; CHECK-NEXT:    i64.const 0
3126; CHECK-NEXT:    local.get 3
3127; CHECK-NEXT:    i64.eqz
3128; CHECK-NEXT:    i64.select
3129; CHECK-NEXT:    local.get 3
3130; CHECK-NEXT:    i64.const 1
3131; CHECK-NEXT:    i64.eq
3132; CHECK-NEXT:    i64.select
3133; CHECK-NEXT:    i64x2.replace_lane 1
3134; CHECK-NEXT:    # fallthrough-return
3135entry:
3136  %conv = fptoui <2 x half> %x to <2 x i128>
3137  %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
3138  %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
3139  ret <2 x i64> %conv6
3140}
3141
3142define <2 x i64> @ustest_f16i64_mm(<2 x half> %x) {
3143; CHECK-LABEL: ustest_f16i64_mm:
3144; CHECK:         .functype ustest_f16i64_mm (f32, f32) -> (v128)
3145; CHECK-NEXT:    .local i32, i64, i64, i64, i64
3146; CHECK-NEXT:  # %bb.0: # %entry
3147; CHECK-NEXT:    global.get __stack_pointer
3148; CHECK-NEXT:    i32.const 32
3149; CHECK-NEXT:    i32.sub
3150; CHECK-NEXT:    local.tee 2
3151; CHECK-NEXT:    global.set __stack_pointer
3152; CHECK-NEXT:    local.get 2
3153; CHECK-NEXT:    i32.const 16
3154; CHECK-NEXT:    i32.add
3155; CHECK-NEXT:    local.get 1
3156; CHECK-NEXT:    call __truncsfhf2
3157; CHECK-NEXT:    call __extendhfsf2
3158; CHECK-NEXT:    call __fixsfti
3159; CHECK-NEXT:    local.get 2
3160; CHECK-NEXT:    local.get 0
3161; CHECK-NEXT:    call __truncsfhf2
3162; CHECK-NEXT:    call __extendhfsf2
3163; CHECK-NEXT:    call __fixsfti
3164; CHECK-NEXT:    local.get 2
3165; CHECK-NEXT:    i32.const 16
3166; CHECK-NEXT:    i32.add
3167; CHECK-NEXT:    i32.const 8
3168; CHECK-NEXT:    i32.add
3169; CHECK-NEXT:    i64.load 0
3170; CHECK-NEXT:    local.set 3
3171; CHECK-NEXT:    local.get 2
3172; CHECK-NEXT:    i64.load 16
3173; CHECK-NEXT:    local.set 4
3174; CHECK-NEXT:    local.get 2
3175; CHECK-NEXT:    i32.const 8
3176; CHECK-NEXT:    i32.add
3177; CHECK-NEXT:    i64.load 0
3178; CHECK-NEXT:    local.set 5
3179; CHECK-NEXT:    local.get 2
3180; CHECK-NEXT:    i64.load 0
3181; CHECK-NEXT:    local.set 6
3182; CHECK-NEXT:    local.get 2
3183; CHECK-NEXT:    i32.const 32
3184; CHECK-NEXT:    i32.add
3185; CHECK-NEXT:    global.set __stack_pointer
3186; CHECK-NEXT:    i64.const 0
3187; CHECK-NEXT:    local.get 6
3188; CHECK-NEXT:    i64.const 0
3189; CHECK-NEXT:    local.get 5
3190; CHECK-NEXT:    i64.const 1
3191; CHECK-NEXT:    i64.lt_s
3192; CHECK-NEXT:    local.tee 2
3193; CHECK-NEXT:    i64.select
3194; CHECK-NEXT:    local.get 5
3195; CHECK-NEXT:    i64.const 1
3196; CHECK-NEXT:    i64.eq
3197; CHECK-NEXT:    i64.select
3198; CHECK-NEXT:    local.tee 6
3199; CHECK-NEXT:    local.get 6
3200; CHECK-NEXT:    i64.const 0
3201; CHECK-NEXT:    local.get 5
3202; CHECK-NEXT:    i64.const 1
3203; CHECK-NEXT:    local.get 2
3204; CHECK-NEXT:    i64.select
3205; CHECK-NEXT:    local.tee 5
3206; CHECK-NEXT:    i64.const 0
3207; CHECK-NEXT:    i64.gt_s
3208; CHECK-NEXT:    i64.select
3209; CHECK-NEXT:    local.get 5
3210; CHECK-NEXT:    i64.eqz
3211; CHECK-NEXT:    i64.select
3212; CHECK-NEXT:    i64x2.splat
3213; CHECK-NEXT:    i64.const 0
3214; CHECK-NEXT:    local.get 4
3215; CHECK-NEXT:    i64.const 0
3216; CHECK-NEXT:    local.get 3
3217; CHECK-NEXT:    i64.const 1
3218; CHECK-NEXT:    i64.lt_s
3219; CHECK-NEXT:    local.tee 2
3220; CHECK-NEXT:    i64.select
3221; CHECK-NEXT:    local.get 3
3222; CHECK-NEXT:    i64.const 1
3223; CHECK-NEXT:    i64.eq
3224; CHECK-NEXT:    i64.select
3225; CHECK-NEXT:    local.tee 5
3226; CHECK-NEXT:    local.get 5
3227; CHECK-NEXT:    i64.const 0
3228; CHECK-NEXT:    local.get 3
3229; CHECK-NEXT:    i64.const 1
3230; CHECK-NEXT:    local.get 2
3231; CHECK-NEXT:    i64.select
3232; CHECK-NEXT:    local.tee 3
3233; CHECK-NEXT:    i64.const 0
3234; CHECK-NEXT:    i64.gt_s
3235; CHECK-NEXT:    i64.select
3236; CHECK-NEXT:    local.get 3
3237; CHECK-NEXT:    i64.eqz
3238; CHECK-NEXT:    i64.select
3239; CHECK-NEXT:    i64x2.replace_lane 1
3240; CHECK-NEXT:    # fallthrough-return
3241entry:
3242  %conv = fptosi <2 x half> %x to <2 x i128>
3243  %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
3244  %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)
3245  %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
3246  ret <2 x i64> %conv6
3247}
3248
3249declare <2 x i32> @llvm.smin.v2i32(<2 x i32>, <2 x i32>)
3250declare <2 x i32> @llvm.smax.v2i32(<2 x i32>, <2 x i32>)
3251declare <2 x i32> @llvm.umin.v2i32(<2 x i32>, <2 x i32>)
3252declare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>)
3253declare <4 x i32> @llvm.smax.v4i32(<4 x i32>, <4 x i32>)
3254declare <4 x i32> @llvm.umin.v4i32(<4 x i32>, <4 x i32>)
3255declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>)
3256declare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>)
3257declare <8 x i32> @llvm.umin.v8i32(<8 x i32>, <8 x i32>)
3258declare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>)
3259declare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>)
3260declare <2 x i64> @llvm.umin.v2i64(<2 x i64>, <2 x i64>)
3261declare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>)
3262declare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>)
3263declare <4 x i64> @llvm.umin.v4i64(<4 x i64>, <4 x i64>)
3264declare <2 x i128> @llvm.smin.v2i128(<2 x i128>, <2 x i128>)
3265declare <2 x i128> @llvm.smax.v2i128(<2 x i128>, <2 x i128>)
3266declare <2 x i128> @llvm.umin.v2i128(<2 x i128>, <2 x i128>)
3267