[PATCH v3 3/4] aarch/fpu: use generic builtins based math functions
Vineet Gupta
Vineet.Gupta1@synopsys.com
Tue Jun 2 21:32:19 GMT 2020
introduce sysdep header mathusebuiltins.h to replace aarch64
implementations with corresponding generic ones.
 newly inroduced generic sqrt{,f}, fma{,f}
 existing floor{,f}, nearbyint{,f}, rint{,f}, round{,f}, trunc{,f}
 Note that generic copysign was already enabled (via generic
mathusebuiltins.h) now thru sysdep header
Tested with buildmanyglibcs for aarch64linuxgnu
This is a non functional change and aarch64 libm before/after was
byte invariant as compared below:
 cd /SCRATCH/vgupta/gnu/installglibcAbaseline
 for i in `find . name libm2.31.9000.so`; do
 echo $i; diff $i /SCRATCH/vgupta/gnu/installglibcCreducescope/$i ;
 echo $?;
 done
 ./aarch64linuxgnu/lib64/libm2.31.9000.so
 0
 ./armlinuxgnueabi/lib/libm2.31.9000.so
 0
 ./x86_64linuxgnu/lib64/libm2.31.9000.so
 0
 ./armlinuxgnueabihf/lib/libm2.31.9000.so
 0
 ./riscv64linuxgnurv64imaclp64/lib64/lp64/libm2.31.9000.so
 0
 ./riscv64linuxgnurv64imafdclp64/lib64/lp64/libm2.31.9000.so
 0
 ./powerpclinuxgnu/lib/libm2.31.9000.so
 0
 ./microblazelinuxgnu/lib/libm2.31.9000.so
 0
 ./nios2linuxgnu/lib/libm2.31.9000.so
 0
 ./hppalinuxgnu/lib/libm2.31.9000.so
 0
 ./s390xlinuxgnu/lib64/libm2.31.9000.so
 0
Reviewedby: Adhemerval Zanella <adhemerval.zanella@linaro.org>

sysdeps/aarch64/fpu/e_sqrt.c  27 
sysdeps/aarch64/fpu/e_sqrtf.c  27 
sysdeps/aarch64/fpu/mathusebuiltins.h  71 +++++++++++++++++++++++++
sysdeps/aarch64/fpu/s_floor.c  29 
sysdeps/aarch64/fpu/s_floorf.c  29 
sysdeps/aarch64/fpu/s_fma.c  28 
sysdeps/aarch64/fpu/s_fmaf.c  28 
sysdeps/aarch64/fpu/s_nearbyint.c  28 
sysdeps/aarch64/fpu/s_nearbyintf.c  28 
sysdeps/aarch64/fpu/s_rint.c  29 
sysdeps/aarch64/fpu/s_rintf.c  29 
sysdeps/aarch64/fpu/s_round.c  29 
sysdeps/aarch64/fpu/s_roundf.c  29 
sysdeps/aarch64/fpu/s_trunc.c  29 
sysdeps/aarch64/fpu/s_truncf.c  29 
15 files changed, 71 insertions(+), 398 deletions()
delete mode 100644 sysdeps/aarch64/fpu/e_sqrt.c
delete mode 100644 sysdeps/aarch64/fpu/e_sqrtf.c
create mode 100644 sysdeps/aarch64/fpu/mathusebuiltins.h
delete mode 100644 sysdeps/aarch64/fpu/s_floor.c
delete mode 100644 sysdeps/aarch64/fpu/s_floorf.c
delete mode 100644 sysdeps/aarch64/fpu/s_fma.c
delete mode 100644 sysdeps/aarch64/fpu/s_fmaf.c
delete mode 100644 sysdeps/aarch64/fpu/s_nearbyint.c
delete mode 100644 sysdeps/aarch64/fpu/s_nearbyintf.c
delete mode 100644 sysdeps/aarch64/fpu/s_rint.c
delete mode 100644 sysdeps/aarch64/fpu/s_rintf.c
delete mode 100644 sysdeps/aarch64/fpu/s_round.c
delete mode 100644 sysdeps/aarch64/fpu/s_roundf.c
delete mode 100644 sysdeps/aarch64/fpu/s_trunc.c
delete mode 100644 sysdeps/aarch64/fpu/s_truncf.c
diff git a/sysdeps/aarch64/fpu/e_sqrt.c b/sysdeps/aarch64/fpu/e_sqrt.c
deleted file mode 100644
index abb67ef7b061..000000000000
 a/sysdeps/aarch64/fpu/e_sqrt.c
+++ /dev/null
@@ 1,27 +0,0 @@
/* Square root of floating point number.
 Copyright (C) 20152020 Free Software Foundation, Inc.
 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#include <math_private.h>
#include <libmaliasfinite.h>

double
__ieee754_sqrt (double d)
{
 return __builtin_sqrt (d);
}
libm_alias_finite (__ieee754_sqrt, __sqrt)
diff git a/sysdeps/aarch64/fpu/e_sqrtf.c b/sysdeps/aarch64/fpu/e_sqrtf.c
deleted file mode 100644
index 13008a4f45d6..000000000000
 a/sysdeps/aarch64/fpu/e_sqrtf.c
+++ /dev/null
@@ 1,27 +0,0 @@
/* Singleprecision floating point square root.
 Copyright (C) 20152020 Free Software Foundation, Inc.
 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#include <math_private.h>
#include <libmaliasfinite.h>

float
__ieee754_sqrtf (float s)
{
 return __builtin_sqrtf (s);
}
libm_alias_finite (__ieee754_sqrtf, __sqrtf)
diff git a/sysdeps/aarch64/fpu/mathusebuiltins.h b/sysdeps/aarch64/fpu/mathusebuiltins.h
new file mode 100644
index 000000000000..50a1ba0db5ea
 /dev/null
+++ b/sysdeps/aarch64/fpu/mathusebuiltins.h
@@ 0,0 +1,71 @@
+/* Using math gcc builtins instead of generic implementation. aarch64 version.
+ Copyright (C) 2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef MATH_USE_BUILTINS_H
+#define MATH_USE_BUILTINS_H 1
+
+#include <features.h> /* For __GNUC_PREREQ. */
+
+/* Define these macros to 1 to use __builtin_xyz instead of the
+ generic implementation. */
+#define USE_NEARBYINT_BUILTIN 1
+#define USE_NEARBYINTF_BUILTIN 1
+#define USE_NEARBYINTL_BUILTIN 0
+#define USE_NEARBYINTF128_BUILTIN 0
+
+#define USE_RINT_BUILTIN 1
+#define USE_RINTF_BUILTIN 1
+#define USE_RINTL_BUILTIN 0
+#define USE_RINTF128_BUILTIN 0
+
+#define USE_FLOOR_BUILTIN 1
+#define USE_FLOORF_BUILTIN 1
+#define USE_FLOORL_BUILTIN 0
+#define USE_FLOORF128_BUILTIN 0
+
+#define USE_CEIL_BUILTIN 1
+#define USE_CEILF_BUILTIN 1
+#define USE_CEILL_BUILTIN 0
+#define USE_CEILF128_BUILTIN 0
+
+#define USE_TRUNC_BUILTIN 1
+#define USE_TRUNCF_BUILTIN 1
+#define USE_TRUNCL_BUILTIN 0
+#define USE_TRUNCF128_BUILTIN 0
+
+#define USE_ROUND_BUILTIN 1
+#define USE_ROUNDF_BUILTIN 1
+#define USE_ROUNDL_BUILTIN 0
+#define USE_ROUNDF128_BUILTIN 0
+
+#define USE_COPYSIGNL_BUILTIN 1
+#if __GNUC_PREREQ (7, 0)
+# define USE_COPYSIGNF128_BUILTIN 1
+#else
+# define USE_COPYSIGNF128_BUILTIN 0
+#endif
+
+#define USE_SQRT_BUILTIN 1
+#define USE_SQRTF_BUILTIN 1
+
+#define USE_FMA_BUILTIN 1
+#define USE_FMAF_BUILTIN 1
+#define USE_FMAL_BUILTIN 0
+#define USE_FMAF128_BUILTIN 0
+
+#endif
diff git a/sysdeps/aarch64/fpu/s_floor.c b/sysdeps/aarch64/fpu/s_floor.c
deleted file mode 100644
index d7d3e9336a6e..000000000000
 a/sysdeps/aarch64/fpu/s_floor.c
+++ /dev/null
@@ 1,29 +0,0 @@
/* Copyright (C) 20112020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public License as
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#define NO_MATH_REDIRECT
#include <math.h>
#include <libmaliasdouble.h>

double
__floor (double x)
{
 return __builtin_floor (x);
}

libm_alias_double (__floor, floor)
diff git a/sysdeps/aarch64/fpu/s_floorf.c b/sysdeps/aarch64/fpu/s_floorf.c
deleted file mode 100644
index 625ff4375702..000000000000
 a/sysdeps/aarch64/fpu/s_floorf.c
+++ /dev/null
@@ 1,29 +0,0 @@
/* Copyright (C) 20112020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public License as
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#define NO_MATH_REDIRECT
#include <math.h>
#include <libmaliasfloat.h>

float
__floorf (float x)
{
 return __builtin_floorf (x);
}

libm_alias_float (__floor, floor)
diff git a/sysdeps/aarch64/fpu/s_fma.c b/sysdeps/aarch64/fpu/s_fma.c
deleted file mode 100644
index 48bb40482dc9..000000000000
 a/sysdeps/aarch64/fpu/s_fma.c
+++ /dev/null
@@ 1,28 +0,0 @@
/* Copyright (C) 19962020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#include <math.h>
#include <libmaliasdouble.h>

double
__fma (double x, double y, double z)
{
 return __builtin_fma (x, y, z);
}

libm_alias_double (__fma, fma)
diff git a/sysdeps/aarch64/fpu/s_fmaf.c b/sysdeps/aarch64/fpu/s_fmaf.c
deleted file mode 100644
index 544f32e27aec..000000000000
 a/sysdeps/aarch64/fpu/s_fmaf.c
+++ /dev/null
@@ 1,28 +0,0 @@
/* Copyright (C) 20112020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public License as
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#include <math.h>
#include <libmaliasfloat.h>

float
__fmaf (float x, float y, float z)
{
 return __builtin_fmaf (x, y, z);
}

libm_alias_float (__fma, fma)
diff git a/sysdeps/aarch64/fpu/s_nearbyint.c b/sysdeps/aarch64/fpu/s_nearbyint.c
deleted file mode 100644
index 59a57dd39ba1..000000000000
 a/sysdeps/aarch64/fpu/s_nearbyint.c
+++ /dev/null
@@ 1,28 +0,0 @@
/* Copyright (C) 20112020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public License as
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#include <math.h>
#include <libmaliasdouble.h>

double
__nearbyint (double x)
{
 return __builtin_nearbyint (x);
}

libm_alias_double (__nearbyint, nearbyint)
diff git a/sysdeps/aarch64/fpu/s_nearbyintf.c b/sysdeps/aarch64/fpu/s_nearbyintf.c
deleted file mode 100644
index f52968ae2bbd..000000000000
 a/sysdeps/aarch64/fpu/s_nearbyintf.c
+++ /dev/null
@@ 1,28 +0,0 @@
/* Copyright (C) 20112020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public License as
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#include <math.h>
#include <libmaliasfloat.h>

float
__nearbyintf (float x)
{
 return __builtin_nearbyintf (x);
}

libm_alias_float (__nearbyint, nearbyint)
diff git a/sysdeps/aarch64/fpu/s_rint.c b/sysdeps/aarch64/fpu/s_rint.c
deleted file mode 100644
index bdd757167e0c..000000000000
 a/sysdeps/aarch64/fpu/s_rint.c
+++ /dev/null
@@ 1,29 +0,0 @@
/* Copyright (C) 20112020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public License as
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#define NO_MATH_REDIRECT
#include <math.h>
#include <libmaliasdouble.h>

double
__rint (double x)
{
 return __builtin_rint (x);
}

libm_alias_double (__rint, rint)
diff git a/sysdeps/aarch64/fpu/s_rintf.c b/sysdeps/aarch64/fpu/s_rintf.c
deleted file mode 100644
index 8cf7c63d6dda..000000000000
 a/sysdeps/aarch64/fpu/s_rintf.c
+++ /dev/null
@@ 1,29 +0,0 @@
/* Copyright (C) 20112020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public License as
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#define NO_MATH_REDIRECT
#include <math.h>
#include <libmaliasfloat.h>

float
__rintf (float x)
{
 return __builtin_rintf (x);
}

libm_alias_float (__rint, rint)
diff git a/sysdeps/aarch64/fpu/s_round.c b/sysdeps/aarch64/fpu/s_round.c
deleted file mode 100644
index d2fd5f34117a..000000000000
 a/sysdeps/aarch64/fpu/s_round.c
+++ /dev/null
@@ 1,29 +0,0 @@
/* Copyright (C) 20112020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public License as
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#define NO_MATH_REDIRECT
#include <math.h>
#include <libmaliasdouble.h>

double
__round (double x)
{
 return __builtin_round (x);
}

libm_alias_double (__round, round)
diff git a/sysdeps/aarch64/fpu/s_roundf.c b/sysdeps/aarch64/fpu/s_roundf.c
deleted file mode 100644
index e51214e86cd2..000000000000
 a/sysdeps/aarch64/fpu/s_roundf.c
+++ /dev/null
@@ 1,29 +0,0 @@
/* Copyright (C) 20112020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public License as
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#define NO_MATH_REDIRECT
#include <math.h>
#include <libmaliasfloat.h>

float
__roundf (float x)
{
 return __builtin_roundf (x);
}

libm_alias_float (__round, round)
diff git a/sysdeps/aarch64/fpu/s_trunc.c b/sysdeps/aarch64/fpu/s_trunc.c
deleted file mode 100644
index bac23a5e269d..000000000000
 a/sysdeps/aarch64/fpu/s_trunc.c
+++ /dev/null
@@ 1,29 +0,0 @@
/* Copyright (C) 20112020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public License as
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#define NO_MATH_REDIRECT
#include <math.h>
#include <libmaliasdouble.h>

double
__trunc (double x)
{
 return __builtin_trunc (x);
}

libm_alias_double (__trunc, trunc)
diff git a/sysdeps/aarch64/fpu/s_truncf.c b/sysdeps/aarch64/fpu/s_truncf.c
deleted file mode 100644
index 6a025c084a5a..000000000000
 a/sysdeps/aarch64/fpu/s_truncf.c
+++ /dev/null
@@ 1,29 +0,0 @@
/* Copyright (C) 20112020 Free Software Foundation, Inc.

 This file is part of the GNU C Library.

 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public License as
 published by the Free Software Foundation; either version 2.1 of the
 License, or (at your option) any later version.

 The GNU C Library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with the GNU C Library; if not, see
 <https://www.gnu.org/licenses/>. */

#define NO_MATH_REDIRECT
#include <math.h>
#include <libmaliasfloat.h>

float
__truncf (float x)
{
 return __builtin_truncf (x);
}

libm_alias_float (__trunc, trunc)

2.20.1
More information about the Libcalpha
mailing list