205 lines
6.7 KiB
Diff
205 lines
6.7 KiB
Diff
|
|
From 12ab9eae9e8a5b83c778182f15c6216bcbc3dc36 Mon Sep 17 00:00:00 2001
|
||
|
|
From: chenxiaolong <chenxiaolong@loongson.cn>
|
||
|
|
Date: Fri, 1 Sep 2023 11:22:42 +0800
|
||
|
|
Subject: [PATCH 054/124] LoongArch: Implement 128-bit floating point functions
|
||
|
|
in gcc.
|
||
|
|
|
||
|
|
During implementation, float128_type_node is bound with the type "__float128"
|
||
|
|
so that the compiler can correctly identify the type of the function. The
|
||
|
|
"q" suffix is associated with the "f128" function, which makes GCC more
|
||
|
|
flexible to support different user input cases, implementing functions such
|
||
|
|
as __builtin_{huge_valq, infq, fabsq, copysignq, nanq, nansq}.
|
||
|
|
|
||
|
|
gcc/ChangeLog:
|
||
|
|
|
||
|
|
* config/loongarch/loongarch-builtins.cc (loongarch_init_builtins):
|
||
|
|
Associate the __float128 type to float128_type_node so that it can
|
||
|
|
be recognized by the compiler.
|
||
|
|
* config/loongarch/loongarch-c.cc (loongarch_cpu_cpp_builtins):
|
||
|
|
Add the flag "FLOAT128_TYPE" to gcc and associate a function
|
||
|
|
with the suffix "q" to "f128".
|
||
|
|
* doc/extend.texi:Added support for 128-bit floating-point functions on
|
||
|
|
the LoongArch architecture.
|
||
|
|
|
||
|
|
gcc/testsuite/ChangeLog:
|
||
|
|
|
||
|
|
* gcc.target/loongarch/math-float-128.c: New test.
|
||
|
|
|
||
|
|
Signed-off-by: Peng Fan <fanpeng@loongson.cn>
|
||
|
|
Signed-off-by: ticat_fp <fanpeng@loongson.cn>
|
||
|
|
---
|
||
|
|
gcc/config/loongarch/loongarch-builtins.cc | 5 ++
|
||
|
|
gcc/config/loongarch/loongarch-c.cc | 11 +++
|
||
|
|
gcc/doc/extend.texi | 20 ++++-
|
||
|
|
.../gcc.target/loongarch/math-float-128.c | 81 +++++++++++++++++++
|
||
|
|
4 files changed, 114 insertions(+), 3 deletions(-)
|
||
|
|
create mode 100644 gcc/testsuite/gcc.target/loongarch/math-float-128.c
|
||
|
|
|
||
|
|
diff --git a/gcc/config/loongarch/loongarch-builtins.cc b/gcc/config/loongarch/loongarch-builtins.cc
|
||
|
|
index 64fe11168..cb0ea1664 100644
|
||
|
|
--- a/gcc/config/loongarch/loongarch-builtins.cc
|
||
|
|
+++ b/gcc/config/loongarch/loongarch-builtins.cc
|
||
|
|
@@ -256,6 +256,11 @@ loongarch_init_builtins (void)
|
||
|
|
unsigned int i;
|
||
|
|
tree type;
|
||
|
|
|
||
|
|
+ /* Register the type float128_type_node as a built-in type and
|
||
|
|
+ give it an alias "__float128". */
|
||
|
|
+ (*lang_hooks.types.register_builtin_type) (float128_type_node,
|
||
|
|
+ "__float128");
|
||
|
|
+
|
||
|
|
/* Iterate through all of the bdesc arrays, initializing all of the
|
||
|
|
builtin functions. */
|
||
|
|
for (i = 0; i < ARRAY_SIZE (loongarch_builtins); i++)
|
||
|
|
diff --git a/gcc/config/loongarch/loongarch-c.cc b/gcc/config/loongarch/loongarch-c.cc
|
||
|
|
index d6e3e19f0..f779a7355 100644
|
||
|
|
--- a/gcc/config/loongarch/loongarch-c.cc
|
||
|
|
+++ b/gcc/config/loongarch/loongarch-c.cc
|
||
|
|
@@ -99,6 +99,17 @@ loongarch_cpu_cpp_builtins (cpp_reader *pfile)
|
||
|
|
else
|
||
|
|
builtin_define ("__loongarch_frlen=0");
|
||
|
|
|
||
|
|
+ /* Add support for FLOAT128_TYPE on the LoongArch architecture. */
|
||
|
|
+ builtin_define ("__FLOAT128_TYPE__");
|
||
|
|
+
|
||
|
|
+ /* Map the old _Float128 'q' builtins into the new 'f128' builtins. */
|
||
|
|
+ builtin_define ("__builtin_fabsq=__builtin_fabsf128");
|
||
|
|
+ builtin_define ("__builtin_copysignq=__builtin_copysignf128");
|
||
|
|
+ builtin_define ("__builtin_nanq=__builtin_nanf128");
|
||
|
|
+ builtin_define ("__builtin_nansq=__builtin_nansf128");
|
||
|
|
+ builtin_define ("__builtin_infq=__builtin_inff128");
|
||
|
|
+ builtin_define ("__builtin_huge_valq=__builtin_huge_valf128");
|
||
|
|
+
|
||
|
|
/* Native Data Sizes. */
|
||
|
|
builtin_define_with_int_value ("_LOONGARCH_SZINT", INT_TYPE_SIZE);
|
||
|
|
builtin_define_with_int_value ("_LOONGARCH_SZLONG", LONG_TYPE_SIZE);
|
||
|
|
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
|
||
|
|
index 1d1bac255..bb19d0f27 100644
|
||
|
|
--- a/gcc/doc/extend.texi
|
||
|
|
+++ b/gcc/doc/extend.texi
|
||
|
|
@@ -1085,10 +1085,10 @@ types.
|
||
|
|
As an extension, GNU C and GNU C++ support additional floating
|
||
|
|
types, which are not supported by all targets.
|
||
|
|
@itemize @bullet
|
||
|
|
-@item @code{__float128} is available on i386, x86_64, IA-64, and
|
||
|
|
-hppa HP-UX, as well as on PowerPC GNU/Linux targets that enable
|
||
|
|
+@item @code{__float128} is available on i386, x86_64, IA-64, LoongArch
|
||
|
|
+and hppa HP-UX, as well as on PowerPC GNU/Linux targets that enable
|
||
|
|
the vector scalar (VSX) instruction set. @code{__float128} supports
|
||
|
|
-the 128-bit floating type. On i386, x86_64, PowerPC, and IA-64
|
||
|
|
+the 128-bit floating type. On i386, x86_64, PowerPC, LoongArch and IA-64,
|
||
|
|
other than HP-UX, @code{__float128} is an alias for @code{_Float128}.
|
||
|
|
On hppa and IA-64 HP-UX, @code{__float128} is an alias for @code{long
|
||
|
|
double}.
|
||
|
|
@@ -16257,6 +16257,20 @@ function you need to include @code{larchintrin.h}.
|
||
|
|
void __break (imm0_32767)
|
||
|
|
@end smallexample
|
||
|
|
|
||
|
|
+Additional built-in functions are available for LoongArch family
|
||
|
|
+processors to efficiently use 128-bit floating-point (__float128)
|
||
|
|
+values.
|
||
|
|
+
|
||
|
|
+The following are the basic built-in functions supported.
|
||
|
|
+@smallexample
|
||
|
|
+__float128 __builtin_fabsq (__float128);
|
||
|
|
+__float128 __builtin_copysignq (__float128, __float128);
|
||
|
|
+__float128 __builtin_infq (void);
|
||
|
|
+__float128 __builtin_huge_valq (void);
|
||
|
|
+__float128 __builtin_nanq (void);
|
||
|
|
+__float128 __builtin_nansq (void);
|
||
|
|
+@end smallexample
|
||
|
|
+
|
||
|
|
@node MIPS DSP Built-in Functions
|
||
|
|
@subsection MIPS DSP Built-in Functions
|
||
|
|
|
||
|
|
diff --git a/gcc/testsuite/gcc.target/loongarch/math-float-128.c b/gcc/testsuite/gcc.target/loongarch/math-float-128.c
|
||
|
|
new file mode 100644
|
||
|
|
index 000000000..387566a57
|
||
|
|
--- /dev/null
|
||
|
|
+++ b/gcc/testsuite/gcc.target/loongarch/math-float-128.c
|
||
|
|
@@ -0,0 +1,81 @@
|
||
|
|
+/* { dg-do compile } */
|
||
|
|
+/* { dg-options " -march=loongarch64 -O2 " } */
|
||
|
|
+/* { dg-final { scan-assembler-not "my_fabsq2:.*\\bl\t%plt\\(__builtin_fabsq\\).*my_fabsq2" } } */
|
||
|
|
+/* { dg-final { scan-assembler-not "my_copysignq2:.*\\bl\t%plt\\(__builtin_copysignq\\).*my_copysignq2" } } */
|
||
|
|
+/* { dg-final { scan-assembler-not "my_infq2:.*\\bl\t%plt\\(__builtin_infq\\).*my_infq2" } } */
|
||
|
|
+/* { dg-final { scan-assembler-not "my_huge_valq2:.*\\bl\t%plt\\(__builtin_huge_valq\\).*my_huge_valq2" } } */
|
||
|
|
+/* { dg-final { scan-assembler-not "my_nanq2:.*\\bl\t%plt\\(__builtin_nanq\\).*my_nanq2" } } */
|
||
|
|
+/* { dg-final { scan-assembler-not "my_nansq2:.*\\bl\t%plt\\(__builtin_nansq\\).*my_nansq2" } } */
|
||
|
|
+
|
||
|
|
+__float128
|
||
|
|
+my_fabsq1 (__float128 a)
|
||
|
|
+{
|
||
|
|
+ return __builtin_fabsq (a);
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+_Float128
|
||
|
|
+my_fabsq2 (_Float128 a)
|
||
|
|
+{
|
||
|
|
+ return __builtin_fabsq (a);
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+__float128
|
||
|
|
+my_copysignq1 (__float128 a, __float128 b)
|
||
|
|
+{
|
||
|
|
+ return __builtin_copysignq (a, b);
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+_Float128
|
||
|
|
+my_copysignq2 (_Float128 a, _Float128 b)
|
||
|
|
+{
|
||
|
|
+ return __builtin_copysignq (a, b);
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+__float128
|
||
|
|
+my_infq1 (void)
|
||
|
|
+{
|
||
|
|
+ return __builtin_infq ();
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+_Float128
|
||
|
|
+my_infq2 (void)
|
||
|
|
+{
|
||
|
|
+ return __builtin_infq ();
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+__float128
|
||
|
|
+my_huge_valq1 (void)
|
||
|
|
+{
|
||
|
|
+ return __builtin_huge_valq ();
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+_Float128
|
||
|
|
+my_huge_valq2 (void)
|
||
|
|
+{
|
||
|
|
+ return __builtin_huge_valq ();
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+__float128
|
||
|
|
+my_nanq1 (void)
|
||
|
|
+{
|
||
|
|
+ return __builtin_nanq ("");
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+_Float128
|
||
|
|
+my_nanq2 (void)
|
||
|
|
+{
|
||
|
|
+ return __builtin_nanq ("");
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+__float128
|
||
|
|
+my_nansq1 (void)
|
||
|
|
+{
|
||
|
|
+ return __builtin_nansq ("");
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+_Float128
|
||
|
|
+my_nansq2 (void)
|
||
|
|
+{
|
||
|
|
+ return __builtin_nansq ("");
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
--
|
||
|
|
2.33.0
|
||
|
|
|