xref: /llvm-project/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-ui129tofp.ll (revision 7edddee2aa6a6183e40784c9141afec3e2eabb95)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -mtriple=x86_64-- -expand-large-fp-convert < %s | FileCheck %s
3; RUN: opt -S -mtriple=x86_64-- -passes=expand-large-fp-convert < %s | FileCheck %s
4
5define half @ui129tohalf(i129 %a) {
6; CHECK-LABEL: @ui129tohalf(
7; CHECK-NEXT:  itofp-entry:
8; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
9; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
10; CHECK:       itofp-if-end:
11; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
12; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
13; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
14; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
15; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
16; CHECK-NEXT:    [[TMP6:%.*]] = sub i32 129, [[TMP5]]
17; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 128, [[TMP5]]
18; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 24
19; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
20; CHECK:       itofp-if-then4:
21; CHECK-NEXT:    switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
22; CHECK-NEXT:      i32 25, label [[ITOFP_SW_BB:%.*]]
23; CHECK-NEXT:      i32 26, label [[ITOFP_SW_EPILOG:%.*]]
24; CHECK-NEXT:    ]
25; CHECK:       itofp-sw-bb:
26; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[A]], 1
27; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
28; CHECK:       itofp-sw-default:
29; CHECK-NEXT:    [[TMP10:%.*]] = sub i32 103, [[TMP5]]
30; CHECK-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
31; CHECK-NEXT:    [[TMP12:%.*]] = lshr i129 [[A]], [[TMP11]]
32; CHECK-NEXT:    [[TMP13:%.*]] = add i32 [[TMP5]], 26
33; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
34; CHECK-NEXT:    [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
35; CHECK-NEXT:    [[TMP16:%.*]] = and i129 [[TMP15]], [[A]]
36; CHECK-NEXT:    [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
37; CHECK-NEXT:    [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
38; CHECK-NEXT:    [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
39; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
40; CHECK:       itofp-sw-epilog:
41; CHECK-NEXT:    [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
42; CHECK-NEXT:    [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
43; CHECK-NEXT:    [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
44; CHECK-NEXT:    [[TMP23:%.*]] = and i32 [[TMP22]], 1
45; CHECK-NEXT:    [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
46; CHECK-NEXT:    [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
47; CHECK-NEXT:    [[TMP26:%.*]] = add i129 [[TMP25]], 1
48; CHECK-NEXT:    [[TMP27:%.*]] = lshr i129 [[TMP26]], 2
49; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP26]], 67108864
50; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
51; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP27]] to i32
52; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
53; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
54; CHECK-NEXT:    br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
55; CHECK:       itofp-if-then20:
56; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP26]], 3
57; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP32]] to i32
58; CHECK-NEXT:    [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
59; CHECK-NEXT:    [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
60; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
61; CHECK:       itofp-if-else:
62; CHECK-NEXT:    [[TMP36:%.*]] = add i32 [[TMP5]], -105
63; CHECK-NEXT:    [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
64; CHECK-NEXT:    [[TMP38:%.*]] = shl i129 [[A]], [[TMP37]]
65; CHECK-NEXT:    [[TMP39:%.*]] = trunc i129 [[TMP38]] to i32
66; CHECK-NEXT:    [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
67; CHECK-NEXT:    [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
68; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
69; CHECK:       itofp-if-end26:
70; CHECK-NEXT:    [[TMP42:%.*]] = phi i32 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
71; CHECK-NEXT:    [[TMP43:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
72; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[TMP1]] to i32
73; CHECK-NEXT:    [[TMP45:%.*]] = and i32 [[TMP44]], -2147483648
74; CHECK-NEXT:    [[TMP46:%.*]] = shl i32 [[TMP43]], 23
75; CHECK-NEXT:    [[TMP47:%.*]] = add i32 [[TMP46]], 1065353216
76; CHECK-NEXT:    [[TMP48:%.*]] = and i32 [[TMP42]], 8388607
77; CHECK-NEXT:    [[TMP49:%.*]] = or i32 [[TMP48]], [[TMP45]]
78; CHECK-NEXT:    [[TMP50:%.*]] = or i32 [[TMP48]], [[TMP47]]
79; CHECK-NEXT:    [[TMP51:%.*]] = bitcast i32 [[TMP50]] to float
80; CHECK-NEXT:    [[TMP52:%.*]] = fptrunc float [[TMP51]] to half
81; CHECK-NEXT:    br label [[ITOFP_RETURN]]
82; CHECK:       itofp-return:
83; CHECK-NEXT:    [[TMP53:%.*]] = phi half [ [[TMP52]], [[ITOFP_IF_END26]] ], [ 0xH0000, [[ITOFP_ENTRY:%.*]] ]
84; CHECK-NEXT:    ret half [[TMP53]]
85;
86  %conv = uitofp i129 %a to half
87  ret half %conv
88}
89
90define float @ui129tofloat(i129 %a) {
91; CHECK-LABEL: @ui129tofloat(
92; CHECK-NEXT:  itofp-entry:
93; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
94; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
95; CHECK:       itofp-if-end:
96; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
97; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
98; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
99; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
100; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
101; CHECK-NEXT:    [[TMP6:%.*]] = sub i32 129, [[TMP5]]
102; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 128, [[TMP5]]
103; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 24
104; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
105; CHECK:       itofp-if-then4:
106; CHECK-NEXT:    switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
107; CHECK-NEXT:      i32 25, label [[ITOFP_SW_BB:%.*]]
108; CHECK-NEXT:      i32 26, label [[ITOFP_SW_EPILOG:%.*]]
109; CHECK-NEXT:    ]
110; CHECK:       itofp-sw-bb:
111; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[A]], 1
112; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
113; CHECK:       itofp-sw-default:
114; CHECK-NEXT:    [[TMP10:%.*]] = sub i32 103, [[TMP5]]
115; CHECK-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
116; CHECK-NEXT:    [[TMP12:%.*]] = lshr i129 [[A]], [[TMP11]]
117; CHECK-NEXT:    [[TMP13:%.*]] = add i32 [[TMP5]], 26
118; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
119; CHECK-NEXT:    [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
120; CHECK-NEXT:    [[TMP16:%.*]] = and i129 [[TMP15]], [[A]]
121; CHECK-NEXT:    [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
122; CHECK-NEXT:    [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
123; CHECK-NEXT:    [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
124; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
125; CHECK:       itofp-sw-epilog:
126; CHECK-NEXT:    [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
127; CHECK-NEXT:    [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
128; CHECK-NEXT:    [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
129; CHECK-NEXT:    [[TMP23:%.*]] = and i32 [[TMP22]], 1
130; CHECK-NEXT:    [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
131; CHECK-NEXT:    [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
132; CHECK-NEXT:    [[TMP26:%.*]] = add i129 [[TMP25]], 1
133; CHECK-NEXT:    [[TMP27:%.*]] = lshr i129 [[TMP26]], 2
134; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP26]], 67108864
135; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
136; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP27]] to i32
137; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
138; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
139; CHECK-NEXT:    br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
140; CHECK:       itofp-if-then20:
141; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP26]], 3
142; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP32]] to i32
143; CHECK-NEXT:    [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
144; CHECK-NEXT:    [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
145; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
146; CHECK:       itofp-if-else:
147; CHECK-NEXT:    [[TMP36:%.*]] = add i32 [[TMP5]], -105
148; CHECK-NEXT:    [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
149; CHECK-NEXT:    [[TMP38:%.*]] = shl i129 [[A]], [[TMP37]]
150; CHECK-NEXT:    [[TMP39:%.*]] = trunc i129 [[TMP38]] to i32
151; CHECK-NEXT:    [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
152; CHECK-NEXT:    [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
153; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
154; CHECK:       itofp-if-end26:
155; CHECK-NEXT:    [[TMP42:%.*]] = phi i32 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
156; CHECK-NEXT:    [[TMP43:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
157; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[TMP1]] to i32
158; CHECK-NEXT:    [[TMP45:%.*]] = and i32 [[TMP44]], -2147483648
159; CHECK-NEXT:    [[TMP46:%.*]] = shl i32 [[TMP43]], 23
160; CHECK-NEXT:    [[TMP47:%.*]] = add i32 [[TMP46]], 1065353216
161; CHECK-NEXT:    [[TMP48:%.*]] = and i32 [[TMP42]], 8388607
162; CHECK-NEXT:    [[TMP49:%.*]] = or i32 [[TMP48]], [[TMP45]]
163; CHECK-NEXT:    [[TMP50:%.*]] = or i32 [[TMP48]], [[TMP47]]
164; CHECK-NEXT:    [[TMP51:%.*]] = bitcast i32 [[TMP50]] to float
165; CHECK-NEXT:    br label [[ITOFP_RETURN]]
166; CHECK:       itofp-return:
167; CHECK-NEXT:    [[TMP52:%.*]] = phi float [ [[TMP51]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_ENTRY:%.*]] ]
168; CHECK-NEXT:    ret float [[TMP52]]
169;
170  %conv = uitofp i129 %a to float
171  ret float %conv
172}
173
174define double @ui129todouble(i129 %a) {
175; CHECK-LABEL: @ui129todouble(
176; CHECK-NEXT:  itofp-entry:
177; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
178; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
179; CHECK:       itofp-if-end:
180; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
181; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
182; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
183; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
184; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
185; CHECK-NEXT:    [[TMP6:%.*]] = sub i32 129, [[TMP5]]
186; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 128, [[TMP5]]
187; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 53
188; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
189; CHECK:       itofp-if-then4:
190; CHECK-NEXT:    switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
191; CHECK-NEXT:      i32 54, label [[ITOFP_SW_BB:%.*]]
192; CHECK-NEXT:      i32 55, label [[ITOFP_SW_EPILOG:%.*]]
193; CHECK-NEXT:    ]
194; CHECK:       itofp-sw-bb:
195; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[A]], 1
196; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
197; CHECK:       itofp-sw-default:
198; CHECK-NEXT:    [[TMP10:%.*]] = sub i32 74, [[TMP5]]
199; CHECK-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
200; CHECK-NEXT:    [[TMP12:%.*]] = lshr i129 [[A]], [[TMP11]]
201; CHECK-NEXT:    [[TMP13:%.*]] = add i32 [[TMP5]], 55
202; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
203; CHECK-NEXT:    [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
204; CHECK-NEXT:    [[TMP16:%.*]] = and i129 [[TMP15]], [[A]]
205; CHECK-NEXT:    [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
206; CHECK-NEXT:    [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
207; CHECK-NEXT:    [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
208; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
209; CHECK:       itofp-sw-epilog:
210; CHECK-NEXT:    [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
211; CHECK-NEXT:    [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
212; CHECK-NEXT:    [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
213; CHECK-NEXT:    [[TMP23:%.*]] = and i32 [[TMP22]], 1
214; CHECK-NEXT:    [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
215; CHECK-NEXT:    [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
216; CHECK-NEXT:    [[TMP26:%.*]] = add i129 [[TMP25]], 1
217; CHECK-NEXT:    [[TMP27:%.*]] = lshr i129 [[TMP26]], 2
218; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP26]], 36028797018963968
219; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
220; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP27]] to i64
221; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
222; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
223; CHECK-NEXT:    br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
224; CHECK:       itofp-if-then20:
225; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP26]], 3
226; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP32]] to i64
227; CHECK-NEXT:    [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
228; CHECK-NEXT:    [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
229; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
230; CHECK:       itofp-if-else:
231; CHECK-NEXT:    [[TMP36:%.*]] = add i32 [[TMP5]], -76
232; CHECK-NEXT:    [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
233; CHECK-NEXT:    [[TMP38:%.*]] = shl i129 [[A]], [[TMP37]]
234; CHECK-NEXT:    [[TMP39:%.*]] = trunc i129 [[TMP38]] to i64
235; CHECK-NEXT:    [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
236; CHECK-NEXT:    [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
237; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
238; CHECK:       itofp-if-end26:
239; CHECK-NEXT:    [[TMP42:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
240; CHECK-NEXT:    [[TMP43:%.*]] = phi i32 [ [[TMP35]], [[ITOFP_IF_THEN20]] ], [ [[TMP31]], [[ITOFP_SW_EPILOG]] ], [ [[TMP41]], [[ITOFP_IF_ELSE]] ]
241; CHECK-NEXT:    [[TMP44:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
242; CHECK-NEXT:    [[TMP45:%.*]] = trunc i129 [[TMP1]] to i32
243; CHECK-NEXT:    [[TMP46:%.*]] = and i32 [[TMP45]], -2147483648
244; CHECK-NEXT:    [[TMP47:%.*]] = shl i32 [[TMP44]], 20
245; CHECK-NEXT:    [[TMP48:%.*]] = add i32 [[TMP47]], 1072693248
246; CHECK-NEXT:    [[TMP49:%.*]] = and i32 [[TMP43]], 1048575
247; CHECK-NEXT:    [[TMP50:%.*]] = or i32 [[TMP49]], [[TMP46]]
248; CHECK-NEXT:    [[TMP51:%.*]] = or i32 [[TMP49]], [[TMP48]]
249; CHECK-NEXT:    [[TMP52:%.*]] = zext i32 [[TMP51]] to i64
250; CHECK-NEXT:    [[TMP53:%.*]] = shl i64 [[TMP52]], 32
251; CHECK-NEXT:    [[TMP54:%.*]] = and i64 [[TMP42]], 4294967295
252; CHECK-NEXT:    [[TMP55:%.*]] = or i64 [[TMP53]], [[TMP54]]
253; CHECK-NEXT:    [[TMP56:%.*]] = bitcast i64 [[TMP55]] to double
254; CHECK-NEXT:    br label [[ITOFP_RETURN]]
255; CHECK:       itofp-return:
256; CHECK-NEXT:    [[TMP57:%.*]] = phi double [ [[TMP56]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_ENTRY:%.*]] ]
257; CHECK-NEXT:    ret double [[TMP57]]
258;
259  %conv = uitofp i129 %a to double
260  ret double %conv
261}
262
263define x86_fp80 @ui129tox86_fp80(i129 %a) {
264; CHECK-LABEL: @ui129tox86_fp80(
265; CHECK-NEXT:  itofp-entry:
266; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
267; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
268; CHECK:       itofp-if-end:
269; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
270; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
271; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
272; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
273; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
274; CHECK-NEXT:    [[TMP6:%.*]] = sub i129 129, [[TMP4]]
275; CHECK-NEXT:    [[TMP7:%.*]] = sub i129 128, [[TMP4]]
276; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i129 [[TMP6]], 113
277; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
278; CHECK:       itofp-if-then4:
279; CHECK-NEXT:    switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
280; CHECK-NEXT:      i129 114, label [[ITOFP_SW_BB:%.*]]
281; CHECK-NEXT:      i129 115, label [[ITOFP_SW_EPILOG:%.*]]
282; CHECK-NEXT:    ]
283; CHECK:       itofp-sw-bb:
284; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[A]], 1
285; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
286; CHECK:       itofp-sw-default:
287; CHECK-NEXT:    [[TMP10:%.*]] = sub i129 14, [[TMP4]]
288; CHECK-NEXT:    [[TMP11:%.*]] = lshr i129 [[A]], [[TMP10]]
289; CHECK-NEXT:    [[TMP12:%.*]] = add i129 [[TMP4]], 115
290; CHECK-NEXT:    [[TMP13:%.*]] = lshr i129 -1, [[TMP12]]
291; CHECK-NEXT:    [[TMP14:%.*]] = and i129 [[TMP13]], [[A]]
292; CHECK-NEXT:    [[TMP15:%.*]] = icmp ne i129 [[TMP14]], 0
293; CHECK-NEXT:    [[TMP16:%.*]] = zext i1 [[TMP15]] to i129
294; CHECK-NEXT:    [[TMP17:%.*]] = or i129 [[TMP11]], [[TMP16]]
295; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
296; CHECK:       itofp-sw-epilog:
297; CHECK-NEXT:    [[TMP18:%.*]] = phi i129 [ [[TMP17]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
298; CHECK-NEXT:    [[TMP19:%.*]] = trunc i129 [[TMP18]] to i32
299; CHECK-NEXT:    [[TMP20:%.*]] = lshr i32 [[TMP19]], 2
300; CHECK-NEXT:    [[TMP21:%.*]] = and i32 [[TMP20]], 1
301; CHECK-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i129
302; CHECK-NEXT:    [[TMP23:%.*]] = or i129 [[TMP18]], [[TMP22]]
303; CHECK-NEXT:    [[TMP24:%.*]] = add i129 [[TMP23]], 1
304; CHECK-NEXT:    [[TMP25:%.*]] = lshr i129 [[TMP24]], 2
305; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP24]], 41538374868278621028243970633760768
306; CHECK-NEXT:    [[TMP26:%.*]] = icmp eq i129 [[A3]], 0
307; CHECK-NEXT:    [[TMP27:%.*]] = trunc i129 [[TMP25]] to i128
308; CHECK-NEXT:    [[TMP28:%.*]] = lshr i129 [[TMP25]], 32
309; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP7]] to i64
310; CHECK-NEXT:    br i1 [[TMP26]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
311; CHECK:       itofp-if-then20:
312; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP24]], 3
313; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i128
314; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP30]], 32
315; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
316; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
317; CHECK:       itofp-if-else:
318; CHECK-NEXT:    [[TMP34:%.*]] = add i129 [[TMP4]], 4294967280
319; CHECK-NEXT:    [[TMP35:%.*]] = shl i129 [[A]], [[TMP34]]
320; CHECK-NEXT:    [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
321; CHECK-NEXT:    [[TMP37:%.*]] = lshr i129 [[TMP35]], 32
322; CHECK-NEXT:    [[TMP38:%.*]] = trunc i129 [[TMP7]] to i64
323; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
324; CHECK:       itofp-if-end26:
325; CHECK-NEXT:    [[TMP39:%.*]] = phi i128 [ [[TMP31]], [[ITOFP_IF_THEN20]] ], [ [[TMP27]], [[ITOFP_SW_EPILOG]] ], [ [[TMP36]], [[ITOFP_IF_ELSE]] ]
326; CHECK-NEXT:    [[TMP40:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP38]], [[ITOFP_IF_ELSE]] ]
327; CHECK-NEXT:    [[AND29:%.*]] = and i129 [[TMP1]], 9223372036854775808
328; CHECK-NEXT:    [[TMP41:%.*]] = shl i64 [[TMP40]], 48
329; CHECK-NEXT:    [[TMP42:%.*]] = add i64 [[TMP41]], 4611404543450677248
330; CHECK-NEXT:    [[TMP43:%.*]] = zext i64 [[TMP42]] to i128
331; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[AND29]] to i128
332; CHECK-NEXT:    [[TMP45:%.*]] = or i128 [[TMP44]], [[TMP43]]
333; CHECK-NEXT:    [[TMP46:%.*]] = shl i128 [[TMP45]], 64
334; CHECK-NEXT:    [[TMP47:%.*]] = and i128 [[TMP39]], 5192296858534827628530496329220095
335; CHECK-NEXT:    [[TMP48:%.*]] = or i128 [[TMP46]], [[TMP47]]
336; CHECK-NEXT:    [[TMP49:%.*]] = bitcast i128 [[TMP48]] to fp128
337; CHECK-NEXT:    [[TMP50:%.*]] = fptrunc fp128 [[TMP49]] to x86_fp80
338; CHECK-NEXT:    br label [[ITOFP_RETURN]]
339; CHECK:       itofp-return:
340; CHECK-NEXT:    [[TMP51:%.*]] = phi x86_fp80 [ [[TMP50]], [[ITOFP_IF_END26]] ], [ 0xK00000000000000000000, [[ITOFP_ENTRY:%.*]] ]
341; CHECK-NEXT:    ret x86_fp80 [[TMP51]]
342;
343  %conv = uitofp i129 %a to x86_fp80
344  ret x86_fp80 %conv
345}
346
347define fp128 @ui129tofp128(i129 %a) {
348; CHECK-LABEL: @ui129tofp128(
349; CHECK-NEXT:  itofp-entry:
350; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
351; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
352; CHECK:       itofp-if-end:
353; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
354; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
355; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
356; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
357; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
358; CHECK-NEXT:    [[TMP6:%.*]] = sub i129 129, [[TMP4]]
359; CHECK-NEXT:    [[TMP7:%.*]] = sub i129 128, [[TMP4]]
360; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i129 [[TMP6]], 113
361; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
362; CHECK:       itofp-if-then4:
363; CHECK-NEXT:    switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
364; CHECK-NEXT:      i129 114, label [[ITOFP_SW_BB:%.*]]
365; CHECK-NEXT:      i129 115, label [[ITOFP_SW_EPILOG:%.*]]
366; CHECK-NEXT:    ]
367; CHECK:       itofp-sw-bb:
368; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[A]], 1
369; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
370; CHECK:       itofp-sw-default:
371; CHECK-NEXT:    [[TMP10:%.*]] = sub i129 14, [[TMP4]]
372; CHECK-NEXT:    [[TMP11:%.*]] = lshr i129 [[A]], [[TMP10]]
373; CHECK-NEXT:    [[TMP12:%.*]] = add i129 [[TMP4]], 115
374; CHECK-NEXT:    [[TMP13:%.*]] = lshr i129 -1, [[TMP12]]
375; CHECK-NEXT:    [[TMP14:%.*]] = and i129 [[TMP13]], [[A]]
376; CHECK-NEXT:    [[TMP15:%.*]] = icmp ne i129 [[TMP14]], 0
377; CHECK-NEXT:    [[TMP16:%.*]] = zext i1 [[TMP15]] to i129
378; CHECK-NEXT:    [[TMP17:%.*]] = or i129 [[TMP11]], [[TMP16]]
379; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
380; CHECK:       itofp-sw-epilog:
381; CHECK-NEXT:    [[TMP18:%.*]] = phi i129 [ [[TMP17]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
382; CHECK-NEXT:    [[TMP19:%.*]] = trunc i129 [[TMP18]] to i32
383; CHECK-NEXT:    [[TMP20:%.*]] = lshr i32 [[TMP19]], 2
384; CHECK-NEXT:    [[TMP21:%.*]] = and i32 [[TMP20]], 1
385; CHECK-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i129
386; CHECK-NEXT:    [[TMP23:%.*]] = or i129 [[TMP18]], [[TMP22]]
387; CHECK-NEXT:    [[TMP24:%.*]] = add i129 [[TMP23]], 1
388; CHECK-NEXT:    [[TMP25:%.*]] = lshr i129 [[TMP24]], 2
389; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP24]], 41538374868278621028243970633760768
390; CHECK-NEXT:    [[TMP26:%.*]] = icmp eq i129 [[A3]], 0
391; CHECK-NEXT:    [[TMP27:%.*]] = trunc i129 [[TMP25]] to i128
392; CHECK-NEXT:    [[TMP28:%.*]] = lshr i129 [[TMP25]], 32
393; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP7]] to i64
394; CHECK-NEXT:    br i1 [[TMP26]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
395; CHECK:       itofp-if-then20:
396; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP24]], 3
397; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i128
398; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP30]], 32
399; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
400; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
401; CHECK:       itofp-if-else:
402; CHECK-NEXT:    [[TMP34:%.*]] = add i129 [[TMP4]], 4294967280
403; CHECK-NEXT:    [[TMP35:%.*]] = shl i129 [[A]], [[TMP34]]
404; CHECK-NEXT:    [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
405; CHECK-NEXT:    [[TMP37:%.*]] = lshr i129 [[TMP35]], 32
406; CHECK-NEXT:    [[TMP38:%.*]] = trunc i129 [[TMP7]] to i64
407; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
408; CHECK:       itofp-if-end26:
409; CHECK-NEXT:    [[TMP39:%.*]] = phi i128 [ [[TMP31]], [[ITOFP_IF_THEN20]] ], [ [[TMP27]], [[ITOFP_SW_EPILOG]] ], [ [[TMP36]], [[ITOFP_IF_ELSE]] ]
410; CHECK-NEXT:    [[TMP40:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP38]], [[ITOFP_IF_ELSE]] ]
411; CHECK-NEXT:    [[AND29:%.*]] = and i129 [[TMP1]], 9223372036854775808
412; CHECK-NEXT:    [[TMP41:%.*]] = shl i64 [[TMP40]], 48
413; CHECK-NEXT:    [[TMP42:%.*]] = add i64 [[TMP41]], 4611404543450677248
414; CHECK-NEXT:    [[TMP43:%.*]] = zext i64 [[TMP42]] to i128
415; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[AND29]] to i128
416; CHECK-NEXT:    [[TMP45:%.*]] = or i128 [[TMP44]], [[TMP43]]
417; CHECK-NEXT:    [[TMP46:%.*]] = shl i128 [[TMP45]], 64
418; CHECK-NEXT:    [[TMP47:%.*]] = and i128 [[TMP39]], 5192296858534827628530496329220095
419; CHECK-NEXT:    [[TMP48:%.*]] = or i128 [[TMP46]], [[TMP47]]
420; CHECK-NEXT:    [[TMP49:%.*]] = bitcast i128 [[TMP48]] to fp128
421; CHECK-NEXT:    br label [[ITOFP_RETURN]]
422; CHECK:       itofp-return:
423; CHECK-NEXT:    [[TMP50:%.*]] = phi fp128 [ [[TMP49]], [[ITOFP_IF_END26]] ], [ 0xL00000000000000000000000000000000, [[ITOFP_ENTRY:%.*]] ]
424; CHECK-NEXT:    ret fp128 [[TMP50]]
425;
426  %conv = uitofp i129 %a to fp128
427  ret fp128 %conv
428}
429
430define <2 x float> @ui129tofloatv2(<2 x i129> %a) {
431; CHECK-LABEL: @ui129tofloatv2(
432; CHECK-NEXT:  itofp-entryitofp-entry:
433; CHECK-NEXT:    [[TMP0:%.*]] = extractelement <2 x i129> [[A:%.*]], i64 0
434; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i129 [[TMP0]], 0
435; CHECK-NEXT:    br i1 [[TMP1]], label [[ITOFP_RETURN1:%.*]], label [[ITOFP_IF_END2:%.*]]
436; CHECK:       itofp-if-end2:
437; CHECK-NEXT:    [[TMP2:%.*]] = ashr i129 [[TMP0]], 128
438; CHECK-NEXT:    [[TMP3:%.*]] = xor i129 [[TMP2]], [[TMP0]]
439; CHECK-NEXT:    [[TMP4:%.*]] = sub i129 [[TMP3]], [[TMP2]]
440; CHECK-NEXT:    [[TMP5:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP0]], i1 true)
441; CHECK-NEXT:    [[TMP6:%.*]] = trunc i129 [[TMP5]] to i32
442; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 129, [[TMP6]]
443; CHECK-NEXT:    [[TMP8:%.*]] = sub i32 128, [[TMP6]]
444; CHECK-NEXT:    [[TMP9:%.*]] = icmp sgt i32 [[TMP7]], 24
445; CHECK-NEXT:    br i1 [[TMP9]], label [[ITOFP_IF_THEN43:%.*]], label [[ITOFP_IF_ELSE8:%.*]]
446; CHECK:       itofp-if-then43:
447; CHECK-NEXT:    switch i32 [[TMP7]], label [[ITOFP_SW_DEFAULT5:%.*]] [
448; CHECK-NEXT:      i32 25, label [[ITOFP_SW_BB4:%.*]]
449; CHECK-NEXT:      i32 26, label [[ITOFP_SW_EPILOG6:%.*]]
450; CHECK-NEXT:    ]
451; CHECK:       itofp-sw-bb4:
452; CHECK-NEXT:    [[TMP10:%.*]] = shl i129 [[TMP0]], 1
453; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG6]]
454; CHECK:       itofp-sw-default5:
455; CHECK-NEXT:    [[TMP11:%.*]] = sub i32 103, [[TMP6]]
456; CHECK-NEXT:    [[TMP12:%.*]] = zext i32 [[TMP11]] to i129
457; CHECK-NEXT:    [[TMP13:%.*]] = lshr i129 [[TMP0]], [[TMP12]]
458; CHECK-NEXT:    [[TMP14:%.*]] = add i32 [[TMP6]], 26
459; CHECK-NEXT:    [[TMP15:%.*]] = zext i32 [[TMP14]] to i129
460; CHECK-NEXT:    [[TMP16:%.*]] = lshr i129 -1, [[TMP15]]
461; CHECK-NEXT:    [[TMP17:%.*]] = and i129 [[TMP16]], [[TMP0]]
462; CHECK-NEXT:    [[TMP18:%.*]] = icmp ne i129 [[TMP17]], 0
463; CHECK-NEXT:    [[TMP19:%.*]] = zext i1 [[TMP18]] to i129
464; CHECK-NEXT:    [[TMP20:%.*]] = or i129 [[TMP13]], [[TMP19]]
465; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG6]]
466; CHECK:       itofp-sw-epilog6:
467; CHECK-NEXT:    [[TMP21:%.*]] = phi i129 [ [[TMP20]], [[ITOFP_SW_DEFAULT5]] ], [ [[TMP0]], [[ITOFP_IF_THEN43]] ], [ [[TMP10]], [[ITOFP_SW_BB4]] ]
468; CHECK-NEXT:    [[TMP22:%.*]] = trunc i129 [[TMP21]] to i32
469; CHECK-NEXT:    [[TMP23:%.*]] = lshr i32 [[TMP22]], 2
470; CHECK-NEXT:    [[TMP24:%.*]] = and i32 [[TMP23]], 1
471; CHECK-NEXT:    [[TMP25:%.*]] = zext i32 [[TMP24]] to i129
472; CHECK-NEXT:    [[TMP26:%.*]] = or i129 [[TMP21]], [[TMP25]]
473; CHECK-NEXT:    [[TMP27:%.*]] = add i129 [[TMP26]], 1
474; CHECK-NEXT:    [[TMP28:%.*]] = lshr i129 [[TMP27]], 2
475; CHECK-NEXT:    [[A310:%.*]] = and i129 [[TMP27]], 67108864
476; CHECK-NEXT:    [[TMP29:%.*]] = icmp eq i129 [[A310]], 0
477; CHECK-NEXT:    [[TMP30:%.*]] = trunc i129 [[TMP28]] to i32
478; CHECK-NEXT:    [[TMP31:%.*]] = lshr i129 [[TMP28]], 32
479; CHECK-NEXT:    [[TMP32:%.*]] = trunc i129 [[TMP31]] to i32
480; CHECK-NEXT:    br i1 [[TMP29]], label [[ITOFP_IF_END269:%.*]], label [[ITOFP_IF_THEN207:%.*]]
481; CHECK:       itofp-if-then207:
482; CHECK-NEXT:    [[TMP33:%.*]] = lshr i129 [[TMP27]], 3
483; CHECK-NEXT:    [[TMP34:%.*]] = trunc i129 [[TMP33]] to i32
484; CHECK-NEXT:    [[TMP35:%.*]] = lshr i129 [[TMP33]], 32
485; CHECK-NEXT:    [[TMP36:%.*]] = trunc i129 [[TMP35]] to i32
486; CHECK-NEXT:    br label [[ITOFP_IF_END269]]
487; CHECK:       itofp-if-else8:
488; CHECK-NEXT:    [[TMP37:%.*]] = add i32 [[TMP6]], -105
489; CHECK-NEXT:    [[TMP38:%.*]] = zext i32 [[TMP37]] to i129
490; CHECK-NEXT:    [[TMP39:%.*]] = shl i129 [[TMP0]], [[TMP38]]
491; CHECK-NEXT:    [[TMP40:%.*]] = trunc i129 [[TMP39]] to i32
492; CHECK-NEXT:    [[TMP41:%.*]] = lshr i129 [[TMP39]], 32
493; CHECK-NEXT:    [[TMP42:%.*]] = trunc i129 [[TMP41]] to i32
494; CHECK-NEXT:    br label [[ITOFP_IF_END269]]
495; CHECK:       itofp-if-end269:
496; CHECK-NEXT:    [[TMP43:%.*]] = phi i32 [ [[TMP34]], [[ITOFP_IF_THEN207]] ], [ [[TMP30]], [[ITOFP_SW_EPILOG6]] ], [ [[TMP40]], [[ITOFP_IF_ELSE8]] ]
497; CHECK-NEXT:    [[TMP44:%.*]] = phi i32 [ [[TMP7]], [[ITOFP_IF_THEN207]] ], [ [[TMP8]], [[ITOFP_SW_EPILOG6]] ], [ [[TMP8]], [[ITOFP_IF_ELSE8]] ]
498; CHECK-NEXT:    [[TMP45:%.*]] = trunc i129 [[TMP2]] to i32
499; CHECK-NEXT:    [[TMP46:%.*]] = and i32 [[TMP45]], -2147483648
500; CHECK-NEXT:    [[TMP47:%.*]] = shl i32 [[TMP44]], 23
501; CHECK-NEXT:    [[TMP48:%.*]] = add i32 [[TMP47]], 1065353216
502; CHECK-NEXT:    [[TMP49:%.*]] = and i32 [[TMP43]], 8388607
503; CHECK-NEXT:    [[TMP50:%.*]] = or i32 [[TMP49]], [[TMP46]]
504; CHECK-NEXT:    [[TMP51:%.*]] = or i32 [[TMP49]], [[TMP48]]
505; CHECK-NEXT:    [[TMP52:%.*]] = bitcast i32 [[TMP51]] to float
506; CHECK-NEXT:    br label [[ITOFP_RETURN1]]
507; CHECK:       itofp-return1:
508; CHECK-NEXT:    [[TMP53:%.*]] = phi float [ [[TMP52]], [[ITOFP_IF_END269]] ], [ 0.000000e+00, [[ITOFP_ENTRYITOFP_ENTRY:%.*]] ]
509; CHECK-NEXT:    [[TMP54:%.*]] = insertelement <2 x float> poison, float [[TMP53]], i64 0
510; CHECK-NEXT:    [[TMP55:%.*]] = extractelement <2 x i129> [[A]], i64 1
511; CHECK-NEXT:    [[TMP56:%.*]] = icmp eq i129 [[TMP55]], 0
512; CHECK-NEXT:    br i1 [[TMP56]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
513; CHECK:       itofp-if-end:
514; CHECK-NEXT:    [[TMP57:%.*]] = ashr i129 [[TMP55]], 128
515; CHECK-NEXT:    [[TMP58:%.*]] = xor i129 [[TMP57]], [[TMP55]]
516; CHECK-NEXT:    [[TMP59:%.*]] = sub i129 [[TMP58]], [[TMP57]]
517; CHECK-NEXT:    [[TMP60:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP55]], i1 true)
518; CHECK-NEXT:    [[TMP61:%.*]] = trunc i129 [[TMP60]] to i32
519; CHECK-NEXT:    [[TMP62:%.*]] = sub i32 129, [[TMP61]]
520; CHECK-NEXT:    [[TMP63:%.*]] = sub i32 128, [[TMP61]]
521; CHECK-NEXT:    [[TMP64:%.*]] = icmp sgt i32 [[TMP62]], 24
522; CHECK-NEXT:    br i1 [[TMP64]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
523; CHECK:       itofp-if-then4:
524; CHECK-NEXT:    switch i32 [[TMP62]], label [[ITOFP_SW_DEFAULT:%.*]] [
525; CHECK-NEXT:      i32 25, label [[ITOFP_SW_BB:%.*]]
526; CHECK-NEXT:      i32 26, label [[ITOFP_SW_EPILOG:%.*]]
527; CHECK-NEXT:    ]
528; CHECK:       itofp-sw-bb:
529; CHECK-NEXT:    [[TMP65:%.*]] = shl i129 [[TMP55]], 1
530; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
531; CHECK:       itofp-sw-default:
532; CHECK-NEXT:    [[TMP66:%.*]] = sub i32 103, [[TMP61]]
533; CHECK-NEXT:    [[TMP67:%.*]] = zext i32 [[TMP66]] to i129
534; CHECK-NEXT:    [[TMP68:%.*]] = lshr i129 [[TMP55]], [[TMP67]]
535; CHECK-NEXT:    [[TMP69:%.*]] = add i32 [[TMP61]], 26
536; CHECK-NEXT:    [[TMP70:%.*]] = zext i32 [[TMP69]] to i129
537; CHECK-NEXT:    [[TMP71:%.*]] = lshr i129 -1, [[TMP70]]
538; CHECK-NEXT:    [[TMP72:%.*]] = and i129 [[TMP71]], [[TMP55]]
539; CHECK-NEXT:    [[TMP73:%.*]] = icmp ne i129 [[TMP72]], 0
540; CHECK-NEXT:    [[TMP74:%.*]] = zext i1 [[TMP73]] to i129
541; CHECK-NEXT:    [[TMP75:%.*]] = or i129 [[TMP68]], [[TMP74]]
542; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
543; CHECK:       itofp-sw-epilog:
544; CHECK-NEXT:    [[TMP76:%.*]] = phi i129 [ [[TMP75]], [[ITOFP_SW_DEFAULT]] ], [ [[TMP55]], [[ITOFP_IF_THEN4]] ], [ [[TMP65]], [[ITOFP_SW_BB]] ]
545; CHECK-NEXT:    [[TMP77:%.*]] = trunc i129 [[TMP76]] to i32
546; CHECK-NEXT:    [[TMP78:%.*]] = lshr i32 [[TMP77]], 2
547; CHECK-NEXT:    [[TMP79:%.*]] = and i32 [[TMP78]], 1
548; CHECK-NEXT:    [[TMP80:%.*]] = zext i32 [[TMP79]] to i129
549; CHECK-NEXT:    [[TMP81:%.*]] = or i129 [[TMP76]], [[TMP80]]
550; CHECK-NEXT:    [[TMP82:%.*]] = add i129 [[TMP81]], 1
551; CHECK-NEXT:    [[TMP83:%.*]] = lshr i129 [[TMP82]], 2
552; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP82]], 67108864
553; CHECK-NEXT:    [[TMP84:%.*]] = icmp eq i129 [[A3]], 0
554; CHECK-NEXT:    [[TMP85:%.*]] = trunc i129 [[TMP83]] to i32
555; CHECK-NEXT:    [[TMP86:%.*]] = lshr i129 [[TMP83]], 32
556; CHECK-NEXT:    [[TMP87:%.*]] = trunc i129 [[TMP86]] to i32
557; CHECK-NEXT:    br i1 [[TMP84]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
558; CHECK:       itofp-if-then20:
559; CHECK-NEXT:    [[TMP88:%.*]] = lshr i129 [[TMP82]], 3
560; CHECK-NEXT:    [[TMP89:%.*]] = trunc i129 [[TMP88]] to i32
561; CHECK-NEXT:    [[TMP90:%.*]] = lshr i129 [[TMP88]], 32
562; CHECK-NEXT:    [[TMP91:%.*]] = trunc i129 [[TMP90]] to i32
563; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
564; CHECK:       itofp-if-else:
565; CHECK-NEXT:    [[TMP92:%.*]] = add i32 [[TMP61]], -105
566; CHECK-NEXT:    [[TMP93:%.*]] = zext i32 [[TMP92]] to i129
567; CHECK-NEXT:    [[TMP94:%.*]] = shl i129 [[TMP55]], [[TMP93]]
568; CHECK-NEXT:    [[TMP95:%.*]] = trunc i129 [[TMP94]] to i32
569; CHECK-NEXT:    [[TMP96:%.*]] = lshr i129 [[TMP94]], 32
570; CHECK-NEXT:    [[TMP97:%.*]] = trunc i129 [[TMP96]] to i32
571; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
572; CHECK:       itofp-if-end26:
573; CHECK-NEXT:    [[TMP98:%.*]] = phi i32 [ [[TMP89]], [[ITOFP_IF_THEN20]] ], [ [[TMP85]], [[ITOFP_SW_EPILOG]] ], [ [[TMP95]], [[ITOFP_IF_ELSE]] ]
574; CHECK-NEXT:    [[TMP99:%.*]] = phi i32 [ [[TMP62]], [[ITOFP_IF_THEN20]] ], [ [[TMP63]], [[ITOFP_SW_EPILOG]] ], [ [[TMP63]], [[ITOFP_IF_ELSE]] ]
575; CHECK-NEXT:    [[TMP100:%.*]] = trunc i129 [[TMP57]] to i32
576; CHECK-NEXT:    [[TMP101:%.*]] = and i32 [[TMP100]], -2147483648
577; CHECK-NEXT:    [[TMP102:%.*]] = shl i32 [[TMP99]], 23
578; CHECK-NEXT:    [[TMP103:%.*]] = add i32 [[TMP102]], 1065353216
579; CHECK-NEXT:    [[TMP104:%.*]] = and i32 [[TMP98]], 8388607
580; CHECK-NEXT:    [[TMP105:%.*]] = or i32 [[TMP104]], [[TMP101]]
581; CHECK-NEXT:    [[TMP106:%.*]] = or i32 [[TMP104]], [[TMP103]]
582; CHECK-NEXT:    [[TMP107:%.*]] = bitcast i32 [[TMP106]] to float
583; CHECK-NEXT:    br label [[ITOFP_RETURN]]
584; CHECK:       itofp-return:
585; CHECK-NEXT:    [[TMP108:%.*]] = phi float [ [[TMP107]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_RETURN1]] ]
586; CHECK-NEXT:    [[TMP109:%.*]] = insertelement <2 x float> [[TMP54]], float [[TMP108]], i64 1
587; CHECK-NEXT:    ret <2 x float> [[TMP109]]
588;
589  %conv = uitofp <2 x i129> %a to <2 x float>
590  ret <2 x float> %conv
591}
592