]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
AArch64: Add support for roundeven[f]
authorWilco Dijkstra <wdijkstr@arm.com>
Tue, 8 Jun 2021 12:33:09 +0000 (13:33 +0100)
committerSunil K Pandey <skpgkp2@gmail.com>
Thu, 29 Sep 2022 20:14:55 +0000 (13:14 -0700)
Add inline assembler for the roundeven functions.
Passes GLIBC regression.  Note GCC does not inline the builtin (PR100966),
so this cannot be used for now.

(cherry picked from commit 6a86bc099219a656be479d5f31ff90ec7860b112)

sysdeps/aarch64/fpu/s_roundeven.c [new file with mode: 0644]
sysdeps/aarch64/fpu/s_roundevenf.c [new file with mode: 0644]

diff --git a/sysdeps/aarch64/fpu/s_roundeven.c b/sysdeps/aarch64/fpu/s_roundeven.c
new file mode 100644 (file)
index 0000000..d74b40d
--- /dev/null
@@ -0,0 +1,29 @@
+/* Copyright (C) 2021 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 <libm-alias-double.h>
+
+double
+__roundeven (double x)
+{
+  asm volatile ("frintn \t%d0, %d1" : "=w" (x) : "w" (x));
+  return x;
+}
+hidden_def (__roundeven)
+libm_alias_double (__roundeven, roundeven)
diff --git a/sysdeps/aarch64/fpu/s_roundevenf.c b/sysdeps/aarch64/fpu/s_roundevenf.c
new file mode 100644 (file)
index 0000000..dfc492c
--- /dev/null
@@ -0,0 +1,28 @@
+/* Copyright (C) 2021 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 <libm-alias-float.h>
+
+float
+__roundevenf (float x)
+{
+  asm volatile ("frintn \t%s0, %s1" : "=w" (x) : "w" (x));
+  return x;
+}
+libm_alias_float (__roundeven, roundeven)