diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-11-15 08:43:48 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2024-11-15 08:43:48 +0100 |
commit | 1910ecf15bfcc560dc5089d42c9d75bc30b35c2a (patch) | |
tree | ce06587321e192eb766a57984a489d0cdb65f125 /gcc/ginclude | |
parent | 3757009af71cd8404198909f087b5140ce42500a (diff) | |
download | gcc-1910ecf15bfcc560dc5089d42c9d75bc30b35c2a.zip gcc-1910ecf15bfcc560dc5089d42c9d75bc30b35c2a.tar.gz gcc-1910ecf15bfcc560dc5089d42c9d75bc30b35c2a.tar.bz2 |
c: Add _Decimal64x support
The following patch adds _Decimal64x type support. Our dfp libraries (dpd &
libbid) can only handle decimal32, decimal64 and decimal128 formats and I
don't see that changing any time soon, so the following patch just hardcodes
that _Decimal64x has the same mode as _Decimal128 (but is a distinct type).
In the unlikely event some target would introduce something different that
can be of course changed with target hooks but would be an ABI change.
_Decimal128x is optional and we don't have a wider decimal type, so that
type isn't added.
2024-11-15 Jakub Jelinek <jakub@redhat.com>
gcc/
* tree-core.h (enum tree_index): Add TI_DFLOAT64X_TYPE.
* tree.h (dfloat64x_type_node): Define.
* tree.cc (build_common_tree_nodes): Initialize dfloat64x_type_node.
* builtin-types.def (BT_DFLOAT64X): New DEF_PRIMITIVE_TYPE.
(BT_FN_DFLOAT64X): New DEF_FUNCTION_TYPE_0.
(BT_FN_DFLOAT64X_CONST_STRING, BT_FN_DFLOAT64X_DFLOAT64X): New
DEF_FUNCTION_TYPE_1.
* builtins.def (BUILT_IN_FABSD64X, BUILT_IN_INFD64X, BUILT_IN_NAND64X,
BUILT_IN_NANSD64X): New builtins.
* builtins.cc (expand_builtin): Handle BUILT_IN_FABSD64X.
(fold_builtin_0): Handle BUILT_IN_INFD64X.
(fold_builtin_1): Handle BUILT_IN_FABSD64X.
* fold-const-call.cc (fold_const_call): Handle CFN_BUILT_IN_NAND64X
and CFN_BUILT_IN_NANSD64X.
* ginclude/float.h (DEC64X_MANT_DIG, DEC64X_MIN_EXP, DEC64X_MAX_EXP,
DEC64X_MAX, DEC64X_EPSILON, DEC64X_MIN, DEC64X_TRUE_MIN,
DEC64X_SNAN): Redefine.
gcc/c-family/
* c-common.h (enum rid): Add RID_DFLOAT64X.
* c-common.cc (c_global_trees): Fix comment typo. Add
dfloat64x_type_node.
(c_common_nodes_and_builtins): Handle RID_DFLOAT64X.
* c-cppbuiltin.cc (c_cpp_builtins): Call
builtin_define_decimal_float_constants also for dfloat64x_type_node
if non-NULL.
* c-lex.cc (interpret_float): Handle d64x suffixes.
* c-pretty-print.cc (pp_c_floating_constant): Print d64x suffixes
on dfloat64x_type_node typed constants.
gcc/c/
* c-tree.h (enum c_typespec_keyword): Add cts_dfloat64x and adjust
comment.
* c-parser.cc (c_keyword_starts_typename, c_token_starts_declspecs,
c_parser_declspecs, c_parser_gnu_attribute_any_word): Handle
RID_DFLOAT64X.
(c_parser_postfix_expression): Handle _Decimal64x arguments in
__builtin_tgmath.
(warn_for_abs): Handle BUILT_IN_FABSD64X.
* c-decl.cc (declspecs_add_type): Handle cts_dfloat64x and
RID_DFLOAT64X.
(finish_declspecs): Handle cts_dfloat64x.
* c-typeck.cc (c_common_type): Handle dfloat64x_type_node.
gcc/testsuite/
* gcc.dg/dfp/c11-decimal64x-1.c: New test.
* gcc.dg/dfp/c11-decimal64x-2.c: New test.
* gcc.dg/dfp/c23-decimal64x-1.c: New test.
* gcc.dg/dfp/c23-decimal64x-2.c: New test.
* gcc.dg/dfp/c23-decimal64x-3.c: New test.
* gcc.dg/dfp/c23-decimal64x-4.c: New test.
libcpp/
* expr.cc (interpret_float_suffix): Handle d64x and D64x
suffixes, adjust comment.
Diffstat (limited to 'gcc/ginclude')
-rw-r--r-- | gcc/ginclude/float.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/gcc/ginclude/float.h b/gcc/ginclude/float.h index 91b7008..150dfcd 100644 --- a/gcc/ginclude/float.h +++ b/gcc/ginclude/float.h @@ -602,6 +602,23 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #endif /* __STDC_WANT_IEC_60559_DFP_EXT__ || C23. */ +#ifdef __STDC_WANT_IEC_60559_TYPES_EXT__ +#undef DEC64X_MANT_DIG +#define DEC64X_MANT_DIG __DEC64X_MANT_DIG__ +#undef DEC64X_MIN_EXP +#define DEC64X_MIN_EXP __DEC64X_MIN_EXP__ +#undef DEC64X_MAX_EXP +#define DEC64X_MAX_EXP __DEC64X_MAX_EXP__ +#undef DEC64X_MAX +#define DEC64X_MAX __DEC64X_MAX__ +#undef DEC64X_EPSILON +#define DEC64X_EPSILON __DEC64X_EPSILON__ +#undef DEC64X_MIN +#define DEC64X_MIN __DEC64X_MIN__ +#undef DEC64X_TRUE_MIN +#define DEC64X_TRUE_MIN __DEC64X_SUBNORMAL_MIN__ +#endif /* __STDC_WANT_IEC_60559_TYPES_EXT__ */ + #if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L /* Infinity in type _Decimal32. */ @@ -619,6 +636,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define DEC64_SNAN (__builtin_nansd64 ("")) #undef DEC128_SNAN #define DEC128_SNAN (__builtin_nansd128 ("")) +#ifdef __STDC_WANT_IEC_60559_TYPES_EXT__ +#undef DEC64X_SNAN +#define DEC64X_SNAN (__builtin_nansd64x ("")) +#endif /* __STDC_WANT_IEC_60559_TYPES_EXT__ */ #endif /* C23 */ |