tree aarch64_fp16_ptr_type_node = NULL_TREE;
/* Back-end node type for brain float (bfloat) types. */
-tree aarch64_bf16_type_node = NULL_TREE;
tree aarch64_bf16_ptr_type_node = NULL_TREE;
/* Wrapper around add_builtin_function. NAME is the name of the built-in
case E_DFmode:
return double_type_node;
case E_BFmode:
- return aarch64_bf16_type_node;
+ return bfloat16_type_node;
default:
gcc_unreachable ();
}
aarch64_simd_types[Float64x2_t].eltype = double_type_node;
/* Init Bfloat vector types with underlying __bf16 type. */
- aarch64_simd_types[Bfloat16x4_t].eltype = aarch64_bf16_type_node;
- aarch64_simd_types[Bfloat16x8_t].eltype = aarch64_bf16_type_node;
+ aarch64_simd_types[Bfloat16x4_t].eltype = bfloat16_type_node;
+ aarch64_simd_types[Bfloat16x8_t].eltype = bfloat16_type_node;
for (i = 0; i < nelts; i++)
{
"__builtin_aarch64_simd_poly128");
(*lang_hooks.types.register_builtin_type) (intTI_type_node,
"__builtin_aarch64_simd_ti");
- (*lang_hooks.types.register_builtin_type) (aarch64_bf16_type_node,
+ (*lang_hooks.types.register_builtin_type) (bfloat16_type_node,
"__builtin_aarch64_simd_bf");
/* Unsigned integer types for various mode sizes. */
(*lang_hooks.types.register_builtin_type) (unsigned_intQI_type_node,
static void
aarch64_init_bf16_types (void)
{
- aarch64_bf16_type_node = make_node (REAL_TYPE);
- TYPE_PRECISION (aarch64_bf16_type_node) = 16;
- SET_TYPE_MODE (aarch64_bf16_type_node, BFmode);
- layout_type (aarch64_bf16_type_node);
-
- lang_hooks.types.register_builtin_type (aarch64_bf16_type_node, "__bf16");
- aarch64_bf16_ptr_type_node = build_pointer_type (aarch64_bf16_type_node);
+ lang_hooks.types.register_builtin_type (bfloat16_type_node, "__bf16");
+ aarch64_bf16_ptr_type_node = build_pointer_type (bfloat16_type_node);
}
/* Pointer authentication builtins that will become NOP on legacy platform.
DEF_SVE_MODE (vnum, none, none, vectors)
DEF_SVE_TYPE (svbool_t, 10, __SVBool_t, boolean_type_node)
-DEF_SVE_TYPE (svbfloat16_t, 14, __SVBfloat16_t, aarch64_bf16_type_node)
+DEF_SVE_TYPE (svbfloat16_t, 14, __SVBfloat16_t, bfloat16_type_node)
DEF_SVE_TYPE (svfloat16_t, 13, __SVFloat16_t, aarch64_fp16_type_node)
DEF_SVE_TYPE (svfloat32_t, 13, __SVFloat32_t, float_type_node)
DEF_SVE_TYPE (svfloat64_t, 13, __SVFloat64_t, double_type_node)
field_ptr_t = aarch64_fp16_ptr_type_node;
break;
case E_BFmode:
- field_t = aarch64_bf16_type_node;
+ field_t = bfloat16_type_node;
field_ptr_t = aarch64_bf16_ptr_type_node;
break;
case E_V2SImode:
}
/* Implement TARGET_LIBGCC_FLOATING_POINT_MODE_SUPPORTED_P - return TRUE
- if MODE is HFmode, and punt to the generic implementation otherwise. */
+ if MODE is [BH]Fmode, and punt to the generic implementation otherwise. */
static bool
aarch64_libgcc_floating_mode_supported_p (scalar_float_mode mode)
{
- return (mode == HFmode
+ return ((mode == HFmode || mode == BFmode)
? true
: default_libgcc_floating_mode_supported_p (mode));
}
/* Implement TARGET_SCALAR_MODE_SUPPORTED_P - return TRUE
- if MODE is HFmode, and punt to the generic implementation otherwise. */
+ if MODE is [BH]Fmode, and punt to the generic implementation otherwise. */
static bool
aarch64_scalar_mode_supported_p (scalar_mode mode)
if (DECIMAL_FLOAT_MODE_P (mode))
return default_decimal_float_supported_p ();
- return (mode == HFmode
+ return ((mode == HFmode || mode == BFmode)
? true
: default_scalar_mode_supported_p (mode));
}
return NULL_TREE;
}
-/* Return the diagnostic message string if conversion from FROMTYPE to
- TOTYPE is not allowed, NULL otherwise. */
-
-static const char *
-aarch64_invalid_conversion (const_tree fromtype, const_tree totype)
-{
- if (element_mode (fromtype) != element_mode (totype))
- {
- /* Do no allow conversions to/from BFmode scalar types. */
- if (TYPE_MODE (fromtype) == BFmode)
- return N_("invalid conversion from type %<bfloat16_t%>");
- if (TYPE_MODE (totype) == BFmode)
- return N_("invalid conversion to type %<bfloat16_t%>");
- }
-
- /* Conversion allowed. */
- return NULL;
-}
-
-/* Return the diagnostic message string if the unary operation OP is
- not permitted on TYPE, NULL otherwise. */
-
-static const char *
-aarch64_invalid_unary_op (int op, const_tree type)
-{
- /* Reject all single-operand operations on BFmode except for &. */
- if (element_mode (type) == BFmode && op != ADDR_EXPR)
- return N_("operation not permitted on type %<bfloat16_t%>");
-
- /* Operation allowed. */
- return NULL;
-}
-
/* Return the diagnostic message string if the binary operation OP is
not permitted on TYPE1 and TYPE2, NULL otherwise. */
aarch64_invalid_binary_op (int op ATTRIBUTE_UNUSED, const_tree type1,
const_tree type2)
{
- /* Reject all 2-operand operations on BFmode. */
- if (element_mode (type1) == BFmode
- || element_mode (type2) == BFmode)
- return N_("operation not permitted on type %<bfloat16_t%>");
-
if (VECTOR_TYPE_P (type1)
&& VECTOR_TYPE_P (type2)
&& !TYPE_INDIVISIBLE_P (type1)
#undef TARGET_MANGLE_TYPE
#define TARGET_MANGLE_TYPE aarch64_mangle_type
-#undef TARGET_INVALID_CONVERSION
-#define TARGET_INVALID_CONVERSION aarch64_invalid_conversion
-
-#undef TARGET_INVALID_UNARY_OP
-#define TARGET_INVALID_UNARY_OP aarch64_invalid_unary_op
-
#undef TARGET_INVALID_BINARY_OP
#define TARGET_INVALID_BINARY_OP aarch64_invalid_binary_op
extern GTY(()) tree aarch64_fp16_type_node;
extern GTY(()) tree aarch64_fp16_ptr_type_node;
-/* This type is the user-visible __bf16, and a pointer to that type. Defined
- in aarch64-builtins.cc. */
-extern GTY(()) tree aarch64_bf16_type_node;
+/* Pointer to the user-visible __bf16 type. __bf16 itself is generic
+ bfloat16_type_node. Defined in aarch64-builtins.cc. */
extern GTY(()) tree aarch64_bf16_ptr_type_node;
/* The generic unwind code in libgcc does not initialize the frame pointer.
{
bfloat16_t (); /* { dg-bogus {invalid conversion to type 'bfloat16_t'} "" } */
bfloat16_t a = bfloat16_t(); /* { dg-bogus {invalid conversion to type 'bfloat16_t'} "" } */
- bfloat16_t (0x1234); /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t (0.1); /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
+ bfloat16_t (0x1234);
+ bfloat16_t (0.1);
}
float *float_ptr;
-bfloat16_t foo1 (void) { return (bfloat16_t) 0x1234; } /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
-bfloat16_t foo2 (void) { return (bfloat16_t) (short) 0x1234; } /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
+bfloat16_t foo1 (void) { return (bfloat16_t) 0x1234; }
+bfloat16_t foo2 (void) { return (bfloat16_t) (short) 0x1234; }
bfloat16_t footest (bfloat16_t scalar0)
{
bfloat16_t scalar1_1;
bfloat16_t scalar1_2 = glob_bfloat;
- bfloat16_t scalar1_3 = 0; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar1_4 = 0.1; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar1_5 = is_a_float; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar1_6 = is_an_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar1_7 = is_a_float16; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar1_8 = is_a_double; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar1_9 = is_a_short_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
-
- int initi_1_1 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- float initi_1_2 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- float16_t initi_1_3 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- short initi_1_4 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- double initi_1_5 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
+ bfloat16_t scalar1_3 = 0;
+ bfloat16_t scalar1_4 = 0.1;
+ bfloat16_t scalar1_5 = is_a_float;
+ bfloat16_t scalar1_6 = is_an_int;
+ bfloat16_t scalar1_7 = is_a_float16;
+ bfloat16_t scalar1_8 = is_a_double;
+ bfloat16_t scalar1_9 = is_a_short_int;
+
+ int initi_1_1 = glob_bfloat;
+ float initi_1_2 = glob_bfloat;
+ float16_t initi_1_3 = glob_bfloat;
+ short initi_1_4 = glob_bfloat;
+ double initi_1_5 = glob_bfloat;
bfloat16_t scalar2_1 = {};
bfloat16_t scalar2_2 = { glob_bfloat };
- bfloat16_t scalar2_3 = { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar2_4 = { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar2_5 = { is_a_float }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar2_6 = { is_an_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar2_7 = { is_a_float16 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar2_8 = { is_a_double }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16_t scalar2_9 = { is_a_short_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
-
- int initi_2_1 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- float initi_2_2 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- float16_t initi_2_3 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- short initi_2_4 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- double initi_2_5 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
+ bfloat16_t scalar2_3 = { 0 };
+ bfloat16_t scalar2_4 = { 0.1 };
+ bfloat16_t scalar2_5 = { is_a_float };
+ bfloat16_t scalar2_6 = { is_an_int };
+ bfloat16_t scalar2_7 = { is_a_float16 };
+ bfloat16_t scalar2_8 = { is_a_double };
+ bfloat16_t scalar2_9 = { is_a_short_int };
+
+ int initi_2_1 = { glob_bfloat };
+ float initi_2_2 = { glob_bfloat };
+ float16_t initi_2_3 = { glob_bfloat };
+ short initi_2_4 = { glob_bfloat };
+ double initi_2_5 = { glob_bfloat };
/* Assignments. */
glob_bfloat = glob_bfloat;
- glob_bfloat = 0; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- glob_bfloat = 0.1; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- glob_bfloat = is_a_float; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- glob_bfloat = is_an_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- glob_bfloat = is_a_float16; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- glob_bfloat = is_a_double; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- glob_bfloat = is_a_short_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
-
- is_an_int = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- is_a_float = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- is_a_float16 = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- is_a_double = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- is_a_short_int = glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
+ glob_bfloat = 0;
+ glob_bfloat = 0.1;
+ glob_bfloat = is_a_float;
+ glob_bfloat = is_an_int;
+ glob_bfloat = is_a_float16;
+ glob_bfloat = is_a_double;
+ glob_bfloat = is_a_short_int;
+
+ is_an_int = glob_bfloat;
+ is_a_float = glob_bfloat;
+ is_a_float16 = glob_bfloat;
+ is_a_double = glob_bfloat;
+ is_a_short_int = glob_bfloat;
/* Casting. */
(void) glob_bfloat;
(bfloat16_t) glob_bfloat;
- (int) glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- (float) glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- (float16_t) glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- (double) glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- (short) glob_bfloat; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
+ (int) glob_bfloat;
+ (float) glob_bfloat;
+ (float16_t) glob_bfloat;
+ (double) glob_bfloat;
+ (short) glob_bfloat;
- (bfloat16_t) is_an_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16_t) is_a_float; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16_t) is_a_float16; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16_t) is_a_double; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16_t) is_a_short_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
+ (bfloat16_t) is_an_int;
+ (bfloat16_t) is_a_float;
+ (bfloat16_t) is_a_float16;
+ (bfloat16_t) is_a_double;
+ (bfloat16_t) is_a_short_int;
/* Compound literals. */
(bfloat16_t) {};
(bfloat16_t) { glob_bfloat };
- (bfloat16_t) { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16_t) { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16_t) { is_a_float }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16_t) { is_an_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16_t) { is_a_float16 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16_t) { is_a_double }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16_t) { is_a_short_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
-
- (int) { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- (float) { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- (float16_t) { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- (double) { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- (short) { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
+ (bfloat16_t) { 0 };
+ (bfloat16_t) { 0.1 };
+ (bfloat16_t) { is_a_float };
+ (bfloat16_t) { is_an_int };
+ (bfloat16_t) { is_a_float16 };
+ (bfloat16_t) { is_a_double };
+ (bfloat16_t) { is_a_short_int };
+
+ (int) { glob_bfloat };
+ (float) { glob_bfloat };
+ (float16_t) { glob_bfloat };
+ (double) { glob_bfloat };
+ (short) { glob_bfloat };
/* Arrays and Structs. */
bfloat_ptr = &bfloat_ptr3[1];
/* Simple comparison. */
- scalar0 > glob_bfloat; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- glob_bfloat == scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0 > is_a_float; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- is_a_float == scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0 > 0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- 0 == scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0 > 0.1; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- 0.1 == scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0 > is_an_int; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- is_an_int == scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ scalar0 > glob_bfloat;
+ glob_bfloat == scalar0;
+ scalar0 > is_a_float;
+ is_a_float == scalar0;
+ scalar0 > 0;
+ 0 == scalar0;
+ scalar0 > 0.1;
+ 0.1 == scalar0;
+ scalar0 > is_an_int;
+ is_an_int == scalar0;
/* Pointer comparison. */
/* Conditional expressions. */
0 ? scalar0 : scalar0;
- 0 ? scalar0 : is_a_float; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- 0 ? is_a_float : scalar0; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- 0 ? scalar0 : 0; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- 0 ? 0 : scalar0; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- 0 ? 0.1 : scalar0; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- 0 ? scalar0 : 0.1; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
+ 0 ? scalar0 : is_a_float;
+ 0 ? is_a_float : scalar0;
+ 0 ? scalar0 : 0;
+ 0 ? 0 : scalar0;
+ 0 ? 0.1 : scalar0;
+ 0 ? scalar0 : 0.1;
0 ? bfloat_ptr : bfloat_ptr2;
0 ? bfloat_ptr : float_ptr; /* { dg-error {pointer type mismatch in conditional expression} } */
0 ? float_ptr : bfloat_ptr; /* { dg-error {pointer type mismatch in conditional expression} } */
- scalar0 ? scalar0 : scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0 ? is_a_float : scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0 ? scalar0 : is_a_float; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0 ? is_a_float : is_a_float; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ scalar0 ? scalar0 : scalar0;
+ scalar0 ? is_a_float : scalar0;
+ scalar0 ? scalar0 : is_a_float;
+ scalar0 ? is_a_float : is_a_float;
/* Unary operators. */
- +scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- -scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- ~scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- !scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ +scalar0;
+ -scalar0;
+ ~scalar0; /* { dg-error {wrong type argument to bit-complement} } */
+ !scalar0;
*scalar0; /* { dg-error {invalid type argument of unary '\*'} } */
- __real scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- __imag scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- ++scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- --scalar0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0++; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0--; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ __real scalar0;
+ __imag scalar0;
+ ++scalar0;
+ --scalar0;
+ scalar0++;
+ scalar0--;
/* Binary arithmetic operations. */
- scalar0 = glob_bfloat + *bfloat_ptr; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0 = glob_bfloat + 0.1; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0 = glob_bfloat + 0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- scalar0 = glob_bfloat + is_a_float; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ scalar0 = glob_bfloat + *bfloat_ptr;
+ scalar0 = glob_bfloat + 0.1;
+ scalar0 = glob_bfloat + 0;
+ scalar0 = glob_bfloat + is_a_float;
return scalar0;
}
bfloat16x4_t vector2_1 = {};
bfloat16x4_t vector2_2 = { glob_bfloat };
bfloat16x4_t vector2_3 = { glob_bfloat, glob_bfloat, glob_bfloat, glob_bfloat };
- bfloat16x4_t vector2_4 = { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x4_t vector2_5 = { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x4_t vector2_6 = { is_a_float16 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x4_t vector2_7 = { is_a_float }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x4_t vector2_8 = { is_an_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x4_t vector2_9 = { is_a_short_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x4_t vector2_10 = { 0.0, 0, is_a_short_int, is_a_float }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
-
- int32x4_t initi_2_1 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- float32x4_t initi_2_2 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- float16x4_t initi_2_3 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- float32x2_t initi_2_4 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- int32x2_t initi_2_5 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- int16x4_t initi_2_6 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
+ bfloat16x4_t vector2_4 = { 0 };
+ bfloat16x4_t vector2_5 = { 0.1 };
+ bfloat16x4_t vector2_6 = { is_a_float16 };
+ bfloat16x4_t vector2_7 = { is_a_float };
+ bfloat16x4_t vector2_8 = { is_an_int };
+ bfloat16x4_t vector2_9 = { is_a_short_int };
+ bfloat16x4_t vector2_10 = { 0.0, 0, is_a_short_int, is_a_float };
+
+ int32x4_t initi_2_1 = { glob_bfloat };
+ float32x4_t initi_2_2 = { glob_bfloat };
+ float16x4_t initi_2_3 = { glob_bfloat };
+ float32x2_t initi_2_4 = { glob_bfloat };
+ int32x2_t initi_2_5 = { glob_bfloat };
+ int16x4_t initi_2_6 = { glob_bfloat };
/* Assignments to/from vectors. */
/* Assignments to/from elements. */
vector2_3[0] = glob_bfloat;
- vector2_3[0] = is_an_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- vector2_3[0] = is_a_short_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- vector2_3[0] = is_a_float; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- vector2_3[0] = is_a_float16; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- vector2_3[0] = 0; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- vector2_3[0] = 0.1; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
+ vector2_3[0] = is_an_int;
+ vector2_3[0] = is_a_short_int;
+ vector2_3[0] = is_a_float;
+ vector2_3[0] = is_a_float16;
+ vector2_3[0] = 0;
+ vector2_3[0] = 0.1;
glob_bfloat = vector2_3[0];
- is_an_int = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- is_a_short_int = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- is_a_float = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- is_a_float16 = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
+ is_an_int = vector2_3[0];
+ is_a_short_int = vector2_3[0];
+ is_a_float = vector2_3[0];
+ is_a_float16 = vector2_3[0];
/* Compound literals. */
(bfloat16x4_t) {};
- (bfloat16x4_t) { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16x4_t) { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
+ (bfloat16x4_t) { 0 };
+ (bfloat16x4_t) { 0.1 };
(bfloat16x4_t) { is_a_float_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'float32x4_t'} } */
(bfloat16x4_t) { is_an_int_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'int32x4_t'} } */
(bfloat16x4_t) { is_a_float_pair }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'float32x2_t'} } */
bfloat_ptr = &bfloat_ptr3[1];
/* Simple comparison. */
- vector0 > glob_bfloat_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- glob_bfloat_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 > is_a_float_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- is_a_float_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 > 0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- 0 == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 > 0.1; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- 0.1 == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 > is_an_int_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- is_an_int_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ vector0 > glob_bfloat_vec;
+ glob_bfloat_vec == vector0;
+ vector0 > is_a_float_vec; /* { dg-error {comparing vectors with different element types} } */
+ is_a_float_vec == vector0; /* { dg-error {comparing vectors with different element types} } */
+ vector0 > 0;
+ 0 == vector0;
+ vector0 > 0.1; /* { dg-error {conversion of scalar 'double' to vector 'bfloat16x4_t' involves truncation} } */
+ 0.1 == vector0; /* { dg-error {conversion of scalar 'double' to vector 'bfloat16x4_t' involves truncation} } */
+ vector0 > is_an_int_vec; /* { dg-error {comparing vectors with different element types} } */
+ is_an_int_vec == vector0; /* { dg-error {comparing vectors with different element types} } */
/* Pointer comparison. */
/* Unary operators. */
- +vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- -vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- ~vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- !vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ +vector0;
+ -vector0;
+ ~vector0; /* { dg-error {wrong type argument to bit-complement} } */
+ !vector0; /* { dg-error {wrong type argument to unary exclamation mark} } */
*vector0; /* { dg-error {invalid type argument of unary '\*'} } */
- __real vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- __imag vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- ++vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- --vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0++; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0--; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ __real vector0; /* { dg-error {wrong type argument to __real} } */
+ __imag vector0; /* { dg-error {wrong type argument to __imag} } */
+ ++vector0;
+ --vector0;
+ vector0++;
+ vector0--;
/* Binary arithmetic operations. */
- vector0 = glob_bfloat_vec + *bfloat_ptr; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 = glob_bfloat_vec + 0.1; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 = glob_bfloat_vec + 0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 = glob_bfloat_vec + is_a_float_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ vector0 = glob_bfloat_vec + *bfloat_ptr;
+ vector0 = glob_bfloat_vec + 0.1; /* { dg-error {conversion of scalar 'double' to vector 'bfloat16x4_t' involves truncation} } */
+ vector0 = glob_bfloat_vec + 0;
+ vector0 = glob_bfloat_vec + is_a_float_vec; /* { dg-error {invalid operands to binary \+} } */
return vector0;
}
bfloat16x8_t vector2_1 = {};
bfloat16x8_t vector2_2 = { glob_bfloat };
bfloat16x8_t vector2_3 = { glob_bfloat, glob_bfloat, glob_bfloat, glob_bfloat };
- bfloat16x8_t vector2_4 = { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x8_t vector2_5 = { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x8_t vector2_6 = { is_a_float16 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x8_t vector2_7 = { is_a_float }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x8_t vector2_8 = { is_an_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x8_t vector2_9 = { is_a_short_int }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- bfloat16x8_t vector2_10 = { 0.0, 0, is_a_short_int, is_a_float }; /* { dg-error "invalid conversion to type 'bfloat16_t'" } */
-
- int32x4_t initi_2_1 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- float32x4_t initi_2_2 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- float16x8_t initi_2_3 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- float64x2_t initi_2_4 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- int64x2_t initi_2_5 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- int16x8_t initi_2_6 = { glob_bfloat }; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
+ bfloat16x8_t vector2_4 = { 0 };
+ bfloat16x8_t vector2_5 = { 0.1 };
+ bfloat16x8_t vector2_6 = { is_a_float16 };
+ bfloat16x8_t vector2_7 = { is_a_float };
+ bfloat16x8_t vector2_8 = { is_an_int };
+ bfloat16x8_t vector2_9 = { is_a_short_int };
+ bfloat16x8_t vector2_10 = { 0.0, 0, is_a_short_int, is_a_float };
+
+ int32x4_t initi_2_1 = { glob_bfloat };
+ float32x4_t initi_2_2 = { glob_bfloat };
+ float16x8_t initi_2_3 = { glob_bfloat };
+ float64x2_t initi_2_4 = { glob_bfloat };
+ int64x2_t initi_2_5 = { glob_bfloat };
+ int16x8_t initi_2_6 = { glob_bfloat };
/* Assignments to/from vectors. */
/* Assignments to/from elements. */
vector2_3[0] = glob_bfloat;
- vector2_3[0] = is_an_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- vector2_3[0] = is_a_short_int; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- vector2_3[0] = is_a_float; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- vector2_3[0] = is_a_float16; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- vector2_3[0] = 0; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- vector2_3[0] = 0.1; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
+ vector2_3[0] = is_an_int;
+ vector2_3[0] = is_a_short_int;
+ vector2_3[0] = is_a_float;
+ vector2_3[0] = is_a_float16;
+ vector2_3[0] = 0;
+ vector2_3[0] = 0.1;
glob_bfloat = vector2_3[0];
- is_an_int = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- is_a_short_int = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- is_a_float = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
- is_a_float16 = vector2_3[0]; /* { dg-error {invalid conversion from type 'bfloat16_t'} } */
+ is_an_int = vector2_3[0];
+ is_a_short_int = vector2_3[0];
+ is_a_float = vector2_3[0];
+ is_a_float16 = vector2_3[0];
/* Compound literals. */
(bfloat16x8_t) {};
- (bfloat16x8_t) { 0 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
- (bfloat16x8_t) { 0.1 }; /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
+ (bfloat16x8_t) { 0 };
+ (bfloat16x8_t) { 0.1 };
(bfloat16x8_t) { is_a_float_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'float32x4_t'} } */
(bfloat16x8_t) { is_an_int_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'int32x4_t'} } */
(bfloat16x8_t) { is_a_double_pair }; /* { dg-error {incompatible types when initializing type '__bf16' using type 'float64x2_t'} } */
bfloat_ptr = &bfloat_ptr3[1];
/* Simple comparison. */
- vector0 > glob_bfloat_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- glob_bfloat_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 > is_a_float_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- is_a_float_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 > 0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- 0 == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 > 0.1; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- 0.1 == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 > is_an_int_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- is_an_int_vec == vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ vector0 > glob_bfloat_vec;
+ glob_bfloat_vec == vector0;
+ vector0 > is_a_float_vec; /* { dg-error {comparing vectors with different element types} } */
+ is_a_float_vec == vector0; /* { dg-error {comparing vectors with different element types} } */
+ vector0 > 0;
+ 0 == vector0;
+ vector0 > 0.1; /* { dg-error {conversion of scalar 'double' to vector 'bfloat16x8_t' involves truncation} } */
+ 0.1 == vector0; /* { dg-error {conversion of scalar 'double' to vector 'bfloat16x8_t' involves truncation} } */
+ vector0 > is_an_int_vec; /* { dg-error {comparing vectors with different element types} } */
+ is_an_int_vec == vector0; /* { dg-error {comparing vectors with different element types} } */
/* Pointer comparison. */
/* Unary operators. */
- +vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- -vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- ~vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- !vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ +vector0;
+ -vector0;
+ ~vector0; /* { dg-error {wrong type argument to bit-complement} } */
+ !vector0; /* { dg-error {wrong type argument to unary exclamation mark} } */
*vector0; /* { dg-error {invalid type argument of unary '\*'} } */
- __real vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- __imag vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- ++vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- --vector0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0++; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0--; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ __real vector0; /* { dg-error {wrong type argument to __real} } */
+ __imag vector0; /* { dg-error {wrong type argument to __imag} } */
+ ++vector0;
+ --vector0;
+ vector0++;
+ vector0--;
/* Binary arithmetic operations. */
- vector0 = glob_bfloat_vec + *bfloat_ptr; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 = glob_bfloat_vec + 0.1; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 = glob_bfloat_vec + 0; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
- vector0 = glob_bfloat_vec + is_a_float_vec; /* { dg-error {operation not permitted on type 'bfloat16_t'} } */
+ vector0 = glob_bfloat_vec + *bfloat_ptr;
+ vector0 = glob_bfloat_vec + 0.1; /* { dg-error {conversion of scalar 'double' to vector 'bfloat16x8_t' involves truncation} } */
+ vector0 = glob_bfloat_vec + 0;
+ vector0 = glob_bfloat_vec + is_a_float_vec; /* { dg-error {invalid operands to binary \+} } */
return vector0;
}
svbfdot (f32, bf16, bf16);
svbfdot (f32, 0, bf16); /* { dg-error {passing 'int' to argument 2 of 'svbfdot', which expects 'svbfloat16_t'} } */
svbfdot (f32, f32, bf16); /* { dg-error {passing 'svfloat32_t' to argument 2 of 'svbfdot', which expects 'svbfloat16_t'} } */
- svbfdot (f32, bf16, 0); /* { dg-error {invalid conversion to type 'bfloat16_t'} } */
+ svbfdot (f32, bf16, 0);
svbfdot (f32, bf16, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svbfdot', which expects 'svbfloat16_t'} } */
svbfdot (f32, bf16, bf);
}
__mulhc3
__trunctfhf2
}
+
+%inherit GCC_13.0.0 GCC_11.0.0
+GCC_13.0.0 {
+ __extendbfsf2
+ __floatdibf
+ __floattibf
+ __floatundibf
+ __floatuntibf
+ __truncdfbf2
+ __truncsfbf2
+ __trunctfbf2
+ __trunchfbf2
+}
#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_2_udiv(Q,R,X,Y)
#define _FP_NANFRAC_H ((_FP_QNANBIT_H << 1) - 1)
+#define _FP_NANFRAC_B ((_FP_QNANBIT_B << 1) - 1)
#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1)
#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1)
#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1
#define _FP_NANSIGN_H 0
+#define _FP_NANSIGN_B 0
#define _FP_NANSIGN_S 0
#define _FP_NANSIGN_D 0
#define _FP_NANSIGN_Q 0
softfp_float_modes := tf
softfp_int_modes := si di ti
-softfp_extensions := sftf dftf hftf
-softfp_truncations := tfsf tfdf tfhf
+softfp_extensions := sftf dftf hftf bfsf
+softfp_truncations := tfsf tfdf tfhf tfbf dfbf sfbf hfbf
softfp_exclude_libgcc2 := n
-softfp_extras := fixhfti fixunshfti floattihf floatuntihf
+softfp_extras := fixhfti fixunshfti floattihf floatuntihf \
+ floatdibf floatundibf floattibf floatuntibf
TARGET_LIBGCC2_CFLAGS += -Wno-missing-prototypes
--- /dev/null
+/* Software floating-point emulation.
+ Convert a 64bit signed integer to bfloat16
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ In addition to the permissions in the GNU Lesser General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file into
+ combinations with other programs, and to distribute those
+ combinations without any restriction coming from the use of this
+ file. (The Lesser General Public License restrictions do apply in
+ other respects; for example, they cover modification of the file,
+ and distribution when not linked into a combine executable.)
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include "soft-fp.h"
+#include "brain.h"
+
+BFtype
+__floatdibf (DItype i)
+{
+ FP_DECL_EX;
+ FP_DECL_B (A);
+ BFtype a;
+
+ FP_INIT_ROUNDMODE;
+ FP_FROM_INT_B (A, i, DI_BITS, UDItype);
+ FP_PACK_RAW_B (a, A);
+ FP_HANDLE_EXCEPTIONS;
+
+ return a;
+}
--- /dev/null
+/* Software floating-point emulation.
+ Convert a 64bit unsigned integer to bfloat16
+ Copyright (C) 2007-2023 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ In addition to the permissions in the GNU Lesser General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file into
+ combinations with other programs, and to distribute those
+ combinations without any restriction coming from the use of this
+ file. (The Lesser General Public License restrictions do apply in
+ other respects; for example, they cover modification of the file,
+ and distribution when not linked into a combine executable.)
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include "soft-fp.h"
+#include "brain.h"
+
+BFtype
+__floatundibf (UDItype i)
+{
+ FP_DECL_EX;
+ FP_DECL_B (A);
+ BFtype a;
+
+ FP_INIT_ROUNDMODE;
+ FP_FROM_INT_B (A, i, DI_BITS, UDItype);
+ FP_PACK_RAW_B (a, A);
+ FP_HANDLE_EXCEPTIONS;
+
+ return a;
+}
_ZTIDF[0-9]*[_bx];
_ZTIPDF[0-9]*[_bx];
_ZTIPKDF[0-9]*[_bx];
+ _ZTIu6__bf16;
+ _ZTIPu6__bf16;
+ _ZTIPKu6__bf16;
} CXXABI_1.3.13;