xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/cast.ll (revision b5600c6f85c6d1e30b1125e6f943b61f66d7fb9f)
1; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
2
3define signext i32 @i() {
4; CHECK-LABEL: i:
5; CHECK:       # %bb.0:
6; CHECK-NEXT:    lea %s0, -2147483648
7; CHECK-NEXT:    b.l.t (, %s10)
8  ret i32 -2147483648
9}
10
11define zeroext i32 @ui() {
12; CHECK-LABEL: ui:
13; CHECK:       # %bb.0:
14; CHECK-NEXT:    lea %s0, -2147483648
15; CHECK-NEXT:    and %s0, %s0, (32)0
16; CHECK-NEXT:    b.l.t (, %s10)
17  ret i32 -2147483648
18}
19
20define i64 @ll() {
21; CHECK-LABEL: ll:
22; CHECK:       # %bb.0:
23; CHECK-NEXT:    lea %s0, -2147483648
24; CHECK-NEXT:    b.l.t (, %s10)
25  ret i64 -2147483648
26}
27
28define i64 @ull() {
29; CHECK-LABEL: ull:
30; CHECK:       # %bb.0:
31; CHECK-NEXT:    lea %s0, -2147483648
32; CHECK-NEXT:    and %s0, %s0, (32)0
33; CHECK-NEXT:    b.l.t (, %s10)
34  ret i64 2147483648
35}
36
37define signext i8 @d2c(double %x) {
38; CHECK-LABEL: d2c:
39; CHECK:       # %bb.0:
40; CHECK-NEXT:    cvt.w.d.sx.rz %s0, %s0
41; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
42; CHECK-NEXT:    b.l.t (, %s10)
43  %r = fptosi double %x to i8
44  ret i8 %r
45}
46
47define zeroext i8 @d2uc(double %x) {
48; CHECK-LABEL: d2uc:
49; CHECK:       # %bb.0:
50; CHECK-NEXT:    cvt.w.d.sx.rz %s0, %s0
51; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
52; CHECK-NEXT:    b.l.t (, %s10)
53  %r = fptoui double %x to i8
54  ret i8 %r
55}
56
57define signext i16 @d2s(double %x) {
58; CHECK-LABEL: d2s:
59; CHECK:       # %bb.0:
60; CHECK-NEXT:    cvt.w.d.sx.rz %s0, %s0
61; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
62; CHECK-NEXT:    b.l.t (, %s10)
63  %r = fptosi double %x to i16
64  ret i16 %r
65}
66
67define zeroext i16 @d2us(double %x) {
68; CHECK-LABEL: d2us:
69; CHECK:       # %bb.0:
70; CHECK-NEXT:    cvt.w.d.sx.rz %s0, %s0
71; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
72; CHECK-NEXT:    b.l.t (, %s10)
73  %r = fptoui double %x to i16
74  ret i16 %r
75}
76
77define signext i32 @d2i(double %x) {
78; CHECK-LABEL: d2i:
79; CHECK:       # %bb.0:
80; CHECK-NEXT:    cvt.w.d.sx.rz %s0, %s0
81; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
82; CHECK-NEXT:    b.l.t (, %s10)
83  %r = fptosi double %x to i32
84  ret i32 %r
85}
86
87define zeroext i32 @d2ui(double %x) {
88; CHECK-LABEL: d2ui:
89; CHECK:       # %bb.0:
90; CHECK-NEXT:    cvt.l.d.rz %s0, %s0
91; CHECK-NEXT:    and %s0, %s0, (32)0
92; CHECK-NEXT:    b.l.t (, %s10)
93  %r = fptoui double %x to i32
94  ret i32 %r
95}
96
97define i64 @d2ll(double %x) {
98; CHECK-LABEL: d2ll:
99; CHECK:       # %bb.0:
100; CHECK-NEXT:    cvt.l.d.rz %s0, %s0
101; CHECK-NEXT:    b.l.t (, %s10)
102  %r = fptosi double %x to i64
103  ret i64 %r
104}
105
106define i64 @d2ull(double %x) {
107; CHECK-LABEL: d2ull:
108; CHECK:       # %bb.0:
109; CHECK-NEXT:    lea.sl %s1, 1138753536
110; CHECK-NEXT:    fcmp.d %s2, %s0, %s1
111; CHECK-NEXT:    fsub.d %s1, %s0, %s1
112; CHECK-NEXT:    cvt.l.d.rz %s1, %s1
113; CHECK-NEXT:    xor %s1, %s1, (1)1
114; CHECK-NEXT:    cvt.l.d.rz %s0, %s0
115; CHECK-NEXT:    cmov.d.lt %s1, %s0, %s2
116; CHECK-NEXT:    or %s0, 0, %s1
117; CHECK-NEXT:    b.l.t (, %s10)
118  %r = fptoui double %x to i64
119  ret i64 %r
120}
121
122define float @d2f(double %x) {
123; CHECK-LABEL: d2f:
124; CHECK:       # %bb.0:
125; CHECK-NEXT:    cvt.s.d %s0, %s0
126; CHECK-NEXT:    b.l.t (, %s10)
127  %r = fptrunc double %x to float
128  ret float %r
129}
130
131define double @d2d(double returned %0) {
132; CHECK-LABEL: d2d:
133; CHECK:       # %bb.0:
134; CHECK-NEXT:    b.l.t (, %s10)
135  ret double %0
136}
137
138define fp128 @d2q(double) {
139; CHECK-LABEL: d2q:
140; CHECK:       # %bb.0:
141; CHECK-NEXT:    cvt.q.d %s0, %s0
142; CHECK-NEXT:    b.l.t (, %s10)
143  %2 = fpext double %0 to fp128
144  ret fp128 %2
145}
146
147define signext i8 @q2c(fp128) {
148; CHECK-LABEL: q2c:
149; CHECK:       # %bb.0:
150; CHECK-NEXT:    cvt.d.q %s0, %s0
151; CHECK-NEXT:    cvt.w.d.sx.rz %s0, %s0
152; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
153; CHECK-NEXT:    b.l.t (, %s10)
154  %2 = fptosi fp128 %0 to i8
155  ret i8 %2
156}
157
158define zeroext i8 @q2uc(fp128) {
159; CHECK-LABEL: q2uc:
160; CHECK:       # %bb.0:
161; CHECK-NEXT:    cvt.d.q %s0, %s0
162; CHECK-NEXT:    cvt.w.d.sx.rz %s0, %s0
163; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
164; CHECK-NEXT:    b.l.t (, %s10)
165  %2 = fptoui fp128 %0 to i8
166  ret i8 %2
167}
168
169define signext i16 @q2s(fp128) {
170; CHECK-LABEL: q2s:
171; CHECK:       # %bb.0:
172; CHECK-NEXT:    cvt.d.q %s0, %s0
173; CHECK-NEXT:    cvt.w.d.sx.rz %s0, %s0
174; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
175; CHECK-NEXT:    b.l.t (, %s10)
176  %2 = fptosi fp128 %0 to i16
177  ret i16 %2
178}
179
180define zeroext i16 @q2us(fp128) {
181; CHECK-LABEL: q2us:
182; CHECK:       # %bb.0:
183; CHECK-NEXT:    cvt.d.q %s0, %s0
184; CHECK-NEXT:    cvt.w.d.sx.rz %s0, %s0
185; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
186; CHECK-NEXT:    b.l.t (, %s10)
187  %2 = fptoui fp128 %0 to i16
188  ret i16 %2
189}
190
191define signext i32 @q2i(fp128) {
192; CHECK-LABEL: q2i:
193; CHECK:       # %bb.0:
194; CHECK-NEXT:    cvt.d.q %s0, %s0
195; CHECK-NEXT:    cvt.w.d.sx.rz %s0, %s0
196; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
197; CHECK-NEXT:    b.l.t (, %s10)
198  %2 = fptosi fp128 %0 to i32
199  ret i32 %2
200}
201
202define zeroext i32 @q2ui(fp128) {
203; CHECK-LABEL: q2ui:
204; CHECK:       # %bb.0:
205; CHECK-NEXT:    cvt.d.q %s0, %s0
206; CHECK-NEXT:    cvt.l.d.rz %s0, %s0
207; CHECK-NEXT:    and %s0, %s0, (32)0
208; CHECK-NEXT:    b.l.t (, %s10)
209  %2 = fptoui fp128 %0 to i32
210  ret i32 %2
211}
212
213define i64 @q2ll(fp128) {
214; CHECK-LABEL: q2ll:
215; CHECK:       # %bb.0:
216; CHECK-NEXT:    cvt.d.q %s0, %s0
217; CHECK-NEXT:    cvt.l.d.rz %s0, %s0
218; CHECK-NEXT:    b.l.t (, %s10)
219  %2 = fptosi fp128 %0 to i64
220  ret i64 %2
221}
222
223define i64 @q2ull(fp128) {
224; CHECK-LABEL: q2ull:
225; CHECK:       # %bb.0:
226; CHECK-NEXT:    lea %s2, .LCPI{{[0-9]+}}_0@lo
227; CHECK-NEXT:    and %s2, %s2, (32)0
228; CHECK-NEXT:    lea.sl %s2, .LCPI{{[0-9]+}}_0@hi(, %s2)
229; CHECK-NEXT:    ld %s4, 8(, %s2)
230; CHECK-NEXT:    ld %s5, (, %s2)
231; CHECK-NEXT:    fcmp.q %s3, %s0, %s4
232; CHECK-NEXT:    fsub.q %s4, %s0, %s4
233; CHECK-NEXT:    cvt.d.q %s2, %s4
234; CHECK-NEXT:    cvt.l.d.rz %s2, %s2
235; CHECK-NEXT:    xor %s2, %s2, (1)1
236; CHECK-NEXT:    cvt.d.q %s0, %s0
237; CHECK-NEXT:    cvt.l.d.rz %s0, %s0
238; CHECK-NEXT:    cmov.d.lt %s2, %s0, %s3
239; CHECK-NEXT:    or %s0, 0, %s2
240; CHECK-NEXT:    b.l.t (, %s10)
241  %2 = fptoui fp128 %0 to i64
242  ret i64 %2
243}
244
245define float @q2f(fp128) {
246; CHECK-LABEL: q2f:
247; CHECK:       # %bb.0:
248; CHECK-NEXT:    cvt.s.q %s0, %s0
249; CHECK-NEXT:    b.l.t (, %s10)
250  %2 = fptrunc fp128 %0 to float
251  ret float %2
252}
253
254define double @q2d(fp128) {
255; CHECK-LABEL: q2d:
256; CHECK:       # %bb.0:
257; CHECK-NEXT:    cvt.d.q %s0, %s0
258; CHECK-NEXT:    b.l.t (, %s10)
259  %2 = fptrunc fp128 %0 to double
260  ret double %2
261}
262
263define fp128 @q2q(fp128 returned) {
264; CHECK-LABEL: q2q:
265; CHECK:       # %bb.0:
266; CHECK-NEXT:    b.l.t (, %s10)
267  ret fp128 %0
268}
269
270define signext i8 @f2c(float %x) {
271; CHECK-LABEL: f2c:
272; CHECK:       # %bb.0:
273; CHECK-NEXT:    cvt.w.s.sx.rz %s0, %s0
274; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
275; CHECK-NEXT:    b.l.t (, %s10)
276  %r = fptosi float %x to i8
277  ret i8 %r
278}
279
280define zeroext i8 @f2uc(float %x) {
281; CHECK-LABEL: f2uc:
282; CHECK:       # %bb.0:
283; CHECK-NEXT:    cvt.w.s.sx.rz %s0, %s0
284; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
285; CHECK-NEXT:    b.l.t (, %s10)
286  %r = fptoui float %x to i8
287  ret i8 %r
288}
289
290define signext i16 @f2s(float %x) {
291; CHECK-LABEL: f2s:
292; CHECK:       # %bb.0:
293; CHECK-NEXT:    cvt.w.s.sx.rz %s0, %s0
294; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
295; CHECK-NEXT:    b.l.t (, %s10)
296  %r = fptosi float %x to i16
297  ret i16 %r
298}
299
300define zeroext i16 @f2us(float %x) {
301; CHECK-LABEL: f2us:
302; CHECK:       # %bb.0:
303; CHECK-NEXT:    cvt.w.s.sx.rz %s0, %s0
304; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
305; CHECK-NEXT:    b.l.t (, %s10)
306  %r = fptoui float %x to i16
307  ret i16 %r
308}
309
310define signext i32 @f2i(float %x) {
311; CHECK-LABEL: f2i:
312; CHECK:       # %bb.0:
313; CHECK-NEXT:    cvt.w.s.sx.rz %s0, %s0
314; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
315; CHECK-NEXT:    b.l.t (, %s10)
316  %r = fptosi float %x to i32
317  ret i32 %r
318}
319
320define zeroext i32 @f2ui(float %x) {
321; CHECK-LABEL: f2ui:
322; CHECK:       # %bb.0:
323; CHECK-NEXT:    cvt.d.s %s0, %s0
324; CHECK-NEXT:    cvt.l.d.rz %s0, %s0
325; CHECK-NEXT:    and %s0, %s0, (32)0
326; CHECK-NEXT:    b.l.t (, %s10)
327  %r = fptoui float %x to i32
328  ret i32 %r
329}
330
331define i64 @f2ll(float %x) {
332; CHECK-LABEL: f2ll:
333; CHECK:       # %bb.0:
334; CHECK-NEXT:    cvt.d.s %s0, %s0
335; CHECK-NEXT:    cvt.l.d.rz %s0, %s0
336; CHECK-NEXT:    b.l.t (, %s10)
337  %r = fptosi float %x to i64
338  ret i64 %r
339}
340
341define i64 @f2ull(float %x) {
342; CHECK-LABEL: f2ull:
343; CHECK:       # %bb.0:
344; CHECK-NEXT:    lea.sl %s1, 1593835520
345; CHECK-NEXT:    fcmp.s %s2, %s0, %s1
346; CHECK-NEXT:    fsub.s %s1, %s0, %s1
347; CHECK-NEXT:    cvt.d.s %s1, %s1
348; CHECK-NEXT:    cvt.l.d.rz %s1, %s1
349; CHECK-NEXT:    xor %s1, %s1, (1)1
350; CHECK-NEXT:    cvt.d.s %s0, %s0
351; CHECK-NEXT:    cvt.l.d.rz %s0, %s0
352; CHECK-NEXT:    cmov.s.lt %s1, %s0, %s2
353; CHECK-NEXT:    or %s0, 0, %s1
354; CHECK-NEXT:    b.l.t (, %s10)
355  %r = fptoui float %x to i64
356  ret i64 %r
357}
358
359define float @f2f(float returned %0) {
360; CHECK-LABEL: f2f:
361; CHECK:       # %bb.0:
362; CHECK-NEXT:    b.l.t (, %s10)
363  ret float %0
364}
365
366define double @f2d(float %x) {
367; CHECK-LABEL: f2d:
368; CHECK:       # %bb.0:
369; CHECK-NEXT:    cvt.d.s %s0, %s0
370; CHECK-NEXT:    b.l.t (, %s10)
371  %r = fpext float %x to double
372  ret double %r
373}
374
375define fp128 @f2q(float) {
376; CHECK-LABEL: f2q:
377; CHECK:       # %bb.0:
378; CHECK-NEXT:    cvt.q.s %s0, %s0
379; CHECK-NEXT:    b.l.t (, %s10)
380  %2 = fpext float %0 to fp128
381  ret fp128 %2
382}
383
384define signext i8 @ll2c(i64 %0) {
385; CHECK-LABEL: ll2c:
386; CHECK:       # %bb.0:
387; CHECK-NEXT:    sll %s0, %s0, 56
388; CHECK-NEXT:    sra.l %s0, %s0, 56
389; CHECK-NEXT:    b.l.t (, %s10)
390  %2 = trunc i64 %0 to i8
391  ret i8 %2
392}
393
394define zeroext i8 @ll2uc(i64 %0) {
395; CHECK-LABEL: ll2uc:
396; CHECK:       # %bb.0:
397; CHECK-NEXT:    and %s0, %s0, (56)0
398; CHECK-NEXT:    b.l.t (, %s10)
399  %2 = trunc i64 %0 to i8
400  ret i8 %2
401}
402
403define signext i16 @ll2s(i64 %0) {
404; CHECK-LABEL: ll2s:
405; CHECK:       # %bb.0:
406; CHECK-NEXT:    sll %s0, %s0, 48
407; CHECK-NEXT:    sra.l %s0, %s0, 48
408; CHECK-NEXT:    b.l.t (, %s10)
409  %2 = trunc i64 %0 to i16
410  ret i16 %2
411}
412
413define zeroext i16 @ll2us(i64 %0) {
414; CHECK-LABEL: ll2us:
415; CHECK:       # %bb.0:
416; CHECK-NEXT:    and %s0, %s0, (48)0
417; CHECK-NEXT:    b.l.t (, %s10)
418  %2 = trunc i64 %0 to i16
419  ret i16 %2
420}
421
422define signext i32 @ll2i(i64 %0) {
423; CHECK-LABEL: ll2i:
424; CHECK:       # %bb.0:
425; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
426; CHECK-NEXT:    b.l.t (, %s10)
427  %2 = trunc i64 %0 to i32
428  ret i32 %2
429}
430
431define zeroext i32 @ll2ui(i64 %0) {
432; CHECK-LABEL: ll2ui:
433; CHECK:       # %bb.0:
434; CHECK-NEXT:    and %s0, %s0, (32)0
435; CHECK-NEXT:    b.l.t (, %s10)
436  %2 = trunc i64 %0 to i32
437  ret i32 %2
438}
439
440define i64 @ll2ll(i64 returned %0) {
441; CHECK-LABEL: ll2ll:
442; CHECK:       # %bb.0:
443; CHECK-NEXT:    b.l.t (, %s10)
444  ret i64 %0
445}
446
447define i64 @ll2ull(i64 returned %0) {
448; CHECK-LABEL: ll2ull:
449; CHECK:       # %bb.0:
450; CHECK-NEXT:    b.l.t (, %s10)
451  ret i64 %0
452}
453
454define float @ll2f(i64 %x) {
455; CHECK-LABEL: ll2f:
456; CHECK:       # %bb.0:
457; CHECK-NEXT:    cvt.d.l %s0, %s0
458; CHECK-NEXT:    cvt.s.d %s0, %s0
459; CHECK-NEXT:    b.l.t (, %s10)
460  %r = sitofp i64 %x to float
461  ret float %r
462}
463
464define double @ll2d(i64 %x) {
465; CHECK-LABEL: ll2d:
466; CHECK:       # %bb.0:
467; CHECK-NEXT:    cvt.d.l %s0, %s0
468; CHECK-NEXT:    b.l.t (, %s10)
469  %r = sitofp i64 %x to double
470  ret double %r
471}
472
473define fp128 @ll2q(i64) {
474; CHECK-LABEL: ll2q:
475; CHECK:       # %bb.0:
476; CHECK-NEXT:    cvt.d.l %s0, %s0
477; CHECK-NEXT:    cvt.q.d %s0, %s0
478; CHECK-NEXT:    b.l.t (, %s10)
479  %2 = sitofp i64 %0 to fp128
480  ret fp128 %2
481}
482
483define signext i8 @ull2c(i64 %0) {
484; CHECK-LABEL: ull2c:
485; CHECK:       # %bb.0:
486; CHECK-NEXT:    sll %s0, %s0, 56
487; CHECK-NEXT:    sra.l %s0, %s0, 56
488; CHECK-NEXT:    b.l.t (, %s10)
489  %2 = trunc i64 %0 to i8
490  ret i8 %2
491}
492
493define zeroext i8 @ull2uc(i64 %0) {
494; CHECK-LABEL: ull2uc:
495; CHECK:       # %bb.0:
496; CHECK-NEXT:    and %s0, %s0, (56)0
497; CHECK-NEXT:    b.l.t (, %s10)
498  %2 = trunc i64 %0 to i8
499  ret i8 %2
500}
501
502define signext i16 @ull2s(i64 %0) {
503; CHECK-LABEL: ull2s:
504; CHECK:       # %bb.0:
505; CHECK-NEXT:    sll %s0, %s0, 48
506; CHECK-NEXT:    sra.l %s0, %s0, 48
507; CHECK-NEXT:    b.l.t (, %s10)
508  %2 = trunc i64 %0 to i16
509  ret i16 %2
510}
511
512define zeroext i16 @ull2us(i64 %0) {
513; CHECK-LABEL: ull2us:
514; CHECK:       # %bb.0:
515; CHECK-NEXT:    and %s0, %s0, (48)0
516; CHECK-NEXT:    b.l.t (, %s10)
517  %2 = trunc i64 %0 to i16
518  ret i16 %2
519}
520
521define signext i32 @ull2i(i64 %0) {
522; CHECK-LABEL: ull2i:
523; CHECK:       # %bb.0:
524; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
525; CHECK-NEXT:    b.l.t (, %s10)
526  %2 = trunc i64 %0 to i32
527  ret i32 %2
528}
529
530define zeroext i32 @ull2ui(i64 %0) {
531; CHECK-LABEL: ull2ui:
532; CHECK:       # %bb.0:
533; CHECK-NEXT:    and %s0, %s0, (32)0
534; CHECK-NEXT:    b.l.t (, %s10)
535  %2 = trunc i64 %0 to i32
536  ret i32 %2
537}
538
539define i64 @ull2ll(i64 returned %0) {
540; CHECK-LABEL: ull2ll:
541; CHECK:       # %bb.0:
542; CHECK-NEXT:    b.l.t (, %s10)
543  ret i64 %0
544}
545
546define i64 @ull2ull(i64 returned %0) {
547; CHECK-LABEL: ull2ull:
548; CHECK:       # %bb.0:
549; CHECK-NEXT:    b.l.t (, %s10)
550  ret i64 %0
551}
552
553define float @ull2f(i64 %x) {
554; CHECK-LABEL: ull2f:
555; CHECK:       # %bb.0:
556; CHECK-NEXT:    cvt.d.l %s1, %s0
557; CHECK-NEXT:    cvt.s.d %s1, %s1
558; CHECK-NEXT:    srl %s2, %s0, 1
559; CHECK-NEXT:    and %s3, 1, %s0
560; CHECK-NEXT:    or %s2, %s3, %s2
561; CHECK-NEXT:    cvt.d.l %s2, %s2
562; CHECK-NEXT:    cvt.s.d %s2, %s2
563; CHECK-NEXT:    fadd.s %s2, %s2, %s2
564; CHECK-NEXT:    cmov.l.lt %s1, %s2, %s0
565; CHECK-NEXT:    or %s0, 0, %s1
566; CHECK-NEXT:    b.l.t (, %s10)
567  %r = uitofp i64 %x to float
568  ret float %r
569}
570
571define float @ull2f_nneg(i64 %x) {
572; CHECK-LABEL: ull2f_nneg:
573; CHECK:       # %bb.0:
574; CHECK-NEXT:    cvt.d.l %s0, %s0
575; CHECK-NEXT:    cvt.s.d %s0, %s0
576; CHECK-NEXT:    b.l.t (, %s10)
577  %r = uitofp nneg i64 %x to float
578  ret float %r
579}
580
581define float @ull2f_strict(i32 %x) {
582; CHECK-LABEL: ull2f_strict:
583; CHECK:     # %bb.0:
584; CHECK-NEXT:	adds.l %s11, -16, %s11
585; CHECK-NEXT:		brge.l.t %s11, %s8, .LBB58_2
586; CHECK-NEXT:	# %bb.1:
587; CHECK-NEXT:		ld %s61, 24(, %s14)
588; CHECK-NEXT:		or %s62, 0, %s0
589; CHECK-NEXT:		lea %s63, 315
590; CHECK-NEXT:		shm.l %s63, (%s61)
591; CHECK-NEXT:		shm.l %s8, 8(%s61)
592; CHECK-NEXT:		shm.l %s11, 16(%s61)
593; CHECK-NEXT:		monc
594; CHECK-NEXT:		or %s0, 0, %s62
595; CHECK-NEXT:	.LBB58_2:
596; CHECK-NEXT:		lea %s1, 1127219200
597; CHECK-NEXT:		stl %s1, 12(, %s11)
598; CHECK-NEXT:		stl %s0, 8(, %s11)
599; CHECK-NEXT:		ld %s0, 8(, %s11)
600; CHECK-NEXT:		lea.sl %s1, 1127219200
601; CHECK-NEXT:		fsub.d %s0, %s0, %s1
602; CHECK-NEXT:		cvt.s.d %s0, %s0
603; CHECK-NEXT:		adds.l %s11, 16, %s11
604; CHECK-NEXT:		b.l.t (, %s10)
605  %val = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %x, metadata !"round.tonearest", metadata !"fpexcept.strict")
606  ret float %val
607}
608
609define double @ull2d(i64 %x) {
610; CHECK-LABEL: ull2d:
611; CHECK:       # %bb.0:
612; CHECK-NEXT:    srl %s1, %s0, 32
613; CHECK-NEXT:    lea.sl %s2, 1160773632
614; CHECK-NEXT:    or %s1, %s1, %s2
615; CHECK-NEXT:    lea %s2, 1048576
616; CHECK-NEXT:    lea.sl %s2, -986710016(, %s2)
617; CHECK-NEXT:    fadd.d %s1, %s1, %s2
618; CHECK-NEXT:    and %s0, %s0, (32)0
619; CHECK-NEXT:    lea.sl %s2, 1127219200
620; CHECK-NEXT:    or %s0, %s0, %s2
621; CHECK-NEXT:    fadd.d %s0, %s0, %s1
622; CHECK-NEXT:    b.l.t (, %s10)
623  %r = uitofp i64 %x to double
624  ret double %r
625}
626
627define fp128 @ull2q(i64) {
628; CHECK-LABEL: ull2q:
629; CHECK:       # %bb.0:
630; CHECK-NEXT:    srl %s1, %s0, 61
631; CHECK-NEXT:    and %s1, 4, %s1
632; CHECK-NEXT:    lea %s2, .LCPI{{[0-9]+}}_0@lo
633; CHECK-NEXT:    and %s2, %s2, (32)0
634; CHECK-NEXT:    lea.sl %s2, .LCPI{{[0-9]+}}_0@hi(, %s2)
635; CHECK-NEXT:    ldu %s1, (%s1, %s2)
636; CHECK-NEXT:    cvt.q.s %s2, %s1
637; CHECK-NEXT:    cvt.d.l %s0, %s0
638; CHECK-NEXT:    cvt.q.d %s0, %s0
639; CHECK-NEXT:    fadd.q %s0, %s0, %s2
640; CHECK-NEXT:    b.l.t (, %s10)
641  %2 = uitofp i64 %0 to fp128
642  ret fp128 %2
643}
644
645define signext i8 @i2c(i32 signext %0) {
646; CHECK-LABEL: i2c:
647; CHECK:       # %bb.0:
648; CHECK-NEXT:    sll %s0, %s0, 56
649; CHECK-NEXT:    sra.l %s0, %s0, 56
650; CHECK-NEXT:    b.l.t (, %s10)
651  %2 = trunc i32 %0 to i8
652  ret i8 %2
653}
654
655define zeroext i8 @i2uc(i32 signext %0) {
656; CHECK-LABEL: i2uc:
657; CHECK:       # %bb.0:
658; CHECK-NEXT:    and %s0, %s0, (56)0
659; CHECK-NEXT:    b.l.t (, %s10)
660  %2 = trunc i32 %0 to i8
661  ret i8 %2
662}
663
664define signext i16 @i2s(i32 signext %0) {
665; CHECK-LABEL: i2s:
666; CHECK:       # %bb.0:
667; CHECK-NEXT:    sll %s0, %s0, 48
668; CHECK-NEXT:    sra.l %s0, %s0, 48
669; CHECK-NEXT:    b.l.t (, %s10)
670  %2 = trunc i32 %0 to i16
671  ret i16 %2
672}
673
674define zeroext i16 @i2us(i32 signext %0) {
675; CHECK-LABEL: i2us:
676; CHECK:       # %bb.0:
677; CHECK-NEXT:    and %s0, %s0, (48)0
678; CHECK-NEXT:    b.l.t (, %s10)
679  %2 = trunc i32 %0 to i16
680  ret i16 %2
681}
682
683define signext i32 @i2i(i32 signext returned %0) {
684; CHECK-LABEL: i2i:
685; CHECK:       # %bb.0:
686; CHECK-NEXT:    b.l.t (, %s10)
687  ret i32 %0
688}
689
690define zeroext i32 @i2ui(i32 signext returned %0) {
691; CHECK-LABEL: i2ui:
692; CHECK:       # %bb.0:
693; CHECK-NEXT:    and %s0, %s0, (32)0
694; CHECK-NEXT:    b.l.t (, %s10)
695  ret i32 %0
696}
697
698define i64 @i2ll(i32 signext %0) {
699; CHECK-LABEL: i2ll:
700; CHECK:       # %bb.0:
701; CHECK-NEXT:    b.l.t (, %s10)
702  %2 = sext i32 %0 to i64
703  ret i64 %2
704}
705
706define i64 @i2ull(i32 signext %0) {
707; CHECK-LABEL: i2ull:
708; CHECK:       # %bb.0:
709; CHECK-NEXT:    b.l.t (, %s10)
710  %2 = sext i32 %0 to i64
711  ret i64 %2
712}
713
714define float @i2f(i32 signext %x) {
715; CHECK-LABEL: i2f:
716; CHECK:       # %bb.0:
717; CHECK-NEXT:    cvt.s.w %s0, %s0
718; CHECK-NEXT:    b.l.t (, %s10)
719  %r = sitofp i32 %x to float
720  ret float %r
721}
722
723define double @i2d(i32 signext %x) {
724; CHECK-LABEL: i2d:
725; CHECK:       # %bb.0:
726; CHECK-NEXT:    cvt.d.w %s0, %s0
727; CHECK-NEXT:    b.l.t (, %s10)
728  %r = sitofp i32 %x to double
729  ret double %r
730}
731
732define fp128 @i2q(i32 signext %x) {
733; CHECK-LABEL: i2q:
734; CHECK:       # %bb.0:
735; CHECK-NEXT:    cvt.d.w %s0, %s0
736; CHECK-NEXT:    cvt.q.d %s0, %s0
737; CHECK-NEXT:    b.l.t (, %s10)
738  %r = sitofp i32 %x to fp128
739  ret fp128 %r
740}
741
742define signext i8 @ui2c(i32 zeroext %0) {
743; CHECK-LABEL: ui2c:
744; CHECK:       # %bb.0:
745; CHECK-NEXT:    sll %s0, %s0, 56
746; CHECK-NEXT:    sra.l %s0, %s0, 56
747; CHECK-NEXT:    b.l.t (, %s10)
748  %2 = trunc i32 %0 to i8
749  ret i8 %2
750}
751
752define zeroext i8 @ui2uc(i32 zeroext %0) {
753; CHECK-LABEL: ui2uc:
754; CHECK:       # %bb.0:
755; CHECK-NEXT:    and %s0, %s0, (56)0
756; CHECK-NEXT:    b.l.t (, %s10)
757  %2 = trunc i32 %0 to i8
758  ret i8 %2
759}
760
761define signext i16 @ui2s(i32 zeroext %0) {
762; CHECK-LABEL: ui2s:
763; CHECK:       # %bb.0:
764; CHECK-NEXT:    sll %s0, %s0, 48
765; CHECK-NEXT:    sra.l %s0, %s0, 48
766; CHECK-NEXT:    b.l.t (, %s10)
767  %2 = trunc i32 %0 to i16
768  ret i16 %2
769}
770
771define zeroext i16 @ui2us(i32 zeroext %0) {
772; CHECK-LABEL: ui2us:
773; CHECK:       # %bb.0:
774; CHECK-NEXT:    and %s0, %s0, (48)0
775; CHECK-NEXT:    b.l.t (, %s10)
776  %2 = trunc i32 %0 to i16
777  ret i16 %2
778}
779
780define signext i32 @ui2i(i32 zeroext returned %0) {
781; CHECK-LABEL: ui2i:
782; CHECK:       # %bb.0:
783; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
784; CHECK-NEXT:    b.l.t (, %s10)
785  ret i32 %0
786}
787
788define zeroext i32 @ui2ui(i32 zeroext returned %0) {
789; CHECK-LABEL: ui2ui:
790; CHECK:       # %bb.0:
791; CHECK-NEXT:    b.l.t (, %s10)
792  ret i32 %0
793}
794
795define i64 @ui2ll(i32 zeroext %0) {
796; CHECK-LABEL: ui2ll:
797; CHECK:       # %bb.0:
798; CHECK-NEXT:    b.l.t (, %s10)
799  %2 = zext i32 %0 to i64
800  ret i64 %2
801}
802
803define i64 @ui2ull(i32 zeroext %0) {
804; CHECK-LABEL: ui2ull:
805; CHECK:       # %bb.0:
806; CHECK-NEXT:    b.l.t (, %s10)
807  %2 = zext i32 %0 to i64
808  ret i64 %2
809}
810
811define float @ui2f(i32 zeroext %x) {
812; CHECK-LABEL: ui2f:
813; CHECK:       # %bb.0:
814; CHECK-NEXT:    cvt.d.l %s0, %s0
815; CHECK-NEXT:    cvt.s.d %s0, %s0
816; CHECK-NEXT:    b.l.t (, %s10)
817  %r = uitofp i32 %x to float
818  ret float %r
819}
820
821define double @ui2d(i32 zeroext %x) {
822; CHECK-LABEL: ui2d:
823; CHECK:       # %bb.0:
824; CHECK-NEXT:    cvt.d.l %s0, %s0
825; CHECK-NEXT:    b.l.t (, %s10)
826  %r = uitofp i32 %x to double
827  ret double %r
828}
829
830define fp128 @ui2q(i32 zeroext %0) {
831; CHECK-LABEL: ui2q:
832; CHECK:       # %bb.0:
833; CHECK-NEXT:    cvt.d.l %s0, %s0
834; CHECK-NEXT:    cvt.q.d %s0, %s0
835; CHECK-NEXT:    b.l.t (, %s10)
836  %2 = uitofp i32 %0 to fp128
837  ret fp128 %2
838}
839
840define signext i8 @s2c(i16 signext %0) {
841; CHECK-LABEL: s2c:
842; CHECK:       # %bb.0:
843; CHECK-NEXT:    sll %s0, %s0, 56
844; CHECK-NEXT:    sra.l %s0, %s0, 56
845; CHECK-NEXT:    b.l.t (, %s10)
846  %2 = trunc i16 %0 to i8
847  ret i8 %2
848}
849
850define zeroext i8 @s2uc(i16 signext %0) {
851; CHECK-LABEL: s2uc:
852; CHECK:       # %bb.0:
853; CHECK-NEXT:    and %s0, %s0, (56)0
854; CHECK-NEXT:    b.l.t (, %s10)
855  %2 = trunc i16 %0 to i8
856  ret i8 %2
857}
858
859define signext i16 @s2s(i16 returned signext %0) {
860; CHECK-LABEL: s2s:
861; CHECK:       # %bb.0:
862; CHECK-NEXT:    b.l.t (, %s10)
863  ret i16 %0
864}
865
866define zeroext i16 @s2us(i16 returned signext %0) {
867; CHECK-LABEL: s2us:
868; CHECK:       # %bb.0:
869; CHECK-NEXT:    and %s0, %s0, (48)0
870; CHECK-NEXT:    b.l.t (, %s10)
871  ret i16 %0
872}
873
874define signext i32 @s2i(i16 signext %0) {
875; CHECK-LABEL: s2i:
876; CHECK:       # %bb.0:
877; CHECK-NEXT:    b.l.t (, %s10)
878  %2 = sext i16 %0 to i32
879  ret i32 %2
880}
881
882define zeroext i32 @s2ui(i16 signext %0) {
883; CHECK-LABEL: s2ui:
884; CHECK:       # %bb.0:
885; CHECK-NEXT:    and %s0, %s0, (32)0
886; CHECK-NEXT:    b.l.t (, %s10)
887  %2 = sext i16 %0 to i32
888  ret i32 %2
889}
890
891define i64 @s2ll(i16 signext %0) {
892; CHECK-LABEL: s2ll:
893; CHECK:       # %bb.0:
894; CHECK-NEXT:    b.l.t (, %s10)
895  %2 = sext i16 %0 to i64
896  ret i64 %2
897}
898
899define i64 @s2ull(i16 signext %0) {
900; CHECK-LABEL: s2ull:
901; CHECK:       # %bb.0:
902; CHECK-NEXT:    b.l.t (, %s10)
903  %2 = sext i16 %0 to i64
904  ret i64 %2
905}
906
907define float @s2f(i16 signext %x) {
908; CHECK-LABEL: s2f:
909; CHECK:       # %bb.0:
910; CHECK-NEXT:    cvt.s.w %s0, %s0
911; CHECK-NEXT:    b.l.t (, %s10)
912  %r = sitofp i16 %x to float
913  ret float %r
914}
915
916define double @s2d(i16 signext %x) {
917; CHECK-LABEL: s2d:
918; CHECK:       # %bb.0:
919; CHECK-NEXT:    cvt.d.w %s0, %s0
920; CHECK-NEXT:    b.l.t (, %s10)
921  %r = sitofp i16 %x to double
922  ret double %r
923}
924
925define fp128 @s2q(i16 signext) {
926; CHECK-LABEL: s2q:
927; CHECK:       # %bb.0:
928; CHECK-NEXT:    cvt.d.w %s0, %s0
929; CHECK-NEXT:    cvt.q.d %s0, %s0
930; CHECK-NEXT:    b.l.t (, %s10)
931  %2 = sitofp i16 %0 to fp128
932  ret fp128 %2
933}
934
935define signext i8 @us2c(i16 zeroext %0) {
936; CHECK-LABEL: us2c:
937; CHECK:       # %bb.0:
938; CHECK-NEXT:    sll %s0, %s0, 56
939; CHECK-NEXT:    sra.l %s0, %s0, 56
940; CHECK-NEXT:    b.l.t (, %s10)
941  %2 = trunc i16 %0 to i8
942  ret i8 %2
943}
944
945define zeroext i8 @us2uc(i16 zeroext %0) {
946; CHECK-LABEL: us2uc:
947; CHECK:       # %bb.0:
948; CHECK-NEXT:    and %s0, %s0, (56)0
949; CHECK-NEXT:    b.l.t (, %s10)
950  %2 = trunc i16 %0 to i8
951  ret i8 %2
952}
953
954define signext i16 @us2s(i16 returned zeroext %0) {
955; CHECK-LABEL: us2s:
956; CHECK:       # %bb.0:
957; CHECK-NEXT:    sll %s0, %s0, 48
958; CHECK-NEXT:    sra.l %s0, %s0, 48
959; CHECK-NEXT:    b.l.t (, %s10)
960  ret i16 %0
961}
962
963define zeroext i16 @us2us(i16 returned zeroext %0) {
964; CHECK-LABEL: us2us:
965; CHECK:       # %bb.0:
966; CHECK-NEXT:    b.l.t (, %s10)
967  ret i16 %0
968}
969
970define signext i32 @us2i(i16 zeroext %0) {
971; CHECK-LABEL: us2i:
972; CHECK:       # %bb.0:
973; CHECK-NEXT:    b.l.t (, %s10)
974  %2 = zext i16 %0 to i32
975  ret i32 %2
976}
977
978define zeroext i32 @us2ui(i16 zeroext %0) {
979; CHECK-LABEL: us2ui:
980; CHECK:       # %bb.0:
981; CHECK-NEXT:    b.l.t (, %s10)
982  %2 = zext i16 %0 to i32
983  ret i32 %2
984}
985
986define i64 @us2ll(i16 zeroext %0) {
987; CHECK-LABEL: us2ll:
988; CHECK:       # %bb.0:
989; CHECK-NEXT:    b.l.t (, %s10)
990  %2 = zext i16 %0 to i64
991  ret i64 %2
992}
993
994define i64 @us2ull(i16 zeroext %0) {
995; CHECK-LABEL: us2ull:
996; CHECK:       # %bb.0:
997; CHECK-NEXT:    b.l.t (, %s10)
998  %2 = zext i16 %0 to i64
999  ret i64 %2
1000}
1001
1002define float @us2f(i16 zeroext %x) {
1003; CHECK-LABEL: us2f:
1004; CHECK:       # %bb.0:
1005; CHECK-NEXT:    cvt.s.w %s0, %s0
1006; CHECK-NEXT:    b.l.t (, %s10)
1007  %r = uitofp i16 %x to float
1008  ret float %r
1009}
1010
1011define double @us2d(i16 zeroext %x) {
1012; CHECK-LABEL: us2d:
1013; CHECK:       # %bb.0:
1014; CHECK-NEXT:    cvt.d.w %s0, %s0
1015; CHECK-NEXT:    b.l.t (, %s10)
1016  %r = uitofp i16 %x to double
1017  ret double %r
1018}
1019
1020define fp128 @us2q(i16 zeroext) {
1021; CHECK-LABEL: us2q:
1022; CHECK:       # %bb.0:
1023; CHECK-NEXT:    cvt.d.w %s0, %s0
1024; CHECK-NEXT:    cvt.q.d %s0, %s0
1025; CHECK-NEXT:    b.l.t (, %s10)
1026  %2 = uitofp i16 %0 to fp128
1027  ret fp128 %2
1028}
1029
1030define signext i8 @c2c(i8 returned signext %0) {
1031; CHECK-LABEL: c2c:
1032; CHECK:       # %bb.0:
1033; CHECK-NEXT:    b.l.t (, %s10)
1034  ret i8 %0
1035}
1036
1037define zeroext i8 @c2uc(i8 returned signext %0) {
1038; CHECK-LABEL: c2uc:
1039; CHECK:       # %bb.0:
1040; CHECK-NEXT:    and %s0, %s0, (56)0
1041; CHECK-NEXT:    b.l.t (, %s10)
1042  ret i8 %0
1043}
1044
1045define signext i16 @c2s(i8 signext %0) {
1046; CHECK-LABEL: c2s:
1047; CHECK:       # %bb.0:
1048; CHECK-NEXT:    b.l.t (, %s10)
1049  %2 = sext i8 %0 to i16
1050  ret i16 %2
1051}
1052
1053define zeroext i16 @c2us(i8 signext %0) {
1054; CHECK-LABEL: c2us:
1055; CHECK:       # %bb.0:
1056; CHECK-NEXT:    and %s0, %s0, (48)0
1057; CHECK-NEXT:    b.l.t (, %s10)
1058  %2 = sext i8 %0 to i16
1059  ret i16 %2
1060}
1061
1062define signext i32 @c2i(i8 signext %0) {
1063; CHECK-LABEL: c2i:
1064; CHECK:       # %bb.0:
1065; CHECK-NEXT:    b.l.t (, %s10)
1066  %2 = sext i8 %0 to i32
1067  ret i32 %2
1068}
1069
1070define zeroext i32 @c2ui(i8 signext %0) {
1071; CHECK-LABEL: c2ui:
1072; CHECK:       # %bb.0:
1073; CHECK-NEXT:    and %s0, %s0, (32)0
1074; CHECK-NEXT:    b.l.t (, %s10)
1075  %2 = sext i8 %0 to i32
1076  ret i32 %2
1077}
1078
1079define i64 @c2ll(i8 signext %0) {
1080; CHECK-LABEL: c2ll:
1081; CHECK:       # %bb.0:
1082; CHECK-NEXT:    b.l.t (, %s10)
1083  %2 = sext i8 %0 to i64
1084  ret i64 %2
1085}
1086
1087define i64 @c2ull(i8 signext %0) {
1088; CHECK-LABEL: c2ull:
1089; CHECK:       # %bb.0:
1090; CHECK-NEXT:    b.l.t (, %s10)
1091  %2 = sext i8 %0 to i64
1092  ret i64 %2
1093}
1094
1095define float @c2f(i8 signext %x) {
1096; CHECK-LABEL: c2f:
1097; CHECK:       # %bb.0:
1098; CHECK-NEXT:    cvt.s.w %s0, %s0
1099; CHECK-NEXT:    b.l.t (, %s10)
1100  %r = sitofp i8 %x to float
1101  ret float %r
1102}
1103
1104define double @c2d(i8 signext %x) {
1105; CHECK-LABEL: c2d:
1106; CHECK:       # %bb.0:
1107; CHECK-NEXT:    cvt.d.w %s0, %s0
1108; CHECK-NEXT:    b.l.t (, %s10)
1109  %r = sitofp i8 %x to double
1110  ret double %r
1111}
1112
1113define fp128 @c2q(i8 signext) {
1114; CHECK-LABEL: c2q:
1115; CHECK:       # %bb.0:
1116; CHECK-NEXT:    cvt.d.w %s0, %s0
1117; CHECK-NEXT:    cvt.q.d %s0, %s0
1118; CHECK-NEXT:    b.l.t (, %s10)
1119  %2 = sitofp i8 %0 to fp128
1120  ret fp128 %2
1121}
1122
1123define signext i8 @uc2c(i8 returned zeroext %0) {
1124; CHECK-LABEL: uc2c:
1125; CHECK:       # %bb.0:
1126; CHECK-NEXT:    sll %s0, %s0, 56
1127; CHECK-NEXT:    sra.l %s0, %s0, 56
1128; CHECK-NEXT:    b.l.t (, %s10)
1129  ret i8 %0
1130}
1131
1132define zeroext i8 @uc2uc(i8 returned zeroext %0) {
1133; CHECK-LABEL: uc2uc:
1134; CHECK:       # %bb.0:
1135; CHECK-NEXT:    b.l.t (, %s10)
1136  ret i8 %0
1137}
1138
1139define signext i16 @uc2s(i8 zeroext %0) {
1140; CHECK-LABEL: uc2s:
1141; CHECK:       # %bb.0:
1142; CHECK-NEXT:    b.l.t (, %s10)
1143  %2 = zext i8 %0 to i16
1144  ret i16 %2
1145}
1146
1147define zeroext i16 @uc2us(i8 zeroext %0) {
1148; CHECK-LABEL: uc2us:
1149; CHECK:       # %bb.0:
1150; CHECK-NEXT:    b.l.t (, %s10)
1151  %2 = zext i8 %0 to i16
1152  ret i16 %2
1153}
1154
1155define signext i32 @uc2i(i8 zeroext %0) {
1156; CHECK-LABEL: uc2i:
1157; CHECK:       # %bb.0:
1158; CHECK-NEXT:    b.l.t (, %s10)
1159  %2 = zext i8 %0 to i32
1160  ret i32 %2
1161}
1162
1163define zeroext i32 @uc2ui(i8 zeroext %0) {
1164; CHECK-LABEL: uc2ui:
1165; CHECK:       # %bb.0:
1166; CHECK-NEXT:    b.l.t (, %s10)
1167  %2 = zext i8 %0 to i32
1168  ret i32 %2
1169}
1170
1171define i64 @uc2ll(i8 zeroext %0) {
1172; CHECK-LABEL: uc2ll:
1173; CHECK:       # %bb.0:
1174; CHECK-NEXT:    b.l.t (, %s10)
1175  %2 = zext i8 %0 to i64
1176  ret i64 %2
1177}
1178
1179define i64 @uc2ull(i8 zeroext %0) {
1180; CHECK-LABEL: uc2ull:
1181; CHECK:       # %bb.0:
1182; CHECK-NEXT:    b.l.t (, %s10)
1183  %2 = zext i8 %0 to i64
1184  ret i64 %2
1185}
1186
1187define float @uc2f(i8 zeroext %x) {
1188; CHECK-LABEL: uc2f:
1189; CHECK:       # %bb.0:
1190; CHECK-NEXT:    cvt.s.w %s0, %s0
1191; CHECK-NEXT:    b.l.t (, %s10)
1192  %r = uitofp i8 %x to float
1193  ret float %r
1194}
1195
1196define double @uc2d(i8 zeroext %x) {
1197; CHECK-LABEL: uc2d:
1198; CHECK:       # %bb.0:
1199; CHECK-NEXT:    cvt.d.w %s0, %s0
1200; CHECK-NEXT:    b.l.t (, %s10)
1201  %r = uitofp i8 %x to double
1202  ret double %r
1203}
1204
1205define fp128 @uc2q(i8 zeroext) {
1206; CHECK-LABEL: uc2q:
1207; CHECK:       # %bb.0:
1208; CHECK-NEXT:    cvt.d.w %s0, %s0
1209; CHECK-NEXT:    cvt.q.d %s0, %s0
1210; CHECK-NEXT:    b.l.t (, %s10)
1211  %2 = uitofp i8 %0 to fp128
1212  ret fp128 %2
1213}
1214
1215; Function Attrs: norecurse nounwind readnone
1216define i128 @i128() {
1217; CHECK-LABEL: i128:
1218; CHECK:       # %bb.0:
1219; CHECK-NEXT:    lea %s0, -2147483648
1220; CHECK-NEXT:    or %s1, -1, (0)1
1221; CHECK-NEXT:    b.l.t (, %s10)
1222  ret i128 -2147483648
1223}
1224
1225; Function Attrs: norecurse nounwind readnone
1226define i128 @ui128() {
1227; CHECK-LABEL: ui128:
1228; CHECK:       # %bb.0:
1229; CHECK-NEXT:    lea %s0, -2147483648
1230; CHECK-NEXT:    or %s1, -1, (0)1
1231; CHECK-NEXT:    b.l.t (, %s10)
1232  ret i128 -2147483648
1233}
1234
1235; Function Attrs: norecurse nounwind readnone
1236define signext i8 @i1282c(i128 %0) {
1237; CHECK-LABEL: i1282c:
1238; CHECK:       # %bb.0:
1239; CHECK-NEXT:    sll %s0, %s0, 56
1240; CHECK-NEXT:    sra.l %s0, %s0, 56
1241; CHECK-NEXT:    b.l.t (, %s10)
1242  %2 = trunc i128 %0 to i8
1243  ret i8 %2
1244}
1245
1246; Function Attrs: norecurse nounwind readnone
1247define signext i8 @ui1282c(i128 %0) {
1248; CHECK-LABEL: ui1282c:
1249; CHECK:       # %bb.0:
1250; CHECK-NEXT:    sll %s0, %s0, 56
1251; CHECK-NEXT:    sra.l %s0, %s0, 56
1252; CHECK-NEXT:    b.l.t (, %s10)
1253  %2 = trunc i128 %0 to i8
1254  ret i8 %2
1255}
1256
1257; Function Attrs: norecurse nounwind readnone
1258define zeroext i8 @i1282uc(i128 %0) {
1259; CHECK-LABEL: i1282uc:
1260; CHECK:       # %bb.0:
1261; CHECK-NEXT:    and %s0, %s0, (56)0
1262; CHECK-NEXT:    b.l.t (, %s10)
1263  %2 = trunc i128 %0 to i8
1264  ret i8 %2
1265}
1266
1267; Function Attrs: norecurse nounwind readnone
1268define zeroext i8 @ui1282uc(i128 %0) {
1269; CHECK-LABEL: ui1282uc:
1270; CHECK:       # %bb.0:
1271; CHECK-NEXT:    and %s0, %s0, (56)0
1272; CHECK-NEXT:    b.l.t (, %s10)
1273  %2 = trunc i128 %0 to i8
1274  ret i8 %2
1275}
1276
1277; Function Attrs: norecurse nounwind readnone
1278define signext i16 @i1282s(i128 %0) {
1279; CHECK-LABEL: i1282s:
1280; CHECK:       # %bb.0:
1281; CHECK-NEXT:    sll %s0, %s0, 48
1282; CHECK-NEXT:    sra.l %s0, %s0, 48
1283; CHECK-NEXT:    b.l.t (, %s10)
1284  %2 = trunc i128 %0 to i16
1285  ret i16 %2
1286}
1287
1288; Function Attrs: norecurse nounwind readnone
1289define signext i16 @ui1282s(i128 %0) {
1290; CHECK-LABEL: ui1282s:
1291; CHECK:       # %bb.0:
1292; CHECK-NEXT:    sll %s0, %s0, 48
1293; CHECK-NEXT:    sra.l %s0, %s0, 48
1294; CHECK-NEXT:    b.l.t (, %s10)
1295  %2 = trunc i128 %0 to i16
1296  ret i16 %2
1297}
1298
1299; Function Attrs: norecurse nounwind readnone
1300define zeroext i16 @i1282us(i128 %0) {
1301; CHECK-LABEL: i1282us:
1302; CHECK:       # %bb.0:
1303; CHECK-NEXT:    and %s0, %s0, (48)0
1304; CHECK-NEXT:    b.l.t (, %s10)
1305  %2 = trunc i128 %0 to i16
1306  ret i16 %2
1307}
1308
1309; Function Attrs: norecurse nounwind readnone
1310define zeroext i16 @ui1282us(i128 %0) {
1311; CHECK-LABEL: ui1282us:
1312; CHECK:       # %bb.0:
1313; CHECK-NEXT:    and %s0, %s0, (48)0
1314; CHECK-NEXT:    b.l.t (, %s10)
1315  %2 = trunc i128 %0 to i16
1316  ret i16 %2
1317}
1318
1319; Function Attrs: norecurse nounwind readnone
1320define signext i32 @i1282i(i128 %0) {
1321; CHECK-LABEL: i1282i:
1322; CHECK:       # %bb.0:
1323; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
1324; CHECK-NEXT:    b.l.t (, %s10)
1325  %2 = trunc i128 %0 to i32
1326  ret i32 %2
1327}
1328
1329; Function Attrs: norecurse nounwind readnone
1330define signext i32 @ui1282i(i128 %0) {
1331; CHECK-LABEL: ui1282i:
1332; CHECK:       # %bb.0:
1333; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
1334; CHECK-NEXT:    b.l.t (, %s10)
1335  %2 = trunc i128 %0 to i32
1336  ret i32 %2
1337}
1338
1339; Function Attrs: norecurse nounwind readnone
1340define zeroext i32 @i1282ui(i128 %0) {
1341; CHECK-LABEL: i1282ui:
1342; CHECK:       # %bb.0:
1343; CHECK-NEXT:    and %s0, %s0, (32)0
1344; CHECK-NEXT:    b.l.t (, %s10)
1345  %2 = trunc i128 %0 to i32
1346  ret i32 %2
1347}
1348
1349; Function Attrs: norecurse nounwind readnone
1350define zeroext i32 @ui1282ui(i128 %0) {
1351; CHECK-LABEL: ui1282ui:
1352; CHECK:       # %bb.0:
1353; CHECK-NEXT:    and %s0, %s0, (32)0
1354; CHECK-NEXT:    b.l.t (, %s10)
1355  %2 = trunc i128 %0 to i32
1356  ret i32 %2
1357}
1358
1359; Function Attrs: norecurse nounwind readnone
1360define i64 @i1282ll(i128 %0) {
1361; CHECK-LABEL: i1282ll:
1362; CHECK:       # %bb.0:
1363; CHECK-NEXT:    b.l.t (, %s10)
1364  %2 = trunc i128 %0 to i64
1365  ret i64 %2
1366}
1367
1368; Function Attrs: norecurse nounwind readnone
1369define i64 @ui1282ll(i128 %0) {
1370; CHECK-LABEL: ui1282ll:
1371; CHECK:       # %bb.0:
1372; CHECK-NEXT:    b.l.t (, %s10)
1373  %2 = trunc i128 %0 to i64
1374  ret i64 %2
1375}
1376
1377; Function Attrs: norecurse nounwind readnone
1378define i64 @i1282ull(i128 %0) {
1379; CHECK-LABEL: i1282ull:
1380; CHECK:       # %bb.0:
1381; CHECK-NEXT:    b.l.t (, %s10)
1382  %2 = trunc i128 %0 to i64
1383  ret i64 %2
1384}
1385
1386; Function Attrs: norecurse nounwind readnone
1387define i64 @ui1282ull(i128 %0) {
1388; CHECK-LABEL: ui1282ull:
1389; CHECK:       # %bb.0:
1390; CHECK-NEXT:    b.l.t (, %s10)
1391  %2 = trunc i128 %0 to i64
1392  ret i64 %2
1393}
1394
1395; Function Attrs: norecurse nounwind readnone
1396define i128 @i1282ui128(i128 returned %0) {
1397; CHECK-LABEL: i1282ui128:
1398; CHECK:       # %bb.0:
1399; CHECK-NEXT:    b.l.t (, %s10)
1400  ret i128 %0
1401}
1402
1403; Function Attrs: norecurse nounwind readnone
1404define i128 @ui1282i128(i128 returned %0) {
1405; CHECK-LABEL: ui1282i128:
1406; CHECK:       # %bb.0:
1407; CHECK-NEXT:    b.l.t (, %s10)
1408  ret i128 %0
1409}
1410
1411; Function Attrs: norecurse nounwind readnone
1412define float @i1282f(i128) {
1413; CHECK-LABEL: i1282f:
1414; CHECK:       .LBB{{[0-9]+}}_2:
1415; CHECK-NEXT:    lea %s2, __floattisf@lo
1416; CHECK-NEXT:    and %s2, %s2, (32)0
1417; CHECK-NEXT:    lea.sl %s12, __floattisf@hi(, %s2)
1418; CHECK-NEXT:    bsic %s10, (, %s12)
1419; CHECK-NEXT:    or %s11, 0, %s9
1420  %2 = sitofp i128 %0 to float
1421  ret float %2
1422}
1423
1424; Function Attrs: norecurse nounwind readnone
1425define float @ui1282f(i128) {
1426; CHECK-LABEL: ui1282f:
1427; CHECK:       .LBB{{[0-9]+}}_2:
1428; CHECK-NEXT:    lea %s2, __floatuntisf@lo
1429; CHECK-NEXT:    and %s2, %s2, (32)0
1430; CHECK-NEXT:    lea.sl %s12, __floatuntisf@hi(, %s2)
1431; CHECK-NEXT:    bsic %s10, (, %s12)
1432; CHECK-NEXT:    or %s11, 0, %s9
1433  %2 = uitofp i128 %0 to float
1434  ret float %2
1435}
1436
1437; Function Attrs: norecurse nounwind readnone
1438define double @i1282d(i128) {
1439; CHECK-LABEL: i1282d:
1440; CHECK:       .LBB{{[0-9]+}}_2:
1441; CHECK-NEXT:    lea %s2, __floattidf@lo
1442; CHECK-NEXT:    and %s2, %s2, (32)0
1443; CHECK-NEXT:    lea.sl %s12, __floattidf@hi(, %s2)
1444; CHECK-NEXT:    bsic %s10, (, %s12)
1445; CHECK-NEXT:    or %s11, 0, %s9
1446  %2 = sitofp i128 %0 to double
1447  ret double %2
1448}
1449
1450; Function Attrs: norecurse nounwind readnone
1451define double @ui1282d(i128) {
1452; CHECK-LABEL: ui1282d:
1453; CHECK:       .LBB{{[0-9]+}}_2:
1454; CHECK-NEXT:    lea %s2, __floatuntidf@lo
1455; CHECK-NEXT:    and %s2, %s2, (32)0
1456; CHECK-NEXT:    lea.sl %s12, __floatuntidf@hi(, %s2)
1457; CHECK-NEXT:    bsic %s10, (, %s12)
1458; CHECK-NEXT:    or %s11, 0, %s9
1459  %2 = uitofp i128 %0 to double
1460  ret double %2
1461}
1462
1463; Function Attrs: norecurse nounwind readnone
1464define i128 @d2i128(double) {
1465; CHECK-LABEL: d2i128:
1466; CHECK:       .LBB{{[0-9]+}}_2:
1467; CHECK-NEXT:    lea %s1, __fixdfti@lo
1468; CHECK-NEXT:    and %s1, %s1, (32)0
1469; CHECK-NEXT:    lea.sl %s12, __fixdfti@hi(, %s1)
1470; CHECK-NEXT:    bsic %s10, (, %s12)
1471; CHECK-NEXT:    or %s11, 0, %s9
1472  %2 = fptosi double %0 to i128
1473  ret i128 %2
1474}
1475
1476; Function Attrs: norecurse nounwind readnone
1477define i128 @d2ui128(double) {
1478; CHECK-LABEL: d2ui128:
1479; CHECK:       .LBB{{[0-9]+}}_2:
1480; CHECK-NEXT:    lea %s1, __fixunsdfti@lo
1481; CHECK-NEXT:    and %s1, %s1, (32)0
1482; CHECK-NEXT:    lea.sl %s12, __fixunsdfti@hi(, %s1)
1483; CHECK-NEXT:    bsic %s10, (, %s12)
1484; CHECK-NEXT:    or %s11, 0, %s9
1485  %2 = fptoui double %0 to i128
1486  ret i128 %2
1487}
1488
1489; Function Attrs: norecurse nounwind readnone
1490define i128 @f2i128(float) {
1491; CHECK-LABEL: f2i128:
1492; CHECK:       .LBB{{[0-9]+}}_2:
1493; CHECK-NEXT:    lea %s1, __fixsfti@lo
1494; CHECK-NEXT:    and %s1, %s1, (32)0
1495; CHECK-NEXT:    lea.sl %s12, __fixsfti@hi(, %s1)
1496; CHECK-NEXT:    bsic %s10, (, %s12)
1497; CHECK-NEXT:    or %s11, 0, %s9
1498  %2 = fptosi float %0 to i128
1499  ret i128 %2
1500}
1501
1502; Function Attrs: norecurse nounwind readnone
1503define i128 @f2ui128(float) {
1504; CHECK-LABEL: f2ui128:
1505; CHECK:       .LBB{{[0-9]+}}_2:
1506; CHECK-NEXT:    lea %s1, __fixunssfti@lo
1507; CHECK-NEXT:    and %s1, %s1, (32)0
1508; CHECK-NEXT:    lea.sl %s12, __fixunssfti@hi(, %s1)
1509; CHECK-NEXT:    bsic %s10, (, %s12)
1510; CHECK-NEXT:    or %s11, 0, %s9
1511  %2 = fptoui float %0 to i128
1512  ret i128 %2
1513}
1514
1515; Function Attrs: norecurse nounwind readnone
1516define i128 @ll2i128(i64 %0) {
1517; CHECK-LABEL: ll2i128:
1518; CHECK:       # %bb.0:
1519; CHECK-NEXT:    sra.l %s1, %s0, 63
1520; CHECK-NEXT:    b.l.t (, %s10)
1521  %2 = sext i64 %0 to i128
1522  ret i128 %2
1523}
1524
1525; Function Attrs: norecurse nounwind readnone
1526define i128 @ll2ui128(i64 %0) {
1527; CHECK-LABEL: ll2ui128:
1528; CHECK:       # %bb.0:
1529; CHECK-NEXT:    sra.l %s1, %s0, 63
1530; CHECK-NEXT:    b.l.t (, %s10)
1531  %2 = sext i64 %0 to i128
1532  ret i128 %2
1533}
1534
1535; Function Attrs: norecurse nounwind readnone
1536define i128 @ull2i128(i64 %0) {
1537; CHECK-LABEL: ull2i128:
1538; CHECK:       # %bb.0:
1539; CHECK-NEXT:    or %s1, 0, (0)1
1540; CHECK-NEXT:    b.l.t (, %s10)
1541  %2 = zext i64 %0 to i128
1542  ret i128 %2
1543}
1544
1545; Function Attrs: norecurse nounwind readnone
1546define i128 @ull2ui128(i64 %0) {
1547; CHECK-LABEL: ull2ui128:
1548; CHECK:       # %bb.0:
1549; CHECK-NEXT:    or %s1, 0, (0)1
1550; CHECK-NEXT:    b.l.t (, %s10)
1551  %2 = zext i64 %0 to i128
1552  ret i128 %2
1553}
1554
1555; Function Attrs: norecurse nounwind readnone
1556define i128 @i2i128(i32 signext %0) {
1557; CHECK-LABEL: i2i128:
1558; CHECK:       # %bb.0:
1559; CHECK-NEXT:    sra.l %s1, %s0, 63
1560; CHECK-NEXT:    b.l.t (, %s10)
1561  %2 = sext i32 %0 to i128
1562  ret i128 %2
1563}
1564
1565; Function Attrs: norecurse nounwind readnone
1566define i128 @i2ui128(i32 signext %0) {
1567; CHECK-LABEL: i2ui128:
1568; CHECK:       # %bb.0:
1569; CHECK-NEXT:    sra.l %s1, %s0, 63
1570; CHECK-NEXT:    b.l.t (, %s10)
1571  %2 = sext i32 %0 to i128
1572  ret i128 %2
1573}
1574
1575; Function Attrs: norecurse nounwind readnone
1576define i128 @ui2i128(i32 zeroext %0) {
1577; CHECK-LABEL: ui2i128:
1578; CHECK:       # %bb.0:
1579; CHECK-NEXT:    or %s1, 0, (0)1
1580; CHECK-NEXT:    b.l.t (, %s10)
1581  %2 = zext i32 %0 to i128
1582  ret i128 %2
1583}
1584
1585; Function Attrs: norecurse nounwind readnone
1586define i128 @ui2ui128(i32 zeroext %0) {
1587; CHECK-LABEL: ui2ui128:
1588; CHECK:       # %bb.0:
1589; CHECK-NEXT:    or %s1, 0, (0)1
1590; CHECK-NEXT:    b.l.t (, %s10)
1591  %2 = zext i32 %0 to i128
1592  ret i128 %2
1593}
1594
1595; Function Attrs: norecurse nounwind readnone
1596define i128 @s2i128(i16 signext %0) {
1597; CHECK-LABEL: s2i128:
1598; CHECK:       # %bb.0:
1599; CHECK-NEXT:    sra.l %s1, %s0, 63
1600; CHECK-NEXT:    b.l.t (, %s10)
1601  %2 = sext i16 %0 to i128
1602  ret i128 %2
1603}
1604
1605; Function Attrs: norecurse nounwind readnone
1606define i128 @s2ui128(i16 signext %0) {
1607; CHECK-LABEL: s2ui128:
1608; CHECK:       # %bb.0:
1609; CHECK-NEXT:    sra.l %s1, %s0, 63
1610; CHECK-NEXT:    b.l.t (, %s10)
1611  %2 = sext i16 %0 to i128
1612  ret i128 %2
1613}
1614
1615; Function Attrs: norecurse nounwind readnone
1616define i128 @us2i128(i16 zeroext %0) {
1617; CHECK-LABEL: us2i128:
1618; CHECK:       # %bb.0:
1619; CHECK-NEXT:    or %s1, 0, (0)1
1620; CHECK-NEXT:    b.l.t (, %s10)
1621  %2 = zext i16 %0 to i128
1622  ret i128 %2
1623}
1624
1625; Function Attrs: norecurse nounwind readnone
1626define i128 @us2ui128(i16 zeroext %0) {
1627; CHECK-LABEL: us2ui128:
1628; CHECK:       # %bb.0:
1629; CHECK-NEXT:    or %s1, 0, (0)1
1630; CHECK-NEXT:    b.l.t (, %s10)
1631  %2 = zext i16 %0 to i128
1632  ret i128 %2
1633}
1634
1635; Function Attrs: norecurse nounwind readnone
1636define i128 @c2i128(i8 signext %0) {
1637; CHECK-LABEL: c2i128:
1638; CHECK:       # %bb.0:
1639; CHECK-NEXT:    sra.l %s1, %s0, 63
1640; CHECK-NEXT:    b.l.t (, %s10)
1641  %2 = sext i8 %0 to i128
1642  ret i128 %2
1643}
1644
1645; Function Attrs: norecurse nounwind readnone
1646define i128 @char2ui128(i8 signext %0) {
1647; CHECK-LABEL: char2ui128:
1648; CHECK:       # %bb.0:
1649; CHECK-NEXT:    sra.l %s1, %s0, 63
1650; CHECK-NEXT:    b.l.t (, %s10)
1651  %2 = sext i8 %0 to i128
1652  ret i128 %2
1653}
1654
1655; Function Attrs: norecurse nounwind readnone
1656define i128 @uc2i128(i8 zeroext %0) {
1657; CHECK-LABEL: uc2i128:
1658; CHECK:       # %bb.0:
1659; CHECK-NEXT:    or %s1, 0, (0)1
1660; CHECK-NEXT:    b.l.t (, %s10)
1661  %2 = zext i8 %0 to i128
1662  ret i128 %2
1663}
1664
1665; Function Attrs: norecurse nounwind readnone
1666define i128 @uc2ui128(i8 zeroext %0) {
1667; CHECK-LABEL: uc2ui128:
1668; CHECK:       # %bb.0:
1669; CHECK-NEXT:    or %s1, 0, (0)1
1670; CHECK-NEXT:    b.l.t (, %s10)
1671  %2 = zext i8 %0 to i128
1672  ret i128 %2
1673}
1674