aarch64: Add bfloat16_t support for aarch64

x86_64/i686 has for a few months working std::bfloat16_t support, __bf16
there is no longer a storage only type, but can be used for arithmetics
and is supported in libgcc and libstdc++.

The following patch adds similar support for AArch64.

Unlike the x86 changes, this one keeps the old __bf16 mangling of
u6__bf16 rather than DF16b (so an exception from Itanium ABI), but
otherwise __bf16 and decltype (0.0bf16) are the same type and both
in C++ act as extended floating-point type.

2023-03-13  Jakub Jelinek  <jakub@redhat.com>

gcc/
	* config/aarch64/aarch64.h (aarch64_bf16_type_node): Remove.
	(aarch64_bf16_ptr_type_node): Adjust comment.
	* config/aarch64/aarch64.cc (aarch64_gimplify_va_arg_expr): Use
	bfloat16_type_node rather than aarch64_bf16_type_node.
	(aarch64_libgcc_floating_mode_supported_p,
	aarch64_scalar_mode_supported_p): Also support BFmode.
	(aarch64_invalid_conversion, aarch64_invalid_unary_op): Remove.
	(aarch64_invalid_binary_op): Remove BFmode related rejections.
	(TARGET_INVALID_CONVERSION, TARGET_INVALID_UNARY_OP): Don't redefine.
	* config/aarch64/aarch64-builtins.cc (aarch64_bf16_type_node): Remove.
	(aarch64_int_or_fp_type): Use bfloat16_type_node rather than
	aarch64_bf16_type_node.
	(aarch64_init_simd_builtin_types): Likewise.
	(aarch64_init_bf16_types): Likewise.  Don't create bfloat16_type_node,
	which is created in tree.cc already.
	* config/aarch64/aarch64-sve-builtins.def (svbfloat16_t): Likewise.
gcc/testsuite/
	* gcc.target/aarch64/sve/acle/general-c/ternary_bfloat16_opt_n_1.c:
	Don't expect one __bf16 related error.
	* gcc.target/aarch64/bfloat16_vector_typecheck_1.c: Adjust or remove
	dg-error directives for __bf16 being an extended arithmetic type.
	* gcc.target/aarch64/bfloat16_vector_typecheck_2.c: Likewise.
	* gcc.target/aarch64/bfloat16_scalar_typecheck.c: Likewise.
	* g++.target/aarch64/bfloat_cpp_typecheck.C: Don't expect two __bf16
	related errors.
libgcc/
	* config/aarch64/t-softfp (softfp_extensions): Add bfsf.
	(softfp_truncations): Add tfbf dfbf sfbf hfbf.
	(softfp_extras): Add floatdibf floatundibf floattibf floatuntibf.
	* config/aarch64/libgcc-softfp.ver (GCC_13.0.0): Export
	__extendbfsf2 and __trunc{s,d,t,h}fbf2.
	* config/aarch64/sfp-machine.h (_FP_NANFRAC_B, _FP_NANSIGN_B): Define.
	* soft-fp/floatundibf.c: New file.
	* soft-fp/floatdibf.c: New file.
libstdc++-v3/
	* config/abi/pre/gnu.ver (CXXABI_1.3.14): Also export __bf16 tinfos
	if it isn't mangled as DF16b but u6__bf16.
This commit is contained in:
Jakub Jelinek 2023-03-13 00:12:15 +01:00
parent eb1d8df792
commit 13071c3c7d
15 changed files with 321 additions and 263 deletions

View file

@ -918,7 +918,6 @@ tree aarch64_fp16_type_node = NULL_TREE;
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
@ -1010,7 +1009,7 @@ aarch64_int_or_fp_type (machine_mode mode,
case E_DFmode:
return double_type_node;
case E_BFmode:
return aarch64_bf16_type_node;
return bfloat16_type_node;
default:
gcc_unreachable ();
}
@ -1124,8 +1123,8 @@ aarch64_init_simd_builtin_types (void)
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++)
{
@ -1197,7 +1196,7 @@ aarch64_init_simd_builtin_scalar_types (void)
"__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,
@ -1682,13 +1681,8 @@ aarch64_init_fp16_types (void)
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.

View file

@ -61,7 +61,7 @@ DEF_SVE_MODE (u64offset, none, svuint64_t, bytes)
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)

View file

@ -19871,7 +19871,7 @@ aarch64_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
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:
@ -26561,18 +26561,18 @@ aarch64_dwarf_poly_indeterminate_value (unsigned int i, unsigned int *factor,
}
/* 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)
@ -26580,7 +26580,7 @@ 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));
}
@ -27048,39 +27048,6 @@ aarch64_stack_protect_guard (void)
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. */
@ -27088,11 +27055,6 @@ static const char *
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)
@ -27689,12 +27651,6 @@ aarch64_libgcc_floating_mode_supported_p
#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

View file

@ -1237,9 +1237,8 @@ extern const char *aarch64_rewrite_mcpu (int argc, const char **argv);
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.

View file

@ -9,6 +9,6 @@ void foo (void)
{
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);
}

View file

@ -16,8 +16,8 @@ double is_a_double;
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)
{
@ -26,87 +26,87 @@ 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'} } */
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; /* { 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'} } */
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'} } */
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 }; /* { 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'} } */
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'} } */
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; /* { 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'} } */
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'} } */
(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 }; /* { 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 };
/* Arrays and Structs. */
@ -149,16 +149,16 @@ bfloat16_t footest (bfloat16_t scalar0)
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. */
@ -178,41 +178,41 @@ bfloat16_t footest (bfloat16_t scalar0)
/* 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;
}

View file

@ -52,20 +52,20 @@ bfloat16x4_t footest (bfloat16x4_t vector0)
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'} } */
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 }; /* { 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'} } */
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. */
@ -89,25 +89,25 @@ bfloat16x4_t footest (bfloat16x4_t vector0)
/* 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'} } */
@ -190,16 +190,16 @@ bfloat16x4_t footest (bfloat16x4_t vector0)
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. */
@ -238,24 +238,24 @@ bfloat16x4_t footest (bfloat16x4_t vector0)
/* 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;
}

View file

@ -51,20 +51,20 @@ bfloat16x8_t footest (bfloat16x8_t 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'" } */
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 }; /* { 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'} } */
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. */
@ -88,25 +88,25 @@ bfloat16x8_t footest (bfloat16x8_t vector0)
/* 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'} } */
@ -188,16 +188,16 @@ bfloat16x8_t footest (bfloat16x8_t vector0)
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. */
@ -236,24 +236,24 @@ bfloat16x8_t footest (bfloat16x8_t vector0)
/* 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;
}

View file

@ -18,7 +18,7 @@ f1 (svbool_t pg, svuint8_t u8, svuint16_t u16, svint32_t s32,
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);
}

View file

@ -26,3 +26,16 @@ GCC_11.0 {
__mulhc3
__trunctfhf2
}
%inherit GCC_13.0.0 GCC_11.0.0
GCC_13.0.0 {
__extendbfsf2
__floatdibf
__floattibf
__floatundibf
__floatuntibf
__truncdfbf2
__truncsfbf2
__trunctfbf2
__trunchfbf2
}

View file

@ -43,10 +43,12 @@ typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
#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

View file

@ -1,9 +1,10 @@
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

View file

@ -0,0 +1,45 @@
/* 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;
}

View file

@ -0,0 +1,45 @@
/* 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;
}

View file

@ -2828,6 +2828,9 @@ CXXABI_1.3.14 {
_ZTIDF[0-9]*[_bx];
_ZTIPDF[0-9]*[_bx];
_ZTIPKDF[0-9]*[_bx];
_ZTIu6__bf16;
_ZTIPu6__bf16;
_ZTIPKu6__bf16;
} CXXABI_1.3.13;