Projects
openEuler:24.03:SP1:Everything
gcc
_service:tar_scm:LoongArch-Implement-128-bit-fl...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:LoongArch-Implement-128-bit-floating-point-functions.patch of Package gcc
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
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2