Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / expand-large-fp-convert-si129tofp.ll
blobd68126a39ad24c9b2dea7b0b2c52beda69cb9034
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
4 define half @si129tohalf(i129 %a) {
5 ; CHECK-LABEL: @si129tohalf(
6 ; CHECK-NEXT:  itofp-entry:
7 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
8 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
9 ; CHECK:       itofp-if-end:
10 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
11 ; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
12 ; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
13 ; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP3]], i1 true)
14 ; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
15 ; CHECK-NEXT:    [[TMP6:%.*]] = sub i32 129, [[TMP5]]
16 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 128, [[TMP5]]
17 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i32 [[TMP7]], 24
18 ; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
19 ; CHECK:       itofp-if-then4:
20 ; CHECK-NEXT:    switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
21 ; CHECK-NEXT:    i32 25, label [[ITOFP_SW_BB:%.*]]
22 ; CHECK-NEXT:    i32 26, label [[ITOFP_SW_EPILOG:%.*]]
23 ; CHECK-NEXT:    ]
24 ; CHECK:       itofp-sw-bb:
25 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[TMP3]], 1
26 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
27 ; CHECK:       itofp-sw-default:
28 ; CHECK-NEXT:    [[TMP10:%.*]] = sub i32 103, [[TMP5]]
29 ; CHECK-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
30 ; CHECK-NEXT:    [[TMP12:%.*]] = lshr i129 [[TMP3]], [[TMP11]]
31 ; CHECK-NEXT:    [[TMP13:%.*]] = add i32 [[TMP5]], 26
32 ; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
33 ; CHECK-NEXT:    [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
34 ; CHECK-NEXT:    [[TMP16:%.*]] = and i129 [[TMP15]], [[TMP3]]
35 ; CHECK-NEXT:    [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
36 ; CHECK-NEXT:    [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
37 ; CHECK-NEXT:    [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
38 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
39 ; CHECK:       itofp-sw-epilog:
40 ; CHECK-NEXT:    [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[TMP3]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
41 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
42 ; CHECK-NEXT:    [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
43 ; CHECK-NEXT:    [[TMP23:%.*]] = and i32 [[TMP22]], 1
44 ; CHECK-NEXT:    [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
45 ; CHECK-NEXT:    [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
46 ; CHECK-NEXT:    [[TMP26:%.*]] = add i129 [[TMP25]], 1
47 ; CHECK-NEXT:    [[TMP27:%.*]] = ashr i129 [[TMP26]], 2
48 ; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP26]], 67108864
49 ; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
50 ; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP27]] to i32
51 ; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
52 ; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
53 ; CHECK-NEXT:    br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
54 ; CHECK:       itofp-if-then20:
55 ; CHECK-NEXT:    [[TMP32:%.*]] = ashr i129 [[TMP26]], 3
56 ; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP32]] to i32
57 ; CHECK-NEXT:    [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
58 ; CHECK-NEXT:    [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
59 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
60 ; CHECK:       itofp-if-else:
61 ; CHECK-NEXT:    [[TMP36:%.*]] = add i32 [[TMP5]], -105
62 ; CHECK-NEXT:    [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
63 ; CHECK-NEXT:    [[TMP38:%.*]] = shl i129 [[TMP3]], [[TMP37]]
64 ; CHECK-NEXT:    [[TMP39:%.*]] = trunc i129 [[TMP38]] to i32
65 ; CHECK-NEXT:    [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
66 ; CHECK-NEXT:    [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
67 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
68 ; CHECK:       itofp-if-end26:
69 ; CHECK-NEXT:    [[TMP42:%.*]] = phi i32 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
70 ; CHECK-NEXT:    [[TMP43:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
71 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[TMP1]] to i32
72 ; CHECK-NEXT:    [[TMP45:%.*]] = and i32 [[TMP44]], -2147483648
73 ; CHECK-NEXT:    [[TMP46:%.*]] = shl i32 [[TMP43]], 23
74 ; CHECK-NEXT:    [[TMP47:%.*]] = add i32 [[TMP46]], 1065353216
75 ; CHECK-NEXT:    [[TMP48:%.*]] = and i32 [[TMP42]], 8388607
76 ; CHECK-NEXT:    [[TMP49:%.*]] = or i32 [[TMP48]], [[TMP45]]
77 ; CHECK-NEXT:    [[TMP50:%.*]] = or i32 [[TMP49]], [[TMP47]]
78 ; CHECK-NEXT:    [[TMP51:%.*]] = bitcast i32 [[TMP50]] to float
79 ; CHECK-NEXT:    [[TMP52:%.*]] = fptrunc float [[TMP51]] to half
80 ; CHECK-NEXT:    br label [[ITOFP_RETURN]]
81 ; CHECK:       itofp-return:
82 ; CHECK-NEXT:    [[TMP53:%.*]] = phi half [ [[TMP52]], [[ITOFP_IF_END26]] ], [ 0xH0000, [[ITOFP_ENTRY:%.*]] ]
83 ; CHECK-NEXT:    ret half [[TMP53]]
85   %conv = sitofp i129 %a to half
86   ret half %conv
89 define float @si129tofloat(i129 %a) {
90 ; CHECK-LABEL: @si129tofloat(
91 ; CHECK-NEXT:  itofp-entry:
92 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
93 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
94 ; CHECK:       itofp-if-end:
95 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
96 ; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
97 ; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
98 ; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP3]], i1 true)
99 ; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
100 ; CHECK-NEXT:    [[TMP6:%.*]] = sub i32 129, [[TMP5]]
101 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 128, [[TMP5]]
102 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i32 [[TMP7]], 24
103 ; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
104 ; CHECK:       itofp-if-then4:
105 ; CHECK-NEXT:    switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
106 ; CHECK-NEXT:    i32 25, label [[ITOFP_SW_BB:%.*]]
107 ; CHECK-NEXT:    i32 26, label [[ITOFP_SW_EPILOG:%.*]]
108 ; CHECK-NEXT:    ]
109 ; CHECK:       itofp-sw-bb:
110 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[TMP3]], 1
111 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
112 ; CHECK:       itofp-sw-default:
113 ; CHECK-NEXT:    [[TMP10:%.*]] = sub i32 103, [[TMP5]]
114 ; CHECK-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
115 ; CHECK-NEXT:    [[TMP12:%.*]] = lshr i129 [[TMP3]], [[TMP11]]
116 ; CHECK-NEXT:    [[TMP13:%.*]] = add i32 [[TMP5]], 26
117 ; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
118 ; CHECK-NEXT:    [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
119 ; CHECK-NEXT:    [[TMP16:%.*]] = and i129 [[TMP15]], [[TMP3]]
120 ; CHECK-NEXT:    [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
121 ; CHECK-NEXT:    [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
122 ; CHECK-NEXT:    [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
123 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
124 ; CHECK:       itofp-sw-epilog:
125 ; CHECK-NEXT:    [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[TMP3]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
126 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
127 ; CHECK-NEXT:    [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
128 ; CHECK-NEXT:    [[TMP23:%.*]] = and i32 [[TMP22]], 1
129 ; CHECK-NEXT:    [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
130 ; CHECK-NEXT:    [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
131 ; CHECK-NEXT:    [[TMP26:%.*]] = add i129 [[TMP25]], 1
132 ; CHECK-NEXT:    [[TMP27:%.*]] = ashr i129 [[TMP26]], 2
133 ; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP26]], 67108864
134 ; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
135 ; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP27]] to i32
136 ; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
137 ; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
138 ; CHECK-NEXT:    br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
139 ; CHECK:       itofp-if-then20:
140 ; CHECK-NEXT:    [[TMP32:%.*]] = ashr i129 [[TMP26]], 3
141 ; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP32]] to i32
142 ; CHECK-NEXT:    [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
143 ; CHECK-NEXT:    [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
144 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
145 ; CHECK:       itofp-if-else:
146 ; CHECK-NEXT:    [[TMP36:%.*]] = add i32 [[TMP5]], -105
147 ; CHECK-NEXT:    [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
148 ; CHECK-NEXT:    [[TMP38:%.*]] = shl i129 [[TMP3]], [[TMP37]]
149 ; CHECK-NEXT:    [[TMP39:%.*]] = trunc i129 [[TMP38]] to i32
150 ; CHECK-NEXT:    [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
151 ; CHECK-NEXT:    [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
152 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
153 ; CHECK:       itofp-if-end26:
154 ; CHECK-NEXT:    [[TMP42:%.*]] = phi i32 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
155 ; CHECK-NEXT:    [[TMP43:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
156 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[TMP1]] to i32
157 ; CHECK-NEXT:    [[TMP45:%.*]] = and i32 [[TMP44]], -2147483648
158 ; CHECK-NEXT:    [[TMP46:%.*]] = shl i32 [[TMP43]], 23
159 ; CHECK-NEXT:    [[TMP47:%.*]] = add i32 [[TMP46]], 1065353216
160 ; CHECK-NEXT:    [[TMP48:%.*]] = and i32 [[TMP42]], 8388607
161 ; CHECK-NEXT:    [[TMP49:%.*]] = or i32 [[TMP48]], [[TMP45]]
162 ; CHECK-NEXT:    [[TMP50:%.*]] = or i32 [[TMP49]], [[TMP47]]
163 ; CHECK-NEXT:    [[TMP51:%.*]] = bitcast i32 [[TMP50]] to float
164 ; CHECK-NEXT:    br label [[ITOFP_RETURN]]
165 ; CHECK:       itofp-return:
166 ; CHECK-NEXT:    [[TMP52:%.*]] = phi float [ [[TMP51]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_ENTRY:%.*]] ]
167 ; CHECK-NEXT:    ret float [[TMP52]]
169   %conv = sitofp i129 %a to float
170   ret float %conv
173 define double @si129todouble(i129 %a) {
174 ; CHECK-LABEL: @si129todouble(
175 ; CHECK-NEXT:  itofp-entry:
176 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
177 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
178 ; CHECK:       itofp-if-end:
179 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
180 ; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
181 ; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
182 ; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP3]], i1 true)
183 ; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
184 ; CHECK-NEXT:    [[TMP6:%.*]] = sub i32 129, [[TMP5]]
185 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 128, [[TMP5]]
186 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i32 [[TMP7]], 53
187 ; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
188 ; CHECK:       itofp-if-then4:
189 ; CHECK-NEXT:    switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
190 ; CHECK-NEXT:    i32 54, label [[ITOFP_SW_BB:%.*]]
191 ; CHECK-NEXT:    i32 55, label [[ITOFP_SW_EPILOG:%.*]]
192 ; CHECK-NEXT:    ]
193 ; CHECK:       itofp-sw-bb:
194 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[TMP3]], 1
195 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
196 ; CHECK:       itofp-sw-default:
197 ; CHECK-NEXT:    [[TMP10:%.*]] = sub i32 74, [[TMP5]]
198 ; CHECK-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
199 ; CHECK-NEXT:    [[TMP12:%.*]] = lshr i129 [[TMP3]], [[TMP11]]
200 ; CHECK-NEXT:    [[TMP13:%.*]] = add i32 [[TMP5]], 55
201 ; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
202 ; CHECK-NEXT:    [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
203 ; CHECK-NEXT:    [[TMP16:%.*]] = and i129 [[TMP15]], [[TMP3]]
204 ; CHECK-NEXT:    [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
205 ; CHECK-NEXT:    [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
206 ; CHECK-NEXT:    [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
207 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
208 ; CHECK:       itofp-sw-epilog:
209 ; CHECK-NEXT:    [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[TMP3]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
210 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
211 ; CHECK-NEXT:    [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
212 ; CHECK-NEXT:    [[TMP23:%.*]] = and i32 [[TMP22]], 1
213 ; CHECK-NEXT:    [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
214 ; CHECK-NEXT:    [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
215 ; CHECK-NEXT:    [[TMP26:%.*]] = add i129 [[TMP25]], 1
216 ; CHECK-NEXT:    [[TMP27:%.*]] = ashr i129 [[TMP26]], 2
217 ; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP26]], 36028797018963968
218 ; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
219 ; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP27]] to i64
220 ; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
221 ; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
222 ; CHECK-NEXT:    br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
223 ; CHECK:       itofp-if-then20:
224 ; CHECK-NEXT:    [[TMP32:%.*]] = ashr i129 [[TMP26]], 3
225 ; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP32]] to i64
226 ; CHECK-NEXT:    [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
227 ; CHECK-NEXT:    [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
228 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
229 ; CHECK:       itofp-if-else:
230 ; CHECK-NEXT:    [[TMP36:%.*]] = add i32 [[TMP5]], -76
231 ; CHECK-NEXT:    [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
232 ; CHECK-NEXT:    [[TMP38:%.*]] = shl i129 [[TMP3]], [[TMP37]]
233 ; CHECK-NEXT:    [[TMP39:%.*]] = trunc i129 [[TMP38]] to i64
234 ; CHECK-NEXT:    [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
235 ; CHECK-NEXT:    [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
236 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
237 ; CHECK:       itofp-if-end26:
238 ; CHECK-NEXT:    [[TMP42:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
239 ; CHECK-NEXT:    [[TMP43:%.*]] = phi i32 [ [[TMP35]], [[ITOFP_IF_THEN20]] ], [ [[TMP31]], [[ITOFP_SW_EPILOG]] ], [ [[TMP41]], [[ITOFP_IF_ELSE]] ]
240 ; CHECK-NEXT:    [[TMP44:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
241 ; CHECK-NEXT:    [[TMP45:%.*]] = trunc i129 [[TMP1]] to i32
242 ; CHECK-NEXT:    [[TMP46:%.*]] = and i32 [[TMP45]], -2147483648
243 ; CHECK-NEXT:    [[TMP47:%.*]] = shl i32 [[TMP44]], 20
244 ; CHECK-NEXT:    [[TMP48:%.*]] = add i32 [[TMP47]], 1072693248
245 ; CHECK-NEXT:    [[TMP49:%.*]] = and i32 [[TMP43]], 1048575
246 ; CHECK-NEXT:    [[TMP50:%.*]] = or i32 [[TMP49]], [[TMP46]]
247 ; CHECK-NEXT:    [[TMP51:%.*]] = or i32 [[TMP50]], [[TMP48]]
248 ; CHECK-NEXT:    [[TMP52:%.*]] = zext i32 [[TMP51]] to i64
249 ; CHECK-NEXT:    [[TMP53:%.*]] = shl i64 [[TMP52]], 32
250 ; CHECK-NEXT:    [[TMP54:%.*]] = and i64 [[TMP42]], 4294967295
251 ; CHECK-NEXT:    [[TMP55:%.*]] = or i64 [[TMP53]], [[TMP54]]
252 ; CHECK-NEXT:    [[TMP56:%.*]] = bitcast i64 [[TMP55]] to double
253 ; CHECK-NEXT:    br label [[ITOFP_RETURN]]
254 ; CHECK:       itofp-return:
255 ; CHECK-NEXT:    [[TMP57:%.*]] = phi double [ [[TMP56]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_ENTRY:%.*]] ]
256 ; CHECK-NEXT:    ret double [[TMP57]]
258   %conv = sitofp i129 %a to double
259   ret double %conv
262 define x86_fp80 @si129tox86_fp80(i129 %a) {
263 ; CHECK-LABEL: @si129tox86_fp80(
264 ; CHECK-NEXT:  itofp-entry:
265 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
266 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
267 ; CHECK:       itofp-if-end:
268 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
269 ; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
270 ; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
271 ; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP3]], i1 true)
272 ; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
273 ; CHECK-NEXT:    [[TMP6:%.*]] = sub i129 129, [[TMP4]]
274 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i129 128, [[TMP4]]
275 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i129 [[TMP7]], 113
276 ; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
277 ; CHECK:       itofp-if-then4:
278 ; CHECK-NEXT:    switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
279 ; CHECK-NEXT:    i129 114, label [[ITOFP_SW_BB:%.*]]
280 ; CHECK-NEXT:    i129 115, label [[ITOFP_SW_EPILOG:%.*]]
281 ; CHECK-NEXT:    ]
282 ; CHECK:       itofp-sw-bb:
283 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[TMP3]], 1
284 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
285 ; CHECK:       itofp-sw-default:
286 ; CHECK-NEXT:    [[TMP10:%.*]] = sub i129 14, [[TMP4]]
287 ; CHECK-NEXT:    [[TMP11:%.*]] = lshr i129 [[TMP3]], [[TMP10]]
288 ; CHECK-NEXT:    [[TMP12:%.*]] = add i129 [[TMP4]], 115
289 ; CHECK-NEXT:    [[TMP13:%.*]] = lshr i129 -1, [[TMP12]]
290 ; CHECK-NEXT:    [[TMP14:%.*]] = and i129 [[TMP13]], [[TMP3]]
291 ; CHECK-NEXT:    [[TMP15:%.*]] = icmp ne i129 [[TMP14]], 0
292 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i1 [[TMP15]] to i129
293 ; CHECK-NEXT:    [[TMP17:%.*]] = or i129 [[TMP11]], [[TMP16]]
294 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
295 ; CHECK:       itofp-sw-epilog:
296 ; CHECK-NEXT:    [[TMP18:%.*]] = phi i129 [ [[TMP17]], [[ITOFP_SW_DEFAULT]] ], [ [[TMP3]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
297 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i129 [[TMP18]] to i32
298 ; CHECK-NEXT:    [[TMP20:%.*]] = lshr i32 [[TMP19]], 2
299 ; CHECK-NEXT:    [[TMP21:%.*]] = and i32 [[TMP20]], 1
300 ; CHECK-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i129
301 ; CHECK-NEXT:    [[TMP23:%.*]] = or i129 [[TMP18]], [[TMP22]]
302 ; CHECK-NEXT:    [[TMP24:%.*]] = add i129 [[TMP23]], 1
303 ; CHECK-NEXT:    [[TMP25:%.*]] = ashr i129 [[TMP24]], 2
304 ; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP24]], 41538374868278621028243970633760768
305 ; CHECK-NEXT:    [[TMP26:%.*]] = icmp eq i129 [[A3]], 0
306 ; CHECK-NEXT:    [[TMP27:%.*]] = trunc i129 [[TMP25]] to i128
307 ; CHECK-NEXT:    [[TMP28:%.*]] = lshr i129 [[TMP25]], 32
308 ; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP7]] to i64
309 ; CHECK-NEXT:    br i1 [[TMP26]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
310 ; CHECK:       itofp-if-then20:
311 ; CHECK-NEXT:    [[TMP30:%.*]] = ashr i129 [[TMP24]], 3
312 ; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i128
313 ; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP30]], 32
314 ; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
315 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
316 ; CHECK:       itofp-if-else:
317 ; CHECK-NEXT:    [[TMP34:%.*]] = add i129 [[TMP4]], 4294967280
318 ; CHECK-NEXT:    [[TMP35:%.*]] = shl i129 [[TMP3]], [[TMP34]]
319 ; CHECK-NEXT:    [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
320 ; CHECK-NEXT:    [[TMP37:%.*]] = lshr i129 [[TMP35]], 32
321 ; CHECK-NEXT:    [[TMP38:%.*]] = trunc i129 [[TMP7]] to i64
322 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
323 ; CHECK:       itofp-if-end26:
324 ; CHECK-NEXT:    [[TMP39:%.*]] = phi i128 [ [[TMP31]], [[ITOFP_IF_THEN20]] ], [ [[TMP27]], [[ITOFP_SW_EPILOG]] ], [ [[TMP36]], [[ITOFP_IF_ELSE]] ]
325 ; CHECK-NEXT:    [[TMP40:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP38]], [[ITOFP_IF_ELSE]] ]
326 ; CHECK-NEXT:    [[AND29:%.*]] = and i129 [[TMP1]], 9223372036854775808
327 ; CHECK-NEXT:    [[TMP41:%.*]] = shl i64 [[TMP40]], 48
328 ; CHECK-NEXT:    [[TMP42:%.*]] = add i64 [[TMP41]], 4611404543450677248
329 ; CHECK-NEXT:    [[TMP43:%.*]] = zext i64 [[TMP42]] to i128
330 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[AND29]] to i128
331 ; CHECK-NEXT:    [[TMP45:%.*]] = or i128 [[TMP44]], [[TMP43]]
332 ; CHECK-NEXT:    [[TMP46:%.*]] = shl i128 [[TMP45]], 64
333 ; CHECK-NEXT:    [[TMP47:%.*]] = and i128 [[TMP39]], 5192296858534827628530496329220095
334 ; CHECK-NEXT:    [[TMP48:%.*]] = or i128 [[TMP46]], [[TMP47]]
335 ; CHECK-NEXT:    [[TMP49:%.*]] = bitcast i128 [[TMP48]] to fp128
336 ; CHECK-NEXT:    [[TMP50:%.*]] = fptrunc fp128 [[TMP49]] to x86_fp80
337 ; CHECK-NEXT:    br label [[ITOFP_RETURN]]
338 ; CHECK:       itofp-return:
339 ; CHECK-NEXT:    [[TMP51:%.*]] = phi x86_fp80 [ [[TMP50]], [[ITOFP_IF_END26]] ], [ 0xK00000000000000000000, [[ITOFP_ENTRY:%.*]] ]
340 ; CHECK-NEXT:    ret x86_fp80 [[TMP51]]
342   %conv = sitofp i129 %a to x86_fp80
343   ret x86_fp80 %conv
346 define fp128 @si129tofp128(i129 %a) {
347 ; CHECK-LABEL: @si129tofp128(
348 ; CHECK-NEXT:  itofp-entry:
349 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
350 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
351 ; CHECK:       itofp-if-end:
352 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
353 ; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
354 ; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
355 ; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP3]], i1 true)
356 ; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
357 ; CHECK-NEXT:    [[TMP6:%.*]] = sub i129 129, [[TMP4]]
358 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i129 128, [[TMP4]]
359 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i129 [[TMP7]], 113
360 ; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
361 ; CHECK:       itofp-if-then4:
362 ; CHECK-NEXT:    switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
363 ; CHECK-NEXT:    i129 114, label [[ITOFP_SW_BB:%.*]]
364 ; CHECK-NEXT:    i129 115, label [[ITOFP_SW_EPILOG:%.*]]
365 ; CHECK-NEXT:    ]
366 ; CHECK:       itofp-sw-bb:
367 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[TMP3]], 1
368 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
369 ; CHECK:       itofp-sw-default:
370 ; CHECK-NEXT:    [[TMP10:%.*]] = sub i129 14, [[TMP4]]
371 ; CHECK-NEXT:    [[TMP11:%.*]] = lshr i129 [[TMP3]], [[TMP10]]
372 ; CHECK-NEXT:    [[TMP12:%.*]] = add i129 [[TMP4]], 115
373 ; CHECK-NEXT:    [[TMP13:%.*]] = lshr i129 -1, [[TMP12]]
374 ; CHECK-NEXT:    [[TMP14:%.*]] = and i129 [[TMP13]], [[TMP3]]
375 ; CHECK-NEXT:    [[TMP15:%.*]] = icmp ne i129 [[TMP14]], 0
376 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i1 [[TMP15]] to i129
377 ; CHECK-NEXT:    [[TMP17:%.*]] = or i129 [[TMP11]], [[TMP16]]
378 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
379 ; CHECK:       itofp-sw-epilog:
380 ; CHECK-NEXT:    [[TMP18:%.*]] = phi i129 [ [[TMP17]], [[ITOFP_SW_DEFAULT]] ], [ [[TMP3]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
381 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i129 [[TMP18]] to i32
382 ; CHECK-NEXT:    [[TMP20:%.*]] = lshr i32 [[TMP19]], 2
383 ; CHECK-NEXT:    [[TMP21:%.*]] = and i32 [[TMP20]], 1
384 ; CHECK-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i129
385 ; CHECK-NEXT:    [[TMP23:%.*]] = or i129 [[TMP18]], [[TMP22]]
386 ; CHECK-NEXT:    [[TMP24:%.*]] = add i129 [[TMP23]], 1
387 ; CHECK-NEXT:    [[TMP25:%.*]] = ashr i129 [[TMP24]], 2
388 ; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP24]], 41538374868278621028243970633760768
389 ; CHECK-NEXT:    [[TMP26:%.*]] = icmp eq i129 [[A3]], 0
390 ; CHECK-NEXT:    [[TMP27:%.*]] = trunc i129 [[TMP25]] to i128
391 ; CHECK-NEXT:    [[TMP28:%.*]] = lshr i129 [[TMP25]], 32
392 ; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP7]] to i64
393 ; CHECK-NEXT:    br i1 [[TMP26]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
394 ; CHECK:       itofp-if-then20:
395 ; CHECK-NEXT:    [[TMP30:%.*]] = ashr i129 [[TMP24]], 3
396 ; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i128
397 ; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP30]], 32
398 ; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
399 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
400 ; CHECK:       itofp-if-else:
401 ; CHECK-NEXT:    [[TMP34:%.*]] = add i129 [[TMP4]], 4294967280
402 ; CHECK-NEXT:    [[TMP35:%.*]] = shl i129 [[TMP3]], [[TMP34]]
403 ; CHECK-NEXT:    [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
404 ; CHECK-NEXT:    [[TMP37:%.*]] = lshr i129 [[TMP35]], 32
405 ; CHECK-NEXT:    [[TMP38:%.*]] = trunc i129 [[TMP7]] to i64
406 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
407 ; CHECK:       itofp-if-end26:
408 ; CHECK-NEXT:    [[TMP39:%.*]] = phi i128 [ [[TMP31]], [[ITOFP_IF_THEN20]] ], [ [[TMP27]], [[ITOFP_SW_EPILOG]] ], [ [[TMP36]], [[ITOFP_IF_ELSE]] ]
409 ; CHECK-NEXT:    [[TMP40:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP38]], [[ITOFP_IF_ELSE]] ]
410 ; CHECK-NEXT:    [[AND29:%.*]] = and i129 [[TMP1]], 9223372036854775808
411 ; CHECK-NEXT:    [[TMP41:%.*]] = shl i64 [[TMP40]], 48
412 ; CHECK-NEXT:    [[TMP42:%.*]] = add i64 [[TMP41]], 4611404543450677248
413 ; CHECK-NEXT:    [[TMP43:%.*]] = zext i64 [[TMP42]] to i128
414 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[AND29]] to i128
415 ; CHECK-NEXT:    [[TMP45:%.*]] = or i128 [[TMP44]], [[TMP43]]
416 ; CHECK-NEXT:    [[TMP46:%.*]] = shl i128 [[TMP45]], 64
417 ; CHECK-NEXT:    [[TMP47:%.*]] = and i128 [[TMP39]], 5192296858534827628530496329220095
418 ; CHECK-NEXT:    [[TMP48:%.*]] = or i128 [[TMP46]], [[TMP47]]
419 ; CHECK-NEXT:    [[TMP49:%.*]] = bitcast i128 [[TMP48]] to fp128
420 ; CHECK-NEXT:    br label [[ITOFP_RETURN]]
421 ; CHECK:       itofp-return:
422 ; CHECK-NEXT:    [[TMP50:%.*]] = phi fp128 [ [[TMP49]], [[ITOFP_IF_END26]] ], [ 0xL00000000000000000000000000000000, [[ITOFP_ENTRY:%.*]] ]
423 ; CHECK-NEXT:    ret fp128 [[TMP50]]
425   %conv = sitofp i129 %a to fp128
426   ret fp128 %conv