Skip to content

Commit 87e1cbb

Browse files
committed
[IR] Change fp128 lowering to use f128 functions by default
LLVM currently emits calls to `*l` (`long double`) libm symbols for `fp128` intrinsics. This works on platforms where `long double` and `_Float128` are the same type, but is incorrect on many platforms. Change RuntimeLibcalls such that `*f128` libcalls are used by default, which is always safe and correct but may not be available. On platforms where it is likely that `sqrtf128` and similar are not available, keep the current behavior of lowering to `*l` symbols if `long double` is `binary128`. The logic for whether f128 is `long double` is based on the platforms in Clang that set `LongDoubleFormat` to `llvm::APFloat::IEEEquad`. Fixes llvm#44744
1 parent 8054680 commit 87e1cbb

File tree

7 files changed

+183
-141
lines changed

7 files changed

+183
-141
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.def

+51-50
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ HANDLE_LIBCALL(CTPOP_I32, "__popcountsi2")
8989
HANDLE_LIBCALL(CTPOP_I64, "__popcountdi2")
9090
HANDLE_LIBCALL(CTPOP_I128, "__popcountti2")
9191

92-
// Floating-point
92+
// Floating-point. Note that new fp128 math routines should also be added to
93+
// setF128LibcallFormat in RuntimeLibcalls.cpp.
9394
HANDLE_LIBCALL(ADD_F32, "__addsf3")
9495
HANDLE_LIBCALL(ADD_F64, "__adddf3")
9596
HANDLE_LIBCALL(ADD_F80, "__addxf3")
@@ -113,12 +114,12 @@ HANDLE_LIBCALL(DIV_PPCF128, "__gcc_qdiv")
113114
HANDLE_LIBCALL(REM_F32, "fmodf")
114115
HANDLE_LIBCALL(REM_F64, "fmod")
115116
HANDLE_LIBCALL(REM_F80, "fmodl")
116-
HANDLE_LIBCALL(REM_F128, "fmodl")
117+
HANDLE_LIBCALL(REM_F128, "fmodf128")
117118
HANDLE_LIBCALL(REM_PPCF128, "fmodl")
118119
HANDLE_LIBCALL(FMA_F32, "fmaf")
119120
HANDLE_LIBCALL(FMA_F64, "fma")
120121
HANDLE_LIBCALL(FMA_F80, "fmal")
121-
HANDLE_LIBCALL(FMA_F128, "fmal")
122+
HANDLE_LIBCALL(FMA_F128, "fmaf128")
122123
HANDLE_LIBCALL(FMA_PPCF128, "fmal")
123124
HANDLE_LIBCALL(POWI_F32, "__powisf2")
124125
HANDLE_LIBCALL(POWI_F64, "__powidf2")
@@ -128,117 +129,117 @@ HANDLE_LIBCALL(POWI_PPCF128, "__powitf2")
128129
HANDLE_LIBCALL(SQRT_F32, "sqrtf")
129130
HANDLE_LIBCALL(SQRT_F64, "sqrt")
130131
HANDLE_LIBCALL(SQRT_F80, "sqrtl")
131-
HANDLE_LIBCALL(SQRT_F128, "sqrtl")
132+
HANDLE_LIBCALL(SQRT_F128, "sqrtf128")
132133
HANDLE_LIBCALL(SQRT_PPCF128, "sqrtl")
133134
HANDLE_LIBCALL(CBRT_F32, "cbrtf")
134135
HANDLE_LIBCALL(CBRT_F64, "cbrt")
135136
HANDLE_LIBCALL(CBRT_F80, "cbrtl")
136-
HANDLE_LIBCALL(CBRT_F128, "cbrtl")
137+
HANDLE_LIBCALL(CBRT_F128, "cbrtf128")
137138
HANDLE_LIBCALL(CBRT_PPCF128, "cbrtl")
138139
HANDLE_LIBCALL(LOG_F32, "logf")
139140
HANDLE_LIBCALL(LOG_F64, "log")
140141
HANDLE_LIBCALL(LOG_F80, "logl")
141-
HANDLE_LIBCALL(LOG_F128, "logl")
142+
HANDLE_LIBCALL(LOG_F128, "logf128")
142143
HANDLE_LIBCALL(LOG_PPCF128, "logl")
143144
HANDLE_LIBCALL(LOG_FINITE_F32, "__logf_finite")
144145
HANDLE_LIBCALL(LOG_FINITE_F64, "__log_finite")
145146
HANDLE_LIBCALL(LOG_FINITE_F80, "__logl_finite")
146-
HANDLE_LIBCALL(LOG_FINITE_F128, "__logl_finite")
147+
HANDLE_LIBCALL(LOG_FINITE_F128, "__logf128_finite")
147148
HANDLE_LIBCALL(LOG_FINITE_PPCF128, "__logl_finite")
148149
HANDLE_LIBCALL(LOG2_F32, "log2f")
149150
HANDLE_LIBCALL(LOG2_F64, "log2")
150151
HANDLE_LIBCALL(LOG2_F80, "log2l")
151-
HANDLE_LIBCALL(LOG2_F128, "log2l")
152+
HANDLE_LIBCALL(LOG2_F128, "log2f128")
152153
HANDLE_LIBCALL(LOG2_PPCF128, "log2l")
153154
HANDLE_LIBCALL(LOG2_FINITE_F32, "__log2f_finite")
154155
HANDLE_LIBCALL(LOG2_FINITE_F64, "__log2_finite")
155156
HANDLE_LIBCALL(LOG2_FINITE_F80, "__log2l_finite")
156-
HANDLE_LIBCALL(LOG2_FINITE_F128, "__log2l_finite")
157+
HANDLE_LIBCALL(LOG2_FINITE_F128, "__log2f128_finite")
157158
HANDLE_LIBCALL(LOG2_FINITE_PPCF128, "__log2l_finite")
158159
HANDLE_LIBCALL(LOG10_F32, "log10f")
159160
HANDLE_LIBCALL(LOG10_F64, "log10")
160161
HANDLE_LIBCALL(LOG10_F80, "log10l")
161-
HANDLE_LIBCALL(LOG10_F128, "log10l")
162+
HANDLE_LIBCALL(LOG10_F128, "log10f128")
162163
HANDLE_LIBCALL(LOG10_PPCF128, "log10l")
163164
HANDLE_LIBCALL(LOG10_FINITE_F32, "__log10f_finite")
164165
HANDLE_LIBCALL(LOG10_FINITE_F64, "__log10_finite")
165166
HANDLE_LIBCALL(LOG10_FINITE_F80, "__log10l_finite")
166-
HANDLE_LIBCALL(LOG10_FINITE_F128, "__log10l_finite")
167+
HANDLE_LIBCALL(LOG10_FINITE_F128, "__log10f128_finite")
167168
HANDLE_LIBCALL(LOG10_FINITE_PPCF128, "__log10l_finite")
168169
HANDLE_LIBCALL(EXP_F32, "expf")
169170
HANDLE_LIBCALL(EXP_F64, "exp")
170171
HANDLE_LIBCALL(EXP_F80, "expl")
171-
HANDLE_LIBCALL(EXP_F128, "expl")
172+
HANDLE_LIBCALL(EXP_F128, "expf128")
172173
HANDLE_LIBCALL(EXP_PPCF128, "expl")
173174
HANDLE_LIBCALL(EXP_FINITE_F32, "__expf_finite")
174175
HANDLE_LIBCALL(EXP_FINITE_F64, "__exp_finite")
175176
HANDLE_LIBCALL(EXP_FINITE_F80, "__expl_finite")
176-
HANDLE_LIBCALL(EXP_FINITE_F128, "__expl_finite")
177+
HANDLE_LIBCALL(EXP_FINITE_F128, "__expf128_finite")
177178
HANDLE_LIBCALL(EXP_FINITE_PPCF128, "__expl_finite")
178179
HANDLE_LIBCALL(EXP2_F32, "exp2f")
179180
HANDLE_LIBCALL(EXP2_F64, "exp2")
180181
HANDLE_LIBCALL(EXP2_F80, "exp2l")
181-
HANDLE_LIBCALL(EXP2_F128, "exp2l")
182+
HANDLE_LIBCALL(EXP2_F128, "exp2f128")
182183
HANDLE_LIBCALL(EXP2_PPCF128, "exp2l")
183184
HANDLE_LIBCALL(EXP2_FINITE_F32, "__exp2f_finite")
184185
HANDLE_LIBCALL(EXP2_FINITE_F64, "__exp2_finite")
185186
HANDLE_LIBCALL(EXP2_FINITE_F80, "__exp2l_finite")
186-
HANDLE_LIBCALL(EXP2_FINITE_F128, "__exp2l_finite")
187+
HANDLE_LIBCALL(EXP2_FINITE_F128, "__exp2f128_finite")
187188
HANDLE_LIBCALL(EXP2_FINITE_PPCF128, "__exp2l_finite")
188189
HANDLE_LIBCALL(EXP10_F32, "exp10f")
189190
HANDLE_LIBCALL(EXP10_F64, "exp10")
190191
HANDLE_LIBCALL(EXP10_F80, "exp10l")
191-
HANDLE_LIBCALL(EXP10_F128, "exp10l")
192+
HANDLE_LIBCALL(EXP10_F128, "exp10f128")
192193
HANDLE_LIBCALL(EXP10_PPCF128, "exp10l")
193194
HANDLE_LIBCALL(SIN_F32, "sinf")
194195
HANDLE_LIBCALL(SIN_F64, "sin")
195196
HANDLE_LIBCALL(SIN_F80, "sinl")
196-
HANDLE_LIBCALL(SIN_F128, "sinl")
197+
HANDLE_LIBCALL(SIN_F128, "sinf128")
197198
HANDLE_LIBCALL(SIN_PPCF128, "sinl")
198199
HANDLE_LIBCALL(COS_F32, "cosf")
199200
HANDLE_LIBCALL(COS_F64, "cos")
200201
HANDLE_LIBCALL(COS_F80, "cosl")
201-
HANDLE_LIBCALL(COS_F128, "cosl")
202+
HANDLE_LIBCALL(COS_F128, "cosf128")
202203
HANDLE_LIBCALL(COS_PPCF128, "cosl")
203204
HANDLE_LIBCALL(TAN_F32, "tanf")
204205
HANDLE_LIBCALL(TAN_F64, "tan")
205206
HANDLE_LIBCALL(TAN_F80, "tanl")
206-
HANDLE_LIBCALL(TAN_F128,"tanl")
207+
HANDLE_LIBCALL(TAN_F128,"tanf128")
207208
HANDLE_LIBCALL(TAN_PPCF128, "tanl")
208209
HANDLE_LIBCALL(SINH_F32, "sinhf")
209210
HANDLE_LIBCALL(SINH_F64, "sinh")
210211
HANDLE_LIBCALL(SINH_F80, "sinhl")
211-
HANDLE_LIBCALL(SINH_F128, "sinhl")
212+
HANDLE_LIBCALL(SINH_F128, "sinhf128")
212213
HANDLE_LIBCALL(SINH_PPCF128, "sinhl")
213214
HANDLE_LIBCALL(COSH_F32, "coshf")
214215
HANDLE_LIBCALL(COSH_F64, "cosh")
215216
HANDLE_LIBCALL(COSH_F80, "coshl")
216-
HANDLE_LIBCALL(COSH_F128, "coshl")
217+
HANDLE_LIBCALL(COSH_F128, "coshf128")
217218
HANDLE_LIBCALL(COSH_PPCF128, "coshl")
218219
HANDLE_LIBCALL(TANH_F32, "tanhf")
219220
HANDLE_LIBCALL(TANH_F64, "tanh")
220221
HANDLE_LIBCALL(TANH_F80, "tanhl")
221-
HANDLE_LIBCALL(TANH_F128,"tanhl")
222+
HANDLE_LIBCALL(TANH_F128,"tanhf128")
222223
HANDLE_LIBCALL(TANH_PPCF128, "tanhl")
223224
HANDLE_LIBCALL(ASIN_F32, "asinf")
224225
HANDLE_LIBCALL(ASIN_F64, "asin")
225226
HANDLE_LIBCALL(ASIN_F80, "asinl")
226-
HANDLE_LIBCALL(ASIN_F128, "asinl")
227+
HANDLE_LIBCALL(ASIN_F128, "asinf128")
227228
HANDLE_LIBCALL(ASIN_PPCF128, "asinl")
228229
HANDLE_LIBCALL(ACOS_F32, "acosf")
229230
HANDLE_LIBCALL(ACOS_F64, "acos")
230231
HANDLE_LIBCALL(ACOS_F80, "acosl")
231-
HANDLE_LIBCALL(ACOS_F128, "acosl")
232+
HANDLE_LIBCALL(ACOS_F128, "acosf128")
232233
HANDLE_LIBCALL(ACOS_PPCF128, "acosl")
233234
HANDLE_LIBCALL(ATAN_F32, "atanf")
234235
HANDLE_LIBCALL(ATAN_F64, "atan")
235236
HANDLE_LIBCALL(ATAN_F80, "atanl")
236-
HANDLE_LIBCALL(ATAN_F128,"atanl")
237+
HANDLE_LIBCALL(ATAN_F128,"atanf128")
237238
HANDLE_LIBCALL(ATAN_PPCF128, "atanl")
238239
HANDLE_LIBCALL(ATAN2_F32, "atan2f")
239240
HANDLE_LIBCALL(ATAN2_F64, "atan2")
240241
HANDLE_LIBCALL(ATAN2_F80, "atan2l")
241-
HANDLE_LIBCALL(ATAN2_F128,"atan2l")
242+
HANDLE_LIBCALL(ATAN2_F128,"atan2f128")
242243
HANDLE_LIBCALL(ATAN2_PPCF128, "atan2l")
243244
HANDLE_LIBCALL(SINCOS_F32, nullptr)
244245
HANDLE_LIBCALL(SINCOS_F64, nullptr)
@@ -250,122 +251,122 @@ HANDLE_LIBCALL(SINCOS_STRET_F64, nullptr)
250251
HANDLE_LIBCALL(POW_F32, "powf")
251252
HANDLE_LIBCALL(POW_F64, "pow")
252253
HANDLE_LIBCALL(POW_F80, "powl")
253-
HANDLE_LIBCALL(POW_F128, "powl")
254+
HANDLE_LIBCALL(POW_F128, "powf128")
254255
HANDLE_LIBCALL(POW_PPCF128, "powl")
255256
HANDLE_LIBCALL(POW_FINITE_F32, "__powf_finite")
256257
HANDLE_LIBCALL(POW_FINITE_F64, "__pow_finite")
257258
HANDLE_LIBCALL(POW_FINITE_F80, "__powl_finite")
258-
HANDLE_LIBCALL(POW_FINITE_F128, "__powl_finite")
259+
HANDLE_LIBCALL(POW_FINITE_F128, "__powf128_finite")
259260
HANDLE_LIBCALL(POW_FINITE_PPCF128, "__powl_finite")
260261
HANDLE_LIBCALL(CEIL_F32, "ceilf")
261262
HANDLE_LIBCALL(CEIL_F64, "ceil")
262263
HANDLE_LIBCALL(CEIL_F80, "ceill")
263-
HANDLE_LIBCALL(CEIL_F128, "ceill")
264+
HANDLE_LIBCALL(CEIL_F128, "ceilf128")
264265
HANDLE_LIBCALL(CEIL_PPCF128, "ceill")
265266
HANDLE_LIBCALL(TRUNC_F32, "truncf")
266267
HANDLE_LIBCALL(TRUNC_F64, "trunc")
267268
HANDLE_LIBCALL(TRUNC_F80, "truncl")
268-
HANDLE_LIBCALL(TRUNC_F128, "truncl")
269+
HANDLE_LIBCALL(TRUNC_F128, "truncf128")
269270
HANDLE_LIBCALL(TRUNC_PPCF128, "truncl")
270271
HANDLE_LIBCALL(RINT_F32, "rintf")
271272
HANDLE_LIBCALL(RINT_F64, "rint")
272273
HANDLE_LIBCALL(RINT_F80, "rintl")
273-
HANDLE_LIBCALL(RINT_F128, "rintl")
274+
HANDLE_LIBCALL(RINT_F128, "rintf128")
274275
HANDLE_LIBCALL(RINT_PPCF128, "rintl")
275276
HANDLE_LIBCALL(NEARBYINT_F32, "nearbyintf")
276277
HANDLE_LIBCALL(NEARBYINT_F64, "nearbyint")
277278
HANDLE_LIBCALL(NEARBYINT_F80, "nearbyintl")
278-
HANDLE_LIBCALL(NEARBYINT_F128, "nearbyintl")
279+
HANDLE_LIBCALL(NEARBYINT_F128, "nearbyintf128")
279280
HANDLE_LIBCALL(NEARBYINT_PPCF128, "nearbyintl")
280281
HANDLE_LIBCALL(ROUND_F32, "roundf")
281282
HANDLE_LIBCALL(ROUND_F64, "round")
282283
HANDLE_LIBCALL(ROUND_F80, "roundl")
283-
HANDLE_LIBCALL(ROUND_F128, "roundl")
284+
HANDLE_LIBCALL(ROUND_F128, "roundf128")
284285
HANDLE_LIBCALL(ROUND_PPCF128, "roundl")
285286
HANDLE_LIBCALL(ROUNDEVEN_F32, "roundevenf")
286287
HANDLE_LIBCALL(ROUNDEVEN_F64, "roundeven")
287288
HANDLE_LIBCALL(ROUNDEVEN_F80, "roundevenl")
288-
HANDLE_LIBCALL(ROUNDEVEN_F128, "roundevenl")
289+
HANDLE_LIBCALL(ROUNDEVEN_F128, "roundevenf128")
289290
HANDLE_LIBCALL(ROUNDEVEN_PPCF128, "roundevenl")
290291
HANDLE_LIBCALL(FLOOR_F32, "floorf")
291292
HANDLE_LIBCALL(FLOOR_F64, "floor")
292293
HANDLE_LIBCALL(FLOOR_F80, "floorl")
293-
HANDLE_LIBCALL(FLOOR_F128, "floorl")
294+
HANDLE_LIBCALL(FLOOR_F128, "floorf128")
294295
HANDLE_LIBCALL(FLOOR_PPCF128, "floorl")
295296
HANDLE_LIBCALL(COPYSIGN_F32, "copysignf")
296297
HANDLE_LIBCALL(COPYSIGN_F64, "copysign")
297298
HANDLE_LIBCALL(COPYSIGN_F80, "copysignl")
298-
HANDLE_LIBCALL(COPYSIGN_F128, "copysignl")
299+
HANDLE_LIBCALL(COPYSIGN_F128, "copysignf128")
299300
HANDLE_LIBCALL(COPYSIGN_PPCF128, "copysignl")
300301
HANDLE_LIBCALL(FMIN_F32, "fminf")
301302
HANDLE_LIBCALL(FMIN_F64, "fmin")
302303
HANDLE_LIBCALL(FMIN_F80, "fminl")
303-
HANDLE_LIBCALL(FMIN_F128, "fminl")
304+
HANDLE_LIBCALL(FMIN_F128, "fminf128")
304305
HANDLE_LIBCALL(FMIN_PPCF128, "fminl")
305306
HANDLE_LIBCALL(FMAX_F32, "fmaxf")
306307
HANDLE_LIBCALL(FMAX_F64, "fmax")
307308
HANDLE_LIBCALL(FMAX_F80, "fmaxl")
308-
HANDLE_LIBCALL(FMAX_F128, "fmaxl")
309+
HANDLE_LIBCALL(FMAX_F128, "fmaxf128")
309310
HANDLE_LIBCALL(FMAX_PPCF128, "fmaxl")
310311
HANDLE_LIBCALL(FMINIMUM_F32, "fminimumf")
311312
HANDLE_LIBCALL(FMINIMUM_F64, "fminimum")
312313
HANDLE_LIBCALL(FMINIMUM_F80, "fminimuml")
313-
HANDLE_LIBCALL(FMINIMUM_F128, "fminimuml")
314+
HANDLE_LIBCALL(FMINIMUM_F128, "fminimumf128")
314315
HANDLE_LIBCALL(FMINIMUM_PPCF128, "fminimuml")
315316
HANDLE_LIBCALL(FMAXIMUM_F32, "fmaximumf")
316317
HANDLE_LIBCALL(FMAXIMUM_F64, "fmaximum")
317318
HANDLE_LIBCALL(FMAXIMUM_F80, "fmaximuml")
318-
HANDLE_LIBCALL(FMAXIMUM_F128, "fmaximuml")
319+
HANDLE_LIBCALL(FMAXIMUM_F128, "fmaximumf128")
319320
HANDLE_LIBCALL(FMAXIMUM_PPCF128, "fmaximum_numl")
320321
HANDLE_LIBCALL(FMINIMUMNUM_F32, "fminimum_numf")
321322
HANDLE_LIBCALL(FMINIMUMNUM_F64, "fminimum_num")
322323
HANDLE_LIBCALL(FMINIMUMNUM_F80, "fminimum_numl")
323-
HANDLE_LIBCALL(FMINIMUMNUM_F128, "fminimum_numl")
324+
HANDLE_LIBCALL(FMINIMUMNUM_F128, "fminimum_numf128")
324325
HANDLE_LIBCALL(FMINIMUMNUM_PPCF128, "fminimum_numl")
325326
HANDLE_LIBCALL(FMAXIMUMNUM_F32, "fmaximum_numf")
326327
HANDLE_LIBCALL(FMAXIMUMNUM_F64, "fmaximum_num")
327328
HANDLE_LIBCALL(FMAXIMUMNUM_F80, "fmaximum_numl")
328-
HANDLE_LIBCALL(FMAXIMUMNUM_F128, "fmaximum_numl")
329+
HANDLE_LIBCALL(FMAXIMUMNUM_F128, "fmaximum_numf128")
329330
HANDLE_LIBCALL(FMAXIMUMNUM_PPCF128, "fmaximum_numl")
330331
HANDLE_LIBCALL(LROUND_F32, "lroundf")
331332
HANDLE_LIBCALL(LROUND_F64, "lround")
332333
HANDLE_LIBCALL(LROUND_F80, "lroundl")
333-
HANDLE_LIBCALL(LROUND_F128, "lroundl")
334+
HANDLE_LIBCALL(LROUND_F128, "lroundf128")
334335
HANDLE_LIBCALL(LROUND_PPCF128, "lroundl")
335336
HANDLE_LIBCALL(LLROUND_F32, "llroundf")
336337
HANDLE_LIBCALL(LLROUND_F64, "llround")
337338
HANDLE_LIBCALL(LLROUND_F80, "llroundl")
338-
HANDLE_LIBCALL(LLROUND_F128, "llroundl")
339+
HANDLE_LIBCALL(LLROUND_F128, "llroundf128")
339340
HANDLE_LIBCALL(LLROUND_PPCF128, "llroundl")
340341
HANDLE_LIBCALL(LRINT_F32, "lrintf")
341342
HANDLE_LIBCALL(LRINT_F64, "lrint")
342343
HANDLE_LIBCALL(LRINT_F80, "lrintl")
343-
HANDLE_LIBCALL(LRINT_F128, "lrintl")
344+
HANDLE_LIBCALL(LRINT_F128, "lrintf128")
344345
HANDLE_LIBCALL(LRINT_PPCF128, "lrintl")
345346
HANDLE_LIBCALL(LLRINT_F32, "llrintf")
346347
HANDLE_LIBCALL(LLRINT_F64, "llrint")
347348
HANDLE_LIBCALL(LLRINT_F80, "llrintl")
348-
HANDLE_LIBCALL(LLRINT_F128, "llrintl")
349+
HANDLE_LIBCALL(LLRINT_F128, "llrintf128")
349350
HANDLE_LIBCALL(LLRINT_PPCF128, "llrintl")
350351
HANDLE_LIBCALL(LDEXP_F32, "ldexpf")
351352
HANDLE_LIBCALL(LDEXP_F64, "ldexp")
352353
HANDLE_LIBCALL(LDEXP_F80, "ldexpl")
353-
HANDLE_LIBCALL(LDEXP_F128, "ldexpl")
354+
HANDLE_LIBCALL(LDEXP_F128, "ldexpf128")
354355
HANDLE_LIBCALL(LDEXP_PPCF128, "ldexpl")
355356
HANDLE_LIBCALL(FREXP_F32, "frexpf")
356357
HANDLE_LIBCALL(FREXP_F64, "frexp")
357358
HANDLE_LIBCALL(FREXP_F80, "frexpl")
358-
HANDLE_LIBCALL(FREXP_F128, "frexpl")
359+
HANDLE_LIBCALL(FREXP_F128, "frexpf128")
359360
HANDLE_LIBCALL(FREXP_PPCF128, "frexpl")
360361
HANDLE_LIBCALL(SINCOSPI_F32, "sincospif")
361362
HANDLE_LIBCALL(SINCOSPI_F64, "sincospi")
362363
HANDLE_LIBCALL(SINCOSPI_F80, "sincospil")
363-
HANDLE_LIBCALL(SINCOSPI_F128, "sincospil")
364+
HANDLE_LIBCALL(SINCOSPI_F128, "sincospif128")
364365
HANDLE_LIBCALL(SINCOSPI_PPCF128, "sincospil")
365366
HANDLE_LIBCALL(MODF_F32, "modff")
366367
HANDLE_LIBCALL(MODF_F64, "modf")
367368
HANDLE_LIBCALL(MODF_F80, "modfl")
368-
HANDLE_LIBCALL(MODF_F128, "modfl")
369+
HANDLE_LIBCALL(MODF_F128, "modff128")
369370
HANDLE_LIBCALL(MODF_PPCF128, "modfl")
370371

371372
// Floating point environment

llvm/include/llvm/IR/RuntimeLibcalls.h

+18
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@
2020
#include "llvm/TargetParser/Triple.h"
2121

2222
namespace llvm {
23+
24+
/// Library names to use for `fp128` libcalls.
25+
enum class F128LibcallFormat {
26+
/// C23 `*f128` lowering, e.g. `sinf128`
27+
Default = 0,
28+
/// `long double` *l` lowering, e.g. `sinl`.
29+
LongDouble = 1,
30+
// If needed, this could be extended with an option for `q` suffixes from
31+
// libquadmath.
32+
};
33+
2334
namespace RTLIB {
2435

2536
/// RTLIB::Libcall enum - This enum defines all of the runtime library calls
@@ -97,6 +108,13 @@ struct RuntimeLibcallsInfo {
97108
/// Set default libcall names. If a target wants to opt-out of a libcall it
98109
/// should be placed here.
99110
void initLibcalls(const Triple &TT);
111+
112+
/// Set a specific lowering convention for `fp128` math libcalls.
113+
///
114+
/// By default, `fp128` math functions get lowered to the C23 `sinf128`-
115+
/// style symbols. This allows overriding with `sinl`-style symbols on
116+
/// platforms where `long double` is known to be identical to _Float128.
117+
void setF128LibcallFormat(F128LibcallFormat Format);
100118
};
101119

102120
} // namespace RTLIB

llvm/include/llvm/TargetParser/Triple.h

+13-7
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,13 @@ class Triple {
262262
EABIHF,
263263
Android,
264264
Musl,
265-
MuslABIN32,
266-
MuslABI64,
267-
MuslEABI,
268-
MuslEABIHF,
269-
MuslF32,
270-
MuslSF,
271-
MuslX32,
265+
MuslABIN32, // MIPS N32 ABI
266+
MuslABI64, // MIPS N64 ABI
267+
MuslEABI, // Arm32 EABI
268+
MuslEABIHF, // Arm32 EABI + HF
269+
MuslF32, // LoongArch ILP32F/LP64F
270+
MuslSF, // LoongArch ILP32S/LP64S
271+
MuslX32, // Musl using 32-bit ABI on x86_64
272272
LLVM,
273273

274274
MSVC,
@@ -1231,6 +1231,12 @@ class Triple {
12311231
/// or an invalid version tuple if this triple doesn't have one.
12321232
VersionTuple getMinimumSupportedOSVersion() const;
12331233

1234+
/// Check whether (1) f128 is the same format as `long double`, and (2)
1235+
/// `*f128` symbols are likely unavailable. In other words, platforms for
1236+
/// which this returns true may safely use sqrtl instead of sqrtf128 and
1237+
/// should do so because sqrtf128 would probably error at link time.
1238+
bool shouldLowerf128AsLongDouble() const;
1239+
12341240
/// @}
12351241
/// @name Static helpers for IDs.
12361242
/// @{

0 commit comments

Comments
 (0)