From 1910ecf15bfcc560dc5089d42c9d75bc30b35c2a Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 15 Nov 2024 08:43:48 +0100 Subject: 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 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. --- libcpp/expr.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'libcpp') diff --git a/libcpp/expr.cc b/libcpp/expr.cc index 6852337..d312765 100644 --- a/libcpp/expr.cc +++ b/libcpp/expr.cc @@ -102,9 +102,7 @@ interpret_float_suffix (cpp_reader *pfile, const uchar *s, size_t len) df, DF, d32, D32 - _Decimal32. dd, DD, d64, D64 - _Decimal64. dl, DL, d128, D128 - _Decimal128. - - The dN and DN suffixes for _DecimalN, and dNx and DNx for - _DecimalNx, defined in TS 18661-3:2015, are not supported. + d64x, D64x - _Decimal64x. Fixed-point suffixes, from TR 18037:2008, are supported. They consist of three parts, in order: @@ -258,8 +256,13 @@ interpret_float_suffix (cpp_reader *pfile, const uchar *s, size_t len) { if (s[1] == '3' && s[2] == '2' && len == 2) return CPP_N_DFLOAT | CPP_N_SMALL; - if (s[1] == '6' && s[2] == '4' && len == 2) - return CPP_N_DFLOAT | CPP_N_MEDIUM; + if (s[1] == '6' && s[2] == '4') + { + if (len == 2) + return CPP_N_DFLOAT | CPP_N_MEDIUM; + if (len == 3 && s[3] == 'x') + return CPP_N_DFLOAT | CPP_N_FLOATNX; + } if (s[1] == '1' && s[2] == '2' && len == 3 && s[3] == '8') return CPP_N_DFLOAT | CPP_N_LARGE; } -- cgit v1.1