Page MenuHomeFreeBSD

D59462.id186076.diff
No OneTemporary

D59462.id186076.diff

diff --git a/lib/msun/amd64/Makefile.inc b/lib/msun/amd64/Makefile.inc
--- a/lib/msun/amd64/Makefile.inc
+++ b/lib/msun/amd64/Makefile.inc
@@ -1,8 +1,12 @@
ARCH_SRCS = e_fmod.S e_fmodf.S e_fmodl.S \
e_remainder.S e_remainderf.S e_remainderl.S \
e_sqrt.S e_sqrtf.S e_sqrtl.S \
+ fma_disp.c fmaf_disp.c s_fma_avx.S s_fmaf_avx.S \
s_llrint.S s_llrintf.S s_llrintl.S \
s_logbl.S s_lrint.S s_lrintf.S s_lrintl.S \
s_remquo.S s_remquof.S s_remquol.S \
s_rintl.S s_scalbn.S s_scalbnf.S s_scalbnl.S
LDBL_PREC = 64
+
+CFLAGS+=-D_RENAME_FMA
+CFLAGS+=-D_RENAME_FMAF
diff --git a/lib/msun/amd64/fma_disp.c b/lib/msun/amd64/fma_disp.c
new file mode 100644
--- /dev/null
+++ b/lib/msun/amd64/fma_disp.c
@@ -0,0 +1,24 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2026 The FreeBSD Foundation
+ *
+ * This software were developed by
+ * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from
+ * the FreeBSD Foundation.
+ */
+
+#include <sys/types.h>
+#include <machine/ifunc.h>
+#include <machine/specialreg.h>
+
+double __fma_avx(double, double, double);
+double __fma_sw(double, double, double);
+
+DEFINE_UIFUNC(, double, fma, (double, double, double))
+{
+ if ((cpu_feature2 & (CPUID2_AVX | CPUID2_FMA)) == (CPUID2_AVX |
+ CPUID2_FMA))
+ return (__fma_avx);
+ return (__fma_sw);
+}
diff --git a/lib/msun/amd64/fmaf_disp.c b/lib/msun/amd64/fmaf_disp.c
new file mode 100644
--- /dev/null
+++ b/lib/msun/amd64/fmaf_disp.c
@@ -0,0 +1,24 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2026 The FreeBSD Foundation
+ *
+ * This software were developed by
+ * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from
+ * the FreeBSD Foundation.
+ */
+
+#include <sys/types.h>
+#include <machine/ifunc.h>
+#include <machine/specialreg.h>
+
+float __fmaf_avx(float, float, float);
+float __fmaf_sw(float, float, float);
+
+DEFINE_UIFUNC(, float, fmaf, (float, float, float))
+{
+ if ((cpu_feature2 & (CPUID2_AVX | CPUID2_FMA)) == (CPUID2_AVX |
+ CPUID2_FMA))
+ return (__fmaf_avx);
+ return (__fmaf_sw);
+}
diff --git a/lib/msun/amd64/s_fma_avx.S b/lib/msun/amd64/s_fma_avx.S
new file mode 100644
--- /dev/null
+++ b/lib/msun/amd64/s_fma_avx.S
@@ -0,0 +1,18 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2026 The FreeBSD Foundation
+ *
+ * This software were developed by
+ * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from
+ * the FreeBSD Foundation.
+ */
+
+ .text
+ .p2align 4
+ .globl __fma_avx
+ .type __fma_avx, @function
+__fma_avx:
+ vfmadd132sd %xmm1, %xmm2, %xmm0
+ ret
+ .size __fma_avx, . - __fma_avx
diff --git a/lib/msun/amd64/s_fmaf_avx.S b/lib/msun/amd64/s_fmaf_avx.S
new file mode 100644
--- /dev/null
+++ b/lib/msun/amd64/s_fmaf_avx.S
@@ -0,0 +1,18 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2026 The FreeBSD Foundation
+ *
+ * This software were developed by
+ * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from
+ * the FreeBSD Foundation.
+ */
+
+ .text
+ .p2align 4
+ .globl __fmaf_avx
+ .type __fmaf_avx, @function
+__fmaf_avx:
+ vfmadd132ss %xmm1, %xmm2, %xmm0
+ ret
+ .size __fmaf_avx, . - __fmaf_avx
diff --git a/lib/msun/src/s_fma.c b/lib/msun/src/s_fma.c
--- a/lib/msun/src/s_fma.c
+++ b/lib/msun/src/s_fma.c
@@ -163,6 +163,10 @@
return (ret);
}
+#ifdef _RENAME_FMA
+double __fma_sw(double, double, double);
+#endif
+
/*
* Fused multiply-add: Compute x * y + z with a single rounding error.
*
@@ -181,7 +185,12 @@
* since this implementation will likely be several times slower.
*/
double
-fma(double x, double y, double z)
+#ifdef _RENAME_FMA
+__fma_sw
+#else
+fma
+#endif
+(double x, double y, double z)
{
double xs, ys, zs, adj;
struct dd xy, r;
diff --git a/lib/msun/src/s_fmaf.c b/lib/msun/src/s_fmaf.c
--- a/lib/msun/src/s_fmaf.c
+++ b/lib/msun/src/s_fmaf.c
@@ -38,6 +38,11 @@
return (__builtin_fmaf(x, y, z));
}
#else
+
+#ifdef _RENAME_FMAF
+float __fmaf_sw(float, float, float);
+#endif
+
/*
* Fused multiply-add: Compute x * y + z with a single rounding error.
*
@@ -46,7 +51,12 @@
* rounding occurs.
*/
float
-fmaf(float x, float y, float z)
+#ifdef _RENAME_FMAF
+__fmaf_sw
+#else
+fmaf
+#endif
+(float x, float y, float z)
{
double xy, result;
uint32_t hr, lr;

File Metadata

Mime Type
text/plain
Expires
Sat, Oct 3, 12:08 PM (12 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40127156
Default Alt Text
D59462.id186076.diff (4 KB)

Event Timeline