xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/select.ll (revision 0278c9ceb6c2475f1b1213fcc4ffaf667c6b7731)
1; RUN: llc < %s -mtriple=ve | FileCheck %s
2
3;;; Test ‘select’ instruction
4;;;
5;;; Syntax:
6;;;   <result> = select [fast-math flags] selty <cond>, <ty> <val1>, <ty> <val2>
7;;;                                             ; yields ty
8;;;
9;;;   selty is either i1 or {<N x i1>}
10;;;
11;;; Overview:
12;;;   The ‘select’ instruction is used to choose one value based on a condition,
13;;;   without IR-level branching.
14;;;
15;;; Arguments:
16;;;   The ‘select’ instruction requires an ‘i1’ value or a vector of ‘i1’ values
17;;;   indicating the condition, and two values of the same first class type.
18;;;
19;;;   The optional fast-math flags marker indicates that the select has one or
20;;;   more fast-math flags. These are optimization hints to enable otherwise
21;;;   unsafe floating-point optimizations. Fast-math flags are only valid for
22;;;   selects that return a floating-point scalar or vector type, or an array
23;;;   (nested to any depth) of floating-point scalar or vector types.
24;;;
25;;; Semantics:
26;;;   If the condition is an i1 and it evaluates to 1, the instruction returns
27;;;   the first value argument; otherwise, it returns the second value argument.
28;;;
29;;;   If the condition is a vector of i1, then the value arguments must be
30;;;   vectors of the same size, and the selection is done element by element.
31;;;
32;;;   If the condition is an i1 and the value arguments are vectors of the same
33;;;   size, then an entire vector is selected.
34;;;
35;;; Example:
36;;;   %X = select i1 true, i8 17, i8 42 ; yields i8:17
37;;;
38;;; Note:
39;;;   We test only i1/i8/u8/i16/u16/i32/u32/i64/u64/i128/u128/float/double/fp128
40
41; Function Attrs: norecurse nounwind readnone
42define zeroext i1 @select_i1_var(i1 zeroext %0, i1 zeroext %1, i1 zeroext %2) {
43; CHECK-LABEL: select_i1_var:
44; CHECK:       # %bb.0:
45; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
46; CHECK-NEXT:    adds.w.zx %s0, %s2, (0)1
47; CHECK-NEXT:    b.l.t (, %s10)
48  %4 = select i1 %0, i1 %1, i1 %2
49  ret i1 %4
50}
51
52; Function Attrs: norecurse nounwind readnone
53define signext i8 @select_i8_var(i1 zeroext %0, i8 signext %1, i8 signext %2) {
54; CHECK-LABEL: select_i8_var:
55; CHECK:       # %bb.0:
56; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
57; CHECK-NEXT:    adds.w.sx %s0, %s2, (0)1
58; CHECK-NEXT:    b.l.t (, %s10)
59  %4 = select i1 %0, i8 %1, i8 %2
60  ret i8 %4
61}
62
63; Function Attrs: norecurse nounwind readnone
64define zeroext i8 @select_u8_var(i1 zeroext %0, i8 zeroext %1, i8 zeroext %2) {
65; CHECK-LABEL: select_u8_var:
66; CHECK:       # %bb.0:
67; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
68; CHECK-NEXT:    adds.w.zx %s0, %s2, (0)1
69; CHECK-NEXT:    b.l.t (, %s10)
70  %4 = select i1 %0, i8 %1, i8 %2
71  ret i8 %4
72}
73
74; Function Attrs: norecurse nounwind readnone
75define signext i16 @select_i16_var(i1 zeroext %0, i16 signext %1, i16 signext %2) {
76; CHECK-LABEL: select_i16_var:
77; CHECK:       # %bb.0:
78; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
79; CHECK-NEXT:    adds.w.sx %s0, %s2, (0)1
80; CHECK-NEXT:    b.l.t (, %s10)
81  %4 = select i1 %0, i16 %1, i16 %2
82  ret i16 %4
83}
84
85; Function Attrs: norecurse nounwind readnone
86define zeroext i16 @select_u16_var(i1 zeroext %0, i16 zeroext %1, i16 zeroext %2) {
87; CHECK-LABEL: select_u16_var:
88; CHECK:       # %bb.0:
89; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
90; CHECK-NEXT:    adds.w.zx %s0, %s2, (0)1
91; CHECK-NEXT:    b.l.t (, %s10)
92  %4 = select i1 %0, i16 %1, i16 %2
93  ret i16 %4
94}
95
96; Function Attrs: norecurse nounwind readnone
97define signext i32 @select_i32_var(i1 zeroext %0, i32 signext %1, i32 signext %2) {
98; CHECK-LABEL: select_i32_var:
99; CHECK:       # %bb.0:
100; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
101; CHECK-NEXT:    adds.w.sx %s0, %s2, (0)1
102; CHECK-NEXT:    b.l.t (, %s10)
103  %4 = select i1 %0, i32 %1, i32 %2
104  ret i32 %4
105}
106
107; Function Attrs: norecurse nounwind readnone
108define zeroext i32 @select_u32_var(i1 zeroext %0, i32 zeroext %1, i32 zeroext %2) {
109; CHECK-LABEL: select_u32_var:
110; CHECK:       # %bb.0:
111; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
112; CHECK-NEXT:    adds.w.zx %s0, %s2, (0)1
113; CHECK-NEXT:    b.l.t (, %s10)
114  %4 = select i1 %0, i32 %1, i32 %2
115  ret i32 %4
116}
117
118; Function Attrs: norecurse nounwind readnone
119define i64 @select_i64_var(i1 zeroext %0, i64 %1, i64 %2) {
120; CHECK-LABEL: select_i64_var:
121; CHECK:       # %bb.0:
122; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
123; CHECK-NEXT:    or %s0, 0, %s2
124; CHECK-NEXT:    b.l.t (, %s10)
125  %4 = select i1 %0, i64 %1, i64 %2
126  ret i64 %4
127}
128
129; Function Attrs: norecurse nounwind readnone
130define i64 @select_u64_var(i1 zeroext %0, i64 %1, i64 %2) {
131; CHECK-LABEL: select_u64_var:
132; CHECK:       # %bb.0:
133; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
134; CHECK-NEXT:    or %s0, 0, %s2
135; CHECK-NEXT:    b.l.t (, %s10)
136  %4 = select i1 %0, i64 %1, i64 %2
137  ret i64 %4
138}
139
140; Function Attrs: norecurse nounwind readnone
141define i128 @select_i128_var(i1 zeroext %0, i128 %1, i128 %2) {
142; CHECK-LABEL: select_i128_var:
143; CHECK:       # %bb.0:
144; CHECK-NEXT:    cmov.w.ne %s3, %s1, %s0
145; CHECK-NEXT:    cmov.w.ne %s4, %s2, %s0
146; CHECK-NEXT:    or %s0, 0, %s3
147; CHECK-NEXT:    or %s1, 0, %s4
148; CHECK-NEXT:    b.l.t (, %s10)
149  %4 = select i1 %0, i128 %1, i128 %2
150  ret i128 %4
151}
152
153; Function Attrs: norecurse nounwind readnone
154define i128 @select_u128_var(i1 zeroext %0, i128 %1, i128 %2) {
155; CHECK-LABEL: select_u128_var:
156; CHECK:       # %bb.0:
157; CHECK-NEXT:    cmov.w.ne %s3, %s1, %s0
158; CHECK-NEXT:    cmov.w.ne %s4, %s2, %s0
159; CHECK-NEXT:    or %s0, 0, %s3
160; CHECK-NEXT:    or %s1, 0, %s4
161; CHECK-NEXT:    b.l.t (, %s10)
162  %4 = select i1 %0, i128 %1, i128 %2
163  ret i128 %4
164}
165
166; Function Attrs: norecurse nounwind readnone
167define float @select_float_var(i1 zeroext %0, float %1, float %2) {
168; CHECK-LABEL: select_float_var:
169; CHECK:       # %bb.0:
170; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
171; CHECK-NEXT:    or %s0, 0, %s2
172; CHECK-NEXT:    b.l.t (, %s10)
173  %4 = select fast i1 %0, float %1, float %2
174  ret float %4
175}
176
177; Function Attrs: norecurse nounwind readnone
178define double @select_double_var(i1 zeroext %0, double %1, double %2) {
179; CHECK-LABEL: select_double_var:
180; CHECK:       # %bb.0:
181; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
182; CHECK-NEXT:    or %s0, 0, %s2
183; CHECK-NEXT:    b.l.t (, %s10)
184  %4 = select fast i1 %0, double %1, double %2
185  ret double %4
186}
187
188; Function Attrs: norecurse nounwind readnone
189define fp128 @select_quad_var(i1 zeroext %0, fp128 %1, fp128 %2) {
190; CHECK-LABEL: select_quad_var:
191; CHECK:       # %bb.0:
192; CHECK-NEXT:    cmov.w.ne %s4, %s2, %s0
193; CHECK-NEXT:    cmov.w.ne %s5, %s3, %s0
194; CHECK-NEXT:    or %s0, 0, %s4
195; CHECK-NEXT:    or %s1, 0, %s5
196; CHECK-NEXT:    b.l.t (, %s10)
197  %4 = select fast i1 %0, fp128 %1, fp128 %2
198  ret fp128 %4
199}
200
201; Function Attrs: norecurse nounwind readnone
202define zeroext i1 @select_i1_mimm(i1 zeroext %0, i1 zeroext %1) {
203; CHECK-LABEL: select_i1_mimm:
204; CHECK:       # %bb.0:
205; CHECK-NEXT:    or %s0, %s0, %s1
206; CHECK-NEXT:    b.l.t (, %s10)
207  %3 = or i1 %0, %1
208  ret i1 %3
209}
210
211; Function Attrs: norecurse nounwind readnone
212define signext i8 @select_i8_mimm(i1 zeroext %0, i8 signext %1) {
213; CHECK-LABEL: select_i8_mimm:
214; CHECK:       # %bb.0:
215; CHECK-NEXT:    cmov.w.ne %s1, (57)1, %s0
216; CHECK-NEXT:    adds.w.sx %s0, %s1, (0)1
217; CHECK-NEXT:    b.l.t (, %s10)
218  %3 = select i1 %0, i8 -128, i8 %1
219  ret i8 %3
220}
221
222; Function Attrs: norecurse nounwind readnone
223define zeroext i8 @select_u8_mimm(i1 zeroext %0, i8 zeroext %1) {
224; CHECK-LABEL: select_u8_mimm:
225; CHECK:       # %bb.0:
226; CHECK-NEXT:    cmov.w.ne %s1, (57)0, %s0
227; CHECK-NEXT:    adds.w.zx %s0, %s1, (0)1
228; CHECK-NEXT:    b.l.t (, %s10)
229  %3 = select i1 %0, i8 127, i8 %1
230  ret i8 %3
231}
232
233; Function Attrs: norecurse nounwind readnone
234define signext i16 @select_i16_mimm(i1 zeroext %0, i16 signext %1) {
235; CHECK-LABEL: select_i16_mimm:
236; CHECK:       # %bb.0:
237; CHECK-NEXT:    cmov.w.ne %s1, (49)1, %s0
238; CHECK-NEXT:    adds.w.sx %s0, %s1, (0)1
239; CHECK-NEXT:    b.l.t (, %s10)
240  %3 = select i1 %0, i16 -32768, i16 %1
241  ret i16 %3
242}
243
244; Function Attrs: norecurse nounwind readnone
245define zeroext i16 @select_u16_mimm(i1 zeroext %0, i16 zeroext %1) {
246; CHECK-LABEL: select_u16_mimm:
247; CHECK:       # %bb.0:
248; CHECK-NEXT:    cmov.w.ne %s1, (49)0, %s0
249; CHECK-NEXT:    adds.w.zx %s0, %s1, (0)1
250; CHECK-NEXT:    b.l.t (, %s10)
251  %3 = select i1 %0, i16 32767, i16 %1
252  ret i16 %3
253}
254
255; Function Attrs: norecurse nounwind readnone
256define signext i32 @select_i32_mimm(i1 zeroext %0, i32 signext %1) {
257; CHECK-LABEL: select_i32_mimm:
258; CHECK:       # %bb.0:
259; CHECK-NEXT:    cmov.w.ne %s1, (48)0, %s0
260; CHECK-NEXT:    adds.w.sx %s0, %s1, (0)1
261; CHECK-NEXT:    b.l.t (, %s10)
262  %3 = select i1 %0, i32 65535, i32 %1
263  ret i32 %3
264}
265
266; Function Attrs: norecurse nounwind readnone
267define zeroext i32 @select_u32_mimm(i1 zeroext %0, i32 zeroext %1) {
268; CHECK-LABEL: select_u32_mimm:
269; CHECK:       # %bb.0:
270; CHECK-NEXT:    cmov.w.ne %s1, (48)0, %s0
271; CHECK-NEXT:    adds.w.zx %s0, %s1, (0)1
272; CHECK-NEXT:    b.l.t (, %s10)
273  %3 = select i1 %0, i32 65535, i32 %1
274  ret i32 %3
275}
276
277; Function Attrs: norecurse nounwind readnone
278define i64 @select_i64_mimm(i1 zeroext %0, i64 %1) {
279; CHECK-LABEL: select_i64_mimm:
280; CHECK:       # %bb.0:
281; CHECK-NEXT:    cmov.w.ne %s1, (48)0, %s0
282; CHECK-NEXT:    or %s0, 0, %s1
283; CHECK-NEXT:    b.l.t (, %s10)
284  %3 = select i1 %0, i64 65535, i64 %1
285  ret i64 %3
286}
287
288; Function Attrs: norecurse nounwind readnone
289define i64 @select_u64_mimm(i1 zeroext %0, i64 %1) {
290; CHECK-LABEL: select_u64_mimm:
291; CHECK:       # %bb.0:
292; CHECK-NEXT:    cmov.w.ne %s1, (48)0, %s0
293; CHECK-NEXT:    or %s0, 0, %s1
294; CHECK-NEXT:    b.l.t (, %s10)
295  %3 = select i1 %0, i64 65535, i64 %1
296  ret i64 %3
297}
298
299; Function Attrs: norecurse nounwind readnone
300define i128 @select_i128_mimm(i1 zeroext %0, i128 %1) {
301; CHECK-LABEL: select_i128_mimm:
302; CHECK:       # %bb.0:
303; CHECK-NEXT:    cmov.w.ne %s1, (48)0, %s0
304; CHECK-NEXT:    cmov.w.ne %s2, (0)1, %s0
305; CHECK-NEXT:    or %s0, 0, %s1
306; CHECK-NEXT:    or %s1, 0, %s2
307; CHECK-NEXT:    b.l.t (, %s10)
308  %3 = select i1 %0, i128 65535, i128 %1
309  ret i128 %3
310}
311
312; Function Attrs: norecurse nounwind readnone
313define i128 @select_u128_mimm(i1 zeroext %0, i128 %1) {
314; CHECK-LABEL: select_u128_mimm:
315; CHECK:       # %bb.0:
316; CHECK-NEXT:    cmov.w.ne %s1, (48)0, %s0
317; CHECK-NEXT:    cmov.w.ne %s2, (0)1, %s0
318; CHECK-NEXT:    or %s0, 0, %s1
319; CHECK-NEXT:    or %s1, 0, %s2
320; CHECK-NEXT:    b.l.t (, %s10)
321  %3 = select i1 %0, i128 65535, i128 %1
322  ret i128 %3
323}
324
325; Function Attrs: norecurse nounwind readnone
326define float @select_float_mimm(i1 zeroext %0, float %1) {
327; CHECK-LABEL: select_float_mimm:
328; CHECK:       # %bb.0:
329; CHECK-NEXT:    cmov.w.ne %s1, (2)1, %s0
330; CHECK-NEXT:    or %s0, 0, %s1
331; CHECK-NEXT:    b.l.t (, %s10)
332  %3 = select i1 %0, float -2.000000e+00, float %1
333  ret float %3
334}
335
336; Function Attrs: norecurse nounwind readnone
337define double @select_double_mimm(i1 zeroext %0, double %1) {
338; CHECK-LABEL: select_double_mimm:
339; CHECK:       # %bb.0:
340; CHECK-NEXT:    cmov.w.ne %s1, (2)1, %s0
341; CHECK-NEXT:    or %s0, 0, %s1
342; CHECK-NEXT:    b.l.t (, %s10)
343  %3 = select fast i1 %0, double -2.000000e+00, double %1
344  ret double %3
345}
346
347; Function Attrs: norecurse nounwind readnone
348define fp128 @select_quad_mimm(i1 zeroext %0, fp128 %1) {
349; CHECK-LABEL: select_quad_mimm:
350; CHECK:       # %bb.0:
351; CHECK-NEXT:    lea %s1, .LCPI{{[0-9]+}}_0@lo
352; CHECK-NEXT:    and %s1, %s1, (32)0
353; CHECK-NEXT:    lea.sl %s1, .LCPI{{[0-9]+}}_0@hi(, %s1)
354; CHECK-NEXT:    ld %s4, 8(, %s1)
355; CHECK-NEXT:    ld %s5, (, %s1)
356; CHECK-NEXT:    cmov.w.ne %s2, %s4, %s0
357; CHECK-NEXT:    cmov.w.ne %s3, %s5, %s0
358; CHECK-NEXT:    or %s0, 0, %s2
359; CHECK-NEXT:    or %s1, 0, %s3
360; CHECK-NEXT:    b.l.t (, %s10)
361  %3 = select fast i1 %0, fp128 0xL0000000000000000C000000000000000, fp128 %1
362  ret fp128 %3
363}
364
365; Function Attrs: norecurse nounwind readnone
366define zeroext i1 @select_mimm_i1(i1 zeroext %0, i1 zeroext %1) {
367; CHECK-LABEL: select_mimm_i1:
368; CHECK:       # %bb.0:
369; CHECK-NEXT:    xor %s0, 1, %s0
370; CHECK-NEXT:    or %s0, %s0, %s1
371; CHECK-NEXT:    b.l.t (, %s10)
372  %3 = xor i1 %0, true
373  %4 = or i1 %3, %1
374  ret i1 %4
375}
376
377; Function Attrs: norecurse nounwind readnone
378define signext i8 @select_mimm_i8(i1 zeroext %0, i8 signext %1) {
379; CHECK-LABEL: select_mimm_i8:
380; CHECK:       # %bb.0:
381; CHECK-NEXT:    cmov.w.eq %s1, (57)1, %s0
382; CHECK-NEXT:    adds.w.sx %s0, %s1, (0)1
383; CHECK-NEXT:    b.l.t (, %s10)
384  %3 = select i1 %0, i8 %1, i8 -128
385  ret i8 %3
386}
387
388; Function Attrs: norecurse nounwind readnone
389define zeroext i8 @select_mimm_u8(i1 zeroext %0, i8 zeroext %1) {
390; CHECK-LABEL: select_mimm_u8:
391; CHECK:       # %bb.0:
392; CHECK-NEXT:    cmov.w.eq %s1, (57)0, %s0
393; CHECK-NEXT:    adds.w.zx %s0, %s1, (0)1
394; CHECK-NEXT:    b.l.t (, %s10)
395  %3 = select i1 %0, i8 %1, i8 127
396  ret i8 %3
397}
398
399; Function Attrs: norecurse nounwind readnone
400define signext i16 @select_mimm_i16(i1 zeroext %0, i16 signext %1) {
401; CHECK-LABEL: select_mimm_i16:
402; CHECK:       # %bb.0:
403; CHECK-NEXT:    cmov.w.eq %s1, (49)1, %s0
404; CHECK-NEXT:    adds.w.sx %s0, %s1, (0)1
405; CHECK-NEXT:    b.l.t (, %s10)
406  %3 = select i1 %0, i16 %1, i16 -32768
407  ret i16 %3
408}
409
410; Function Attrs: norecurse nounwind readnone
411define zeroext i16 @select_mimm_u16(i1 zeroext %0, i16 zeroext %1) {
412; CHECK-LABEL: select_mimm_u16:
413; CHECK:       # %bb.0:
414; CHECK-NEXT:    cmov.w.eq %s1, (49)0, %s0
415; CHECK-NEXT:    adds.w.zx %s0, %s1, (0)1
416; CHECK-NEXT:    b.l.t (, %s10)
417  %3 = select i1 %0, i16 %1, i16 32767
418  ret i16 %3
419}
420
421; Function Attrs: norecurse nounwind readnone
422define signext i32 @select_mimm_i32(i1 zeroext %0, i32 signext %1) {
423; CHECK-LABEL: select_mimm_i32:
424; CHECK:       # %bb.0:
425; CHECK-NEXT:    cmov.w.eq %s1, (48)0, %s0
426; CHECK-NEXT:    adds.w.sx %s0, %s1, (0)1
427; CHECK-NEXT:    b.l.t (, %s10)
428  %3 = select i1 %0, i32 %1, i32 65535
429  ret i32 %3
430}
431
432; Function Attrs: norecurse nounwind readnone
433define zeroext i32 @select_mimm_u32(i1 zeroext %0, i32 zeroext %1) {
434; CHECK-LABEL: select_mimm_u32:
435; CHECK:       # %bb.0:
436; CHECK-NEXT:    cmov.w.eq %s1, (48)0, %s0
437; CHECK-NEXT:    adds.w.zx %s0, %s1, (0)1
438; CHECK-NEXT:    b.l.t (, %s10)
439  %3 = select i1 %0, i32 %1, i32 65535
440  ret i32 %3
441}
442
443; Function Attrs: norecurse nounwind readnone
444define i64 @select_mimm_i64(i1 zeroext %0, i64 %1) {
445; CHECK-LABEL: select_mimm_i64:
446; CHECK:       # %bb.0:
447; CHECK-NEXT:    cmov.w.eq %s1, (48)0, %s0
448; CHECK-NEXT:    or %s0, 0, %s1
449; CHECK-NEXT:    b.l.t (, %s10)
450  %3 = select i1 %0, i64 %1, i64 65535
451  ret i64 %3
452}
453
454; Function Attrs: norecurse nounwind readnone
455define i64 @select_mimm_u64(i1 zeroext %0, i64 %1) {
456; CHECK-LABEL: select_mimm_u64:
457; CHECK:       # %bb.0:
458; CHECK-NEXT:    cmov.w.eq %s1, (48)0, %s0
459; CHECK-NEXT:    or %s0, 0, %s1
460; CHECK-NEXT:    b.l.t (, %s10)
461  %3 = select i1 %0, i64 %1, i64 65535
462  ret i64 %3
463}
464
465; Function Attrs: norecurse nounwind readnone
466define i128 @select_mimm_i128(i1 zeroext %0, i128 %1) {
467; CHECK-LABEL: select_mimm_i128:
468; CHECK:       # %bb.0:
469; CHECK-NEXT:    cmov.w.eq %s1, (48)0, %s0
470; CHECK-NEXT:    cmov.w.eq %s2, (0)1, %s0
471; CHECK-NEXT:    or %s0, 0, %s1
472; CHECK-NEXT:    or %s1, 0, %s2
473; CHECK-NEXT:    b.l.t (, %s10)
474  %3 = select i1 %0, i128 %1, i128 65535
475  ret i128 %3
476}
477
478; Function Attrs: norecurse nounwind readnone
479define i128 @select_mimm_u128(i1 zeroext %0, i128 %1) {
480; CHECK-LABEL: select_mimm_u128:
481; CHECK:       # %bb.0:
482; CHECK-NEXT:    cmov.w.eq %s1, (48)0, %s0
483; CHECK-NEXT:    cmov.w.eq %s2, (0)1, %s0
484; CHECK-NEXT:    or %s0, 0, %s1
485; CHECK-NEXT:    or %s1, 0, %s2
486; CHECK-NEXT:    b.l.t (, %s10)
487  %3 = select i1 %0, i128 %1, i128 65535
488  ret i128 %3
489}
490
491; Function Attrs: norecurse nounwind readnone
492define float @select_mimm_float(i1 zeroext %0, float %1) {
493; CHECK-LABEL: select_mimm_float:
494; CHECK:       # %bb.0:
495; CHECK-NEXT:    cmov.w.eq %s1, (2)1, %s0
496; CHECK-NEXT:    or %s0, 0, %s1
497; CHECK-NEXT:    b.l.t (, %s10)
498  %3 = select i1 %0, float %1, float -2.000000e+00
499  ret float %3
500}
501
502; Function Attrs: norecurse nounwind readnone
503define double @select_mimm_double(i1 zeroext %0, double %1) {
504; CHECK-LABEL: select_mimm_double:
505; CHECK:       # %bb.0:
506; CHECK-NEXT:    cmov.w.eq %s1, (2)1, %s0
507; CHECK-NEXT:    or %s0, 0, %s1
508; CHECK-NEXT:    b.l.t (, %s10)
509  %3 = select fast i1 %0, double %1, double -2.000000e+00
510  ret double %3
511}
512
513; Function Attrs: norecurse nounwind readnone
514define fp128 @select_mimm_quad(i1 zeroext %0, fp128 %1) {
515; CHECK-LABEL: select_mimm_quad:
516; CHECK:       # %bb.0:
517; CHECK-NEXT:    lea %s1, .LCPI{{[0-9]+}}_0@lo
518; CHECK-NEXT:    and %s1, %s1, (32)0
519; CHECK-NEXT:    lea.sl %s1, .LCPI{{[0-9]+}}_0@hi(, %s1)
520; CHECK-NEXT:    ld %s4, 8(, %s1)
521; CHECK-NEXT:    ld %s5, (, %s1)
522; CHECK-NEXT:    cmov.w.ne %s4, %s2, %s0
523; CHECK-NEXT:    cmov.w.ne %s5, %s3, %s0
524; CHECK-NEXT:    or %s0, 0, %s4
525; CHECK-NEXT:    or %s1, 0, %s5
526; CHECK-NEXT:    b.l.t (, %s10)
527  %3 = select fast i1 %0, fp128 %1, fp128 0xL0000000000000000C000000000000000
528  ret fp128 %3
529}
530