aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-family/c-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/c-family/c-common.c')
-rw-r--r--gcc/c-family/c-common.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 9082883..32468ca 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -434,6 +434,13 @@ const struct c_common_resword c_common_reswords[] =
{ "_Cilk_sync", RID_CILK_SYNC, 0 },
{ "_Cilk_for", RID_CILK_FOR, 0 },
{ "_Imaginary", RID_IMAGINARY, D_CONLY },
+ { "_Float16", RID_FLOAT16, D_CONLY },
+ { "_Float32", RID_FLOAT32, D_CONLY },
+ { "_Float64", RID_FLOAT64, D_CONLY },
+ { "_Float128", RID_FLOAT128, D_CONLY },
+ { "_Float32x", RID_FLOAT32X, D_CONLY },
+ { "_Float64x", RID_FLOAT64X, D_CONLY },
+ { "_Float128x", RID_FLOAT128X, D_CONLY },
{ "_Decimal32", RID_DFLOAT32, D_CONLY | D_EXT },
{ "_Decimal64", RID_DFLOAT64, D_CONLY | D_EXT },
{ "_Decimal128", RID_DFLOAT128, D_CONLY | D_EXT },
@@ -3478,6 +3485,11 @@ c_common_type_for_mode (machine_mode mode, int unsignedp)
if (mode == TYPE_MODE (long_double_type_node))
return long_double_type_node;
+ for (i = 0; i < NUM_FLOATN_NX_TYPES; i++)
+ if (FLOATN_NX_TYPE_NODE (i) != NULL_TREE
+ && mode == TYPE_MODE (FLOATN_NX_TYPE_NODE (i)))
+ return FLOATN_NX_TYPE_NODE (i);
+
if (mode == TYPE_MODE (void_type_node))
return void_type_node;
@@ -3503,6 +3515,11 @@ c_common_type_for_mode (machine_mode mode, int unsignedp)
if (mode == TYPE_MODE (complex_long_double_type_node))
return complex_long_double_type_node;
+ for (i = 0; i < NUM_FLOATN_NX_TYPES; i++)
+ if (COMPLEX_FLOATN_NX_TYPE_NODE (i) != NULL_TREE
+ && mode == TYPE_MODE (COMPLEX_FLOATN_NX_TYPE_NODE (i)))
+ return COMPLEX_FLOATN_NX_TYPE_NODE (i);
+
if (mode == TYPE_MODE (complex_integer_type_node) && !unsignedp)
return complex_integer_type_node;
@@ -5406,6 +5423,12 @@ c_common_nodes_and_builtins (void)
record_builtin_type (RID_DOUBLE, NULL, double_type_node);
record_builtin_type (RID_MAX, "long double", long_double_type_node);
+ if (!c_dialect_cxx ())
+ for (i = 0; i < NUM_FLOATN_NX_TYPES; i++)
+ if (FLOATN_NX_TYPE_NODE (i) != NULL_TREE)
+ record_builtin_type ((enum rid) (RID_FLOATN_NX_FIRST + i), NULL,
+ FLOATN_NX_TYPE_NODE (i));
+
/* Only supported decimal floating point extension if the target
actually supports underlying modes. */
if (targetm.scalar_mode_supported_p (SDmode)
@@ -5495,6 +5518,20 @@ c_common_nodes_and_builtins (void)
TYPE_DECL, get_identifier ("complex long double"),
complex_long_double_type_node));
+ if (!c_dialect_cxx ())
+ for (i = 0; i < NUM_FLOATN_NX_TYPES; i++)
+ if (COMPLEX_FLOATN_NX_TYPE_NODE (i) != NULL_TREE)
+ {
+ char buf[30];
+ sprintf (buf, "complex _Float%d%s", floatn_nx_types[i].n,
+ floatn_nx_types[i].extended ? "x" : "");
+ lang_hooks.decls.pushdecl
+ (build_decl (UNKNOWN_LOCATION,
+ TYPE_DECL,
+ get_identifier (buf),
+ COMPLEX_FLOATN_NX_TYPE_NODE (i)));
+ }
+
if (c_dialect_cxx ())
/* For C++, make fileptr_type_node a distinct void * type until
FILE type is defined. */
@@ -12523,6 +12560,7 @@ keyword_begins_type_specifier (enum rid keyword)
case RID_LONG:
case RID_SHORT:
case RID_SIGNED:
+ CASE_RID_FLOATN_NX:
case RID_DFLOAT32:
case RID_DFLOAT64:
case RID_DFLOAT128: