Skip to content

Commit 3e3f0c3

Browse files
Job Henandez LaraJob Hernandez
andauthored
[libc][math][c23] add c23 floating point fmaximum and fminimum functions. (#86016)
Fixes #85496. --------- Co-authored-by: Job Hernandez <[email protected]>
1 parent 4e6745c commit 3e3f0c3

File tree

114 files changed

+3547
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

114 files changed

+3547
-0
lines changed

libc/config/linux/aarch64/entrypoints.txt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,30 @@ set(TARGET_LIBM_ENTRYPOINTS
366366
libc.src.math.fmin
367367
libc.src.math.fminf
368368
libc.src.math.fminl
369+
libc.src.math.fmaximum
370+
libc.src.math.fmaximumf
371+
libc.src.math.fmaximuml
372+
libc.src.math.fmaximum_num
373+
libc.src.math.fmaximum_numf
374+
libc.src.math.fmaximum_numl
375+
libc.src.math.fmaximum_mag
376+
libc.src.math.fmaximum_magf
377+
libc.src.math.fmaximum_magl
378+
libc.src.math.fmaximum_mag_num
379+
libc.src.math.fmaximum_mag_numf
380+
libc.src.math.fmaximum_mag_numl
381+
libc.src.math.fminimum
382+
libc.src.math.fminimumf
383+
libc.src.math.fminimuml
384+
libc.src.math.fminimum_num
385+
libc.src.math.fminimum_numf
386+
libc.src.math.fminimum_numl
387+
libc.src.math.fminimum_mag
388+
libc.src.math.fminimum_magf
389+
libc.src.math.fminimum_magl
390+
libc.src.math.fminimum_mag_num
391+
libc.src.math.fminimum_mag_numf
392+
libc.src.math.fminimum_mag_numl
369393
libc.src.math.fmod
370394
libc.src.math.fmodf
371395
libc.src.math.fmodl
@@ -466,6 +490,14 @@ if(LIBC_TYPES_HAS_FLOAT128)
466490
libc.src.math.floorf128
467491
libc.src.math.fmaxf128
468492
libc.src.math.fminf128
493+
libc.src.math.fmaximumf128
494+
libc.src.math.fmaximum_numf128
495+
libc.src.math.fmaximum_magf128
496+
libc.src.math.fmaximum_mag_numf128
497+
libc.src.math.fminimumf128
498+
libc.src.math.fminimum_numf128
499+
libc.src.math.fminimum_magf128
500+
libc.src.math.fminimum_mag_numf128
469501
libc.src.math.fmodf128
470502
libc.src.math.frexpf128
471503
libc.src.math.ilogbf128

libc/config/linux/arm/entrypoints.txt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,30 @@ set(TARGET_LIBM_ENTRYPOINTS
234234
libc.src.math.fmin
235235
libc.src.math.fminf
236236
libc.src.math.fminl
237+
libc.src.math.fmaximum
238+
libc.src.math.fmaximumf
239+
libc.src.math.fmaximuml
240+
libc.src.math.fmaximum_num
241+
libc.src.math.fmaximum_numf
242+
libc.src.math.fmaximum_numl
243+
libc.src.math.fmaximum_mag
244+
libc.src.math.fmaximum_magf
245+
libc.src.math.fmaximum_magl
246+
libc.src.math.fmaximum_mag_num
247+
libc.src.math.fmaximum_mag_numf
248+
libc.src.math.fmaximum_mag_numl
249+
libc.src.math.fminimum
250+
libc.src.math.fminimumf
251+
libc.src.math.fminimuml
252+
libc.src.math.fminimum_num
253+
libc.src.math.fminimum_numf
254+
libc.src.math.fminimum_numl
255+
libc.src.math.fminimum_mag
256+
libc.src.math.fminimum_magf
257+
libc.src.math.fminimum_magl
258+
libc.src.math.fminimum_mag_num
259+
libc.src.math.fminimum_mag_numf
260+
libc.src.math.fminimum_mag_numl
237261
libc.src.math.fmod
238262
libc.src.math.fmodf
239263
libc.src.math.frexp

libc/config/linux/riscv/entrypoints.txt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,30 @@ set(TARGET_LIBM_ENTRYPOINTS
374374
libc.src.math.fmax
375375
libc.src.math.fmaxf
376376
libc.src.math.fmaxl
377+
libc.src.math.fmaximum
378+
libc.src.math.fmaximumf
379+
libc.src.math.fmaximuml
380+
libc.src.math.fmaximum_num
381+
libc.src.math.fmaximum_numf
382+
libc.src.math.fmaximum_numl
383+
libc.src.math.fmaximum_mag
384+
libc.src.math.fmaximum_magf
385+
libc.src.math.fmaximum_magl
386+
libc.src.math.fmaximum_mag_num
387+
libc.src.math.fmaximum_mag_numf
388+
libc.src.math.fmaximum_mag_numl
389+
libc.src.math.fminimum
390+
libc.src.math.fminimumf
391+
libc.src.math.fminimuml
392+
libc.src.math.fminimum_num
393+
libc.src.math.fminimum_numf
394+
libc.src.math.fminimum_numl
395+
libc.src.math.fminimum_mag
396+
libc.src.math.fminimum_magf
397+
libc.src.math.fminimum_magl
398+
libc.src.math.fminimum_mag_num
399+
libc.src.math.fminimum_mag_numf
400+
libc.src.math.fminimum_mag_numl
377401
libc.src.math.fmod
378402
libc.src.math.fmodf
379403
libc.src.math.fmodl
@@ -474,6 +498,14 @@ if(LIBC_TYPES_HAS_FLOAT128)
474498
libc.src.math.floorf128
475499
libc.src.math.fmaxf128
476500
libc.src.math.fminf128
501+
libc.src.math.fmaximumf128
502+
libc.src.math.fmaximum_numf128
503+
libc.src.math.fmaximum_magf128
504+
libc.src.math.fmaximum_mag_numf128
505+
libc.src.math.fminimumf128
506+
libc.src.math.fminimum_numf128
507+
libc.src.math.fminimum_magf128
508+
libc.src.math.fminimum_mag_numf128
477509
libc.src.math.fmodf128
478510
libc.src.math.frexpf128
479511
libc.src.math.ilogbf128

libc/config/linux/x86_64/entrypoints.txt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,30 @@ set(TARGET_LIBM_ENTRYPOINTS
385385
libc.src.math.fmax
386386
libc.src.math.fmaxf
387387
libc.src.math.fmaxl
388+
libc.src.math.fmaximum
389+
libc.src.math.fmaximumf
390+
libc.src.math.fmaximuml
391+
libc.src.math.fmaximum_num
392+
libc.src.math.fmaximum_numf
393+
libc.src.math.fmaximum_numl
394+
libc.src.math.fmaximum_mag
395+
libc.src.math.fmaximum_magf
396+
libc.src.math.fmaximum_magl
397+
libc.src.math.fmaximum_mag_num
398+
libc.src.math.fmaximum_mag_numf
399+
libc.src.math.fmaximum_mag_numl
400+
libc.src.math.fminimum
401+
libc.src.math.fminimumf
402+
libc.src.math.fminimuml
403+
libc.src.math.fminimum_num
404+
libc.src.math.fminimum_numf
405+
libc.src.math.fminimum_numl
406+
libc.src.math.fminimum_mag
407+
libc.src.math.fminimum_magf
408+
libc.src.math.fminimum_magl
409+
libc.src.math.fminimum_mag_num
410+
libc.src.math.fminimum_mag_numf
411+
libc.src.math.fminimum_mag_numl
388412
libc.src.math.fmod
389413
libc.src.math.fmodf
390414
libc.src.math.fmodl
@@ -499,6 +523,14 @@ if(LIBC_TYPES_HAS_FLOAT128)
499523
libc.src.math.floorf128
500524
libc.src.math.fmaxf128
501525
libc.src.math.fminf128
526+
libc.src.math.fmaximumf128
527+
libc.src.math.fmaximum_numf128
528+
libc.src.math.fmaximum_magf128
529+
libc.src.math.fmaximum_mag_numf128
530+
libc.src.math.fminimumf128
531+
libc.src.math.fminimum_numf128
532+
libc.src.math.fminimum_magf128
533+
libc.src.math.fminimum_mag_numf128
502534
libc.src.math.fmodf128
503535
libc.src.math.frexpf128
504536
libc.src.math.fromfpf128

libc/config/windows/entrypoints.txt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,30 @@ set(TARGET_LIBM_ENTRYPOINTS
153153
libc.src.math.fmax
154154
libc.src.math.fmaxf
155155
libc.src.math.fmaxl
156+
libc.src.math.fmaximum
157+
libc.src.math.fmaximumf
158+
libc.src.math.fmaximuml
159+
libc.src.math.fmaximum_num
160+
libc.src.math.fmaximum_numf
161+
libc.src.math.fmaximum_numl
162+
libc.src.math.fmaximum_mag
163+
libc.src.math.fmaximum_magf
164+
libc.src.math.fmaximum_magl
165+
libc.src.math.fmaximum_mag_num
166+
libc.src.math.fmaximum_mag_numf
167+
libc.src.math.fmaximum_mag_numl
168+
libc.src.math.fminimum
169+
libc.src.math.fminimumf
170+
libc.src.math.fminimuml
171+
libc.src.math.fminimum_num
172+
libc.src.math.fminimum_numf
173+
libc.src.math.fminimum_numl
174+
libc.src.math.fminimum_mag
175+
libc.src.math.fminimum_magf
176+
libc.src.math.fminimum_magl
177+
libc.src.math.fminimum_mag_num
178+
libc.src.math.fminimum_mag_numf
179+
libc.src.math.fminimum_mag_numl
156180
libc.src.math.fmod
157181
libc.src.math.fmodf
158182
libc.src.math.fmodl

libc/spec/stdc.td

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,46 @@ def StdC : StandardSpec<"stdc"> {
406406
FunctionSpec<"fmaxf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
407407
FunctionSpec<"fmaxl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
408408
GuardedFunctionSpec<"fmaxf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
409+
410+
FunctionSpec<"fmaximum", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
411+
FunctionSpec<"fmaximumf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
412+
FunctionSpec<"fmaximuml", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
413+
GuardedFunctionSpec<"fmaximumf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
414+
415+
FunctionSpec<"fmaximum_num", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
416+
FunctionSpec<"fmaximum_numf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
417+
FunctionSpec<"fmaximum_numl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
418+
GuardedFunctionSpec<"fmaximum_numf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
419+
420+
FunctionSpec<"fmaximum_mag", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
421+
FunctionSpec<"fmaximum_magf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
422+
FunctionSpec<"fmaximum_magl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
423+
GuardedFunctionSpec<"fmaximum_magf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
424+
425+
FunctionSpec<"fmaximum_mag_num", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
426+
FunctionSpec<"fmaximum_mag_numf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
427+
FunctionSpec<"fmaximum_mag_numl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
428+
GuardedFunctionSpec<"fmaximum_mag_numf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
429+
430+
FunctionSpec<"fminimum", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
431+
FunctionSpec<"fminimumf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
432+
FunctionSpec<"fminimuml", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
433+
GuardedFunctionSpec<"fminimumf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
434+
435+
FunctionSpec<"fminimum_num", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
436+
FunctionSpec<"fminimum_numf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
437+
FunctionSpec<"fmaximum_numl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
438+
GuardedFunctionSpec<"fminimum_numf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
439+
440+
FunctionSpec<"fminimum_mag", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
441+
FunctionSpec<"fminimum_magf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
442+
FunctionSpec<"fminimum_magl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
443+
GuardedFunctionSpec<"fminimum_magf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
444+
445+
FunctionSpec<"fminimum_mag_num", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
446+
FunctionSpec<"fminimum_mag_numf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
447+
FunctionSpec<"fminimum_mag_numl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
448+
GuardedFunctionSpec<"fminimum_mag_numf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
409449

410450
FunctionSpec<"fma", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
411451
FunctionSpec<"fmaf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>, ArgSpec<FloatType>]>,

libc/src/__support/FPUtil/BasicOperations.h

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "FPBits.h"
1313

14+
#include "FEnvImpl.h"
1415
#include "src/__support/CPP/type_traits.h"
1516
#include "src/__support/common.h"
1617

@@ -58,6 +59,110 @@ LIBC_INLINE T fmax(T x, T y) {
5859
}
5960
}
6061

62+
template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
63+
LIBC_INLINE T fmaximum(T x, T y) {
64+
FPBits<T> bitx(x), bity(y);
65+
66+
if (bitx.is_nan())
67+
return x;
68+
if (bity.is_nan())
69+
return y;
70+
if (bitx.sign() != bity.sign())
71+
return (bitx.is_neg() ? y : x);
72+
return x > y ? x : y;
73+
}
74+
75+
template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
76+
LIBC_INLINE T fminimum(T x, T y) {
77+
const FPBits<T> bitx(x), bity(y);
78+
79+
if (bitx.is_nan())
80+
return x;
81+
if (bity.is_nan())
82+
return y;
83+
if (bitx.sign() != bity.sign())
84+
return (bitx.is_neg()) ? x : y;
85+
return x < y ? x : y;
86+
}
87+
88+
template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
89+
LIBC_INLINE T fmaximum_num(T x, T y) {
90+
FPBits<T> bitx(x), bity(y);
91+
if (bitx.is_signaling_nan() || bity.is_signaling_nan()) {
92+
fputil::raise_except_if_required(FE_INVALID);
93+
if (bitx.is_nan() && bity.is_nan())
94+
return FPBits<T>::quiet_nan().get_val();
95+
}
96+
if (bitx.is_nan())
97+
return y;
98+
if (bity.is_nan())
99+
return x;
100+
if (bitx.sign() != bity.sign())
101+
return (bitx.is_neg() ? y : x);
102+
return x > y ? x : y;
103+
}
104+
105+
template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
106+
LIBC_INLINE T fminimum_num(T x, T y) {
107+
FPBits<T> bitx(x), bity(y);
108+
if (bitx.is_signaling_nan() || bity.is_signaling_nan()) {
109+
fputil::raise_except_if_required(FE_INVALID);
110+
if (bitx.is_nan() && bity.is_nan())
111+
return FPBits<T>::quiet_nan().get_val();
112+
}
113+
if (bitx.is_nan())
114+
return y;
115+
if (bity.is_nan())
116+
return x;
117+
if (bitx.sign() != bity.sign())
118+
return (bitx.is_neg() ? x : y);
119+
return x < y ? x : y;
120+
}
121+
122+
template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
123+
LIBC_INLINE T fmaximum_mag(T x, T y) {
124+
FPBits<T> bitx(x), bity(y);
125+
126+
if (abs(x) > abs(y))
127+
return x;
128+
if (abs(y) > abs(x))
129+
return y;
130+
return fmaximum(x, y);
131+
}
132+
133+
template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
134+
LIBC_INLINE T fminimum_mag(T x, T y) {
135+
FPBits<T> bitx(x), bity(y);
136+
137+
if (abs(x) < abs(y))
138+
return x;
139+
if (abs(y) < abs(x))
140+
return y;
141+
return fminimum(x, y);
142+
}
143+
144+
template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
145+
LIBC_INLINE T fmaximum_mag_num(T x, T y) {
146+
FPBits<T> bitx(x), bity(y);
147+
148+
if (abs(x) > abs(y))
149+
return x;
150+
if (abs(y) > abs(x))
151+
return y;
152+
return fmaximum_num(x, y);
153+
}
154+
155+
template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
156+
LIBC_INLINE T fminimum_mag_num(T x, T y) {
157+
FPBits<T> bitx(x), bity(y);
158+
159+
if (abs(x) < abs(y))
160+
return x;
161+
if (abs(y) < abs(x))
162+
return y;
163+
return fminimum_num(x, y);
164+
}
165+
61166
template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
62167
LIBC_INLINE T fdim(T x, T y) {
63168
FPBits<T> bitx(x), bity(y);

0 commit comments

Comments
 (0)