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