Commit 53605f35 by Bill Schmidt Committed by William Schmidt

rs6000-builtin.def (BU_FLOAT128_2): New #define.

[gcc]

2016-06-24  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	* config/rs6000/rs6000-builtin.def (BU_FLOAT128_2): New #define.
	(BU_FLOAT128_1): Likewise.
	(FABSQ): Likewise.
	(COPYSIGNQ): Likewise.
	(RS6000_BUILTIN_NANQ): Likewise.
	(RS6000_BUILTIN_NANSQ): Likewise.
	(RS6000_BUILTIN_INFQ): Likewise.
	(RS6000_BUILTIN_HUGE_VALQ): Likewise.
	* config/rs6000/rs6000.c (rs6000_fold_builtin): New prototype.
	(TARGET_FOLD_BUILTIN): New #define.
	(rs6000_builtin_mask_calculate): Add TARGET_FLOAT128 entry.
	(rs6000_invalid_builtin): Add handling for RS6000_BTM_FLOAT128.
	(rs6000_fold_builtin): New target hook implementation, handling
	folding of 128-bit NaNs and infinities.
	(rs6000_init_builtins): Initialize const_str_type_node; ensure all
	entries are filled in to avoid problems during bootstrap
	self-test; define builtins for 128-bit NaNs and infinities.
	(rs6000_opt_mask): Add entry for float128.
	* config/rs6000/rs6000.h (RS6000_BTM_FLOAT128): New #define.
	(RS6000_BTM_COMMON): Include RS6000_BTM_FLOAT128.
	(rs6000_builtin_type_index): Add RS6000_BTI_const_str.
	(const_str_type_node): New #define.
	* config/rs6000/rs6000.md (copysign<mode>3 for IEEE128): Convert
	to a define_expand that dispatches to either copysign<mode>3_soft
	or copysign<mode>3_hard.
	(copysign<mode>3_hard): Rename from copysign<mode>3.
	(copysign<mode>3_soft): New define_insn.
	* doc/extend.texi: Document new builtins.

[gcc/testsuite]

2016-06-24  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	* gcc.target/powerpc/abs128-1.c: New.
	* gcc.target/powerpc/copysign128-1.c: New.
	* gcc.target/powerpc/inf128-1.c: New.
	* gcc.target/powerpc/nan128-1.c: New.

From-SVN: r237774
parent 6e085858
2016-06-24 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* config/rs6000/rs6000-builtin.def (BU_FLOAT128_2): New #define.
(BU_FLOAT128_1): Likewise.
(FABSQ): Likewise.
(COPYSIGNQ): Likewise.
(RS6000_BUILTIN_NANQ): Likewise.
(RS6000_BUILTIN_NANSQ): Likewise.
(RS6000_BUILTIN_INFQ): Likewise.
(RS6000_BUILTIN_HUGE_VALQ): Likewise.
* config/rs6000/rs6000.c (rs6000_fold_builtin): New prototype.
(TARGET_FOLD_BUILTIN): New #define.
(rs6000_builtin_mask_calculate): Add TARGET_FLOAT128 entry.
(rs6000_invalid_builtin): Add handling for RS6000_BTM_FLOAT128.
(rs6000_fold_builtin): New target hook implementation, handling
folding of 128-bit NaNs and infinities.
(rs6000_init_builtins): Initialize const_str_type_node; ensure all
entries are filled in to avoid problems during bootstrap
self-test; define builtins for 128-bit NaNs and infinities.
(rs6000_opt_mask): Add entry for float128.
* config/rs6000/rs6000.h (RS6000_BTM_FLOAT128): New #define.
(RS6000_BTM_COMMON): Include RS6000_BTM_FLOAT128.
(rs6000_builtin_type_index): Add RS6000_BTI_const_str.
(const_str_type_node): New #define.
* config/rs6000/rs6000.md (copysign<mode>3 for IEEE128): Convert
to a define_expand that dispatches to either copysign<mode>3_soft
or copysign<mode>3_hard.
(copysign<mode>3_hard): Rename from copysign<mode>3.
(copysign<mode>3_soft): New define_insn.
* doc/extend.texi: Document new builtins.
2016-06-24 Jakub Jelinek <jakub@redhat.com> 2016-06-24 Jakub Jelinek <jakub@redhat.com>
* cfgloop.c (flow_loop_dump): Cast nit to uint64_t and print it using * cfgloop.c (flow_loop_dump): Cast nit to uint64_t and print it using
......
...@@ -652,6 +652,22 @@ ...@@ -652,6 +652,22 @@
| RS6000_BTC_BINARY), \ | RS6000_BTC_BINARY), \
CODE_FOR_ ## ICODE) /* ICODE */ CODE_FOR_ ## ICODE) /* ICODE */
/* IEEE 128-bit floating-point builtins. */
#define BU_FLOAT128_2(ENUM, NAME, ATTR, ICODE) \
RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
"__builtin_" NAME, /* NAME */ \
RS6000_BTM_FLOAT128, /* MASK */ \
(RS6000_BTC_ ## ATTR /* ATTR */ \
| RS6000_BTC_BINARY), \
CODE_FOR_ ## ICODE) /* ICODE */
#define BU_FLOAT128_1(ENUM, NAME, ATTR, ICODE) \
RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
"__builtin_" NAME, /* NAME */ \
RS6000_BTM_FLOAT128, /* MASK */ \
(RS6000_BTC_ ## ATTR /* ATTR */ \
| RS6000_BTC_UNARY), \
CODE_FOR_ ## ICODE) /* ICODE */
/* Miscellaneous builtins for instructions added in ISA 3.0. These /* Miscellaneous builtins for instructions added in ISA 3.0. These
instructions don't require either the DFP or VSX options, just the basic instructions don't require either the DFP or VSX options, just the basic
...@@ -1814,6 +1830,11 @@ BU_P9V_OVERLOAD_1 (VPRTYBD, "vprtybd") ...@@ -1814,6 +1830,11 @@ BU_P9V_OVERLOAD_1 (VPRTYBD, "vprtybd")
BU_P9V_OVERLOAD_1 (VPRTYBQ, "vprtybq") BU_P9V_OVERLOAD_1 (VPRTYBQ, "vprtybq")
BU_P9V_OVERLOAD_1 (VPRTYBW, "vprtybw") BU_P9V_OVERLOAD_1 (VPRTYBW, "vprtybw")
/* 1 argument IEEE 128-bit floating-point functions. */
BU_FLOAT128_1 (FABSQ, "fabsq", CONST, abskf2)
/* 2 argument IEEE 128-bit floating-point functions. */
BU_FLOAT128_2 (COPYSIGNQ, "copysignq", CONST, copysignkf3)
/* 1 argument crypto functions. */ /* 1 argument crypto functions. */
BU_CRYPTO_1 (VSBOX, "vsbox", CONST, crypto_vsbox) BU_CRYPTO_1 (VSBOX, "vsbox", CONST, crypto_vsbox)
...@@ -2191,6 +2212,18 @@ BU_SPECIAL_X (RS6000_BUILTIN_CPU_IS, "__builtin_cpu_is", ...@@ -2191,6 +2212,18 @@ BU_SPECIAL_X (RS6000_BUILTIN_CPU_IS, "__builtin_cpu_is",
BU_SPECIAL_X (RS6000_BUILTIN_CPU_SUPPORTS, "__builtin_cpu_supports", BU_SPECIAL_X (RS6000_BUILTIN_CPU_SUPPORTS, "__builtin_cpu_supports",
RS6000_BTM_ALWAYS, RS6000_BTC_MISC) RS6000_BTM_ALWAYS, RS6000_BTC_MISC)
BU_SPECIAL_X (RS6000_BUILTIN_NANQ, "__builtin_nanq",
RS6000_BTM_FLOAT128, RS6000_BTC_CONST)
BU_SPECIAL_X (RS6000_BUILTIN_NANSQ, "__builtin_nansq",
RS6000_BTM_FLOAT128, RS6000_BTC_CONST)
BU_SPECIAL_X (RS6000_BUILTIN_INFQ, "__builtin_infq",
RS6000_BTM_FLOAT128, RS6000_BTC_CONST)
BU_SPECIAL_X (RS6000_BUILTIN_HUGE_VALQ, "__builtin_huge_valq",
RS6000_BTM_FLOAT128, RS6000_BTC_CONST)
/* Darwin CfString builtin. */ /* Darwin CfString builtin. */
BU_SPECIAL_X (RS6000_BUILTIN_CFSTRING, "__builtin_cfstring", RS6000_BTM_ALWAYS, BU_SPECIAL_X (RS6000_BUILTIN_CFSTRING, "__builtin_cfstring", RS6000_BTM_ALWAYS,
RS6000_BTC_MISC) RS6000_BTC_MISC)
...@@ -1328,6 +1328,7 @@ static bool rs6000_secondary_reload_move (enum rs6000_reg_type, ...@@ -1328,6 +1328,7 @@ static bool rs6000_secondary_reload_move (enum rs6000_reg_type,
bool); bool);
rtl_opt_pass *make_pass_analyze_swaps (gcc::context*); rtl_opt_pass *make_pass_analyze_swaps (gcc::context*);
static bool rs6000_keep_leaf_when_profiled () __attribute__ ((unused)); static bool rs6000_keep_leaf_when_profiled () __attribute__ ((unused));
static tree rs6000_fold_builtin (tree, int, tree *, bool);
/* Hash table stuff for keeping track of TOC entries. */ /* Hash table stuff for keeping track of TOC entries. */
...@@ -1602,6 +1603,9 @@ static const struct attribute_spec rs6000_attribute_table[] = ...@@ -1602,6 +1603,9 @@ static const struct attribute_spec rs6000_attribute_table[] =
#undef TARGET_BUILTIN_DECL #undef TARGET_BUILTIN_DECL
#define TARGET_BUILTIN_DECL rs6000_builtin_decl #define TARGET_BUILTIN_DECL rs6000_builtin_decl
#undef TARGET_FOLD_BUILTIN
#define TARGET_FOLD_BUILTIN rs6000_fold_builtin
#undef TARGET_EXPAND_BUILTIN #undef TARGET_EXPAND_BUILTIN
#define TARGET_EXPAND_BUILTIN rs6000_expand_builtin #define TARGET_EXPAND_BUILTIN rs6000_expand_builtin
...@@ -3682,7 +3686,8 @@ rs6000_builtin_mask_calculate (void) ...@@ -3682,7 +3686,8 @@ rs6000_builtin_mask_calculate (void)
| ((TARGET_HTM) ? RS6000_BTM_HTM : 0) | ((TARGET_HTM) ? RS6000_BTM_HTM : 0)
| ((TARGET_DFP) ? RS6000_BTM_DFP : 0) | ((TARGET_DFP) ? RS6000_BTM_DFP : 0)
| ((TARGET_HARD_FLOAT) ? RS6000_BTM_HARD_FLOAT : 0) | ((TARGET_HARD_FLOAT) ? RS6000_BTM_HARD_FLOAT : 0)
| ((TARGET_LONG_DOUBLE_128) ? RS6000_BTM_LDBL128 : 0)); | ((TARGET_LONG_DOUBLE_128) ? RS6000_BTM_LDBL128 : 0)
| ((TARGET_FLOAT128) ? RS6000_BTM_FLOAT128 : 0));
} }
/* Implement TARGET_MD_ASM_ADJUST. All asm statements are considered /* Implement TARGET_MD_ASM_ADJUST. All asm statements are considered
...@@ -15503,11 +15508,57 @@ rs6000_invalid_builtin (enum rs6000_builtins fncode) ...@@ -15503,11 +15508,57 @@ rs6000_invalid_builtin (enum rs6000_builtins fncode)
" -mlong-double-128 options", name); " -mlong-double-128 options", name);
else if ((fnmask & RS6000_BTM_HARD_FLOAT) != 0) else if ((fnmask & RS6000_BTM_HARD_FLOAT) != 0)
error ("Builtin function %s requires the -mhard-float option", name); error ("Builtin function %s requires the -mhard-float option", name);
else if ((fnmask & RS6000_BTM_FLOAT128) != 0)
error ("Builtin function %s requires the -mfloat128 option", name);
else else
error ("Builtin function %s is not supported with the current options", error ("Builtin function %s is not supported with the current options",
name); name);
} }
/* Target hook for early folding of built-ins, shamelessly stolen
from ia64.c. */
static tree
rs6000_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
tree *args, bool ignore ATTRIBUTE_UNUSED)
{
if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
{
enum rs6000_builtins fn_code
= (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
switch (fn_code)
{
case RS6000_BUILTIN_NANQ:
case RS6000_BUILTIN_NANSQ:
{
tree type = TREE_TYPE (TREE_TYPE (fndecl));
const char *str = c_getstr (*args);
int quiet = fn_code == RS6000_BUILTIN_NANQ;
REAL_VALUE_TYPE real;
if (str && real_nan (&real, str, quiet, TYPE_MODE (type)))
return build_real (type, real);
return NULL_TREE;
}
case RS6000_BUILTIN_INFQ:
case RS6000_BUILTIN_HUGE_VALQ:
{
tree type = TREE_TYPE (TREE_TYPE (fndecl));
REAL_VALUE_TYPE inf;
real_inf (&inf);
return build_real (type, inf);
}
default:
break;
}
}
#ifdef SUBTARGET_FOLD_BUILTIN
return SUBTARGET_FOLD_BUILTIN (fndecl, n_args, args, ignore);
#else
return NULL_TREE;
#endif
}
/* Expand an expression EXP that calls a built-in function, /* Expand an expression EXP that calls a built-in function,
with result going to TARGET if that's convenient with result going to TARGET if that's convenient
(and in mode MODE if that's convenient). (and in mode MODE if that's convenient).
...@@ -15762,6 +15813,10 @@ rs6000_init_builtins (void) ...@@ -15762,6 +15813,10 @@ rs6000_init_builtins (void)
opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node); opaque_p_V2SI_type_node = build_pointer_type (opaque_V2SI_type_node);
opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4); opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);
const_str_type_node
= build_pointer_type (build_qualified_type (char_type_node,
TYPE_QUAL_CONST));
/* We use V1TI mode as a special container to hold __int128_t items that /* We use V1TI mode as a special container to hold __int128_t items that
must live in VSX registers. */ must live in VSX registers. */
if (intTI_type_node) if (intTI_type_node)
...@@ -15824,6 +15879,12 @@ rs6000_init_builtins (void) ...@@ -15824,6 +15879,12 @@ rs6000_init_builtins (void)
lang_hooks.types.register_builtin_type (ibm128_float_type_node, lang_hooks.types.register_builtin_type (ibm128_float_type_node,
"__ibm128"); "__ibm128");
} }
else
{
/* All types must be nonzero, or self-test barfs during bootstrap. */
ieee128_float_type_node = long_double_type_node;
ibm128_float_type_node = long_double_type_node;
}
/* Initialize the modes for builtin_function_type, mapping a machine mode to /* Initialize the modes for builtin_function_type, mapping a machine mode to
tree type node. */ tree type node. */
...@@ -15965,6 +16026,15 @@ rs6000_init_builtins (void) ...@@ -15965,6 +16026,15 @@ rs6000_init_builtins (void)
if (TARGET_EXTRA_BUILTINS || TARGET_SPE || TARGET_PAIRED_FLOAT) if (TARGET_EXTRA_BUILTINS || TARGET_SPE || TARGET_PAIRED_FLOAT)
rs6000_common_init_builtins (); rs6000_common_init_builtins ();
ftype = build_function_type_list (ieee128_float_type_node,
const_str_type_node, NULL_TREE);
def_builtin ("__builtin_nanq", ftype, RS6000_BUILTIN_NANQ);
def_builtin ("__builtin_nansq", ftype, RS6000_BUILTIN_NANSQ);
ftype = build_function_type_list (ieee128_float_type_node, NULL_TREE);
def_builtin ("__builtin_infq", ftype, RS6000_BUILTIN_INFQ);
def_builtin ("__builtin_huge_valq", ftype, RS6000_BUILTIN_HUGE_VALQ);
ftype = builtin_function_type (DFmode, DFmode, DFmode, VOIDmode, ftype = builtin_function_type (DFmode, DFmode, DFmode, VOIDmode,
RS6000_BUILTIN_RECIP, "__builtin_recipdiv"); RS6000_BUILTIN_RECIP, "__builtin_recipdiv");
def_builtin ("__builtin_recipdiv", ftype, RS6000_BUILTIN_RECIP); def_builtin ("__builtin_recipdiv", ftype, RS6000_BUILTIN_RECIP);
...@@ -35562,6 +35632,7 @@ static struct rs6000_opt_mask const rs6000_builtin_mask_names[] = ...@@ -35562,6 +35632,7 @@ static struct rs6000_opt_mask const rs6000_builtin_mask_names[] =
{ "hard-dfp", RS6000_BTM_DFP, false, false }, { "hard-dfp", RS6000_BTM_DFP, false, false },
{ "hard-float", RS6000_BTM_HARD_FLOAT, false, false }, { "hard-float", RS6000_BTM_HARD_FLOAT, false, false },
{ "long-double-128", RS6000_BTM_LDBL128, false, false }, { "long-double-128", RS6000_BTM_LDBL128, false, false },
{ "float128", RS6000_BTM_FLOAT128, false, false },
}; };
/* Option variables that we want to support inside attribute((target)) and /* Option variables that we want to support inside attribute((target)) and
...@@ -2709,6 +2709,7 @@ extern int frame_pointer_needed; ...@@ -2709,6 +2709,7 @@ extern int frame_pointer_needed;
#define RS6000_BTM_HARD_FLOAT MASK_SOFT_FLOAT /* Hardware floating point. */ #define RS6000_BTM_HARD_FLOAT MASK_SOFT_FLOAT /* Hardware floating point. */
#define RS6000_BTM_LDBL128 MASK_MULTIPLE /* 128-bit long double. */ #define RS6000_BTM_LDBL128 MASK_MULTIPLE /* 128-bit long double. */
#define RS6000_BTM_64BIT MASK_64BIT /* 64-bit addressing. */ #define RS6000_BTM_64BIT MASK_64BIT /* 64-bit addressing. */
#define RS6000_BTM_FLOAT128 MASK_P9_VECTOR /* IEEE 128-bit float. */
#define RS6000_BTM_COMMON (RS6000_BTM_ALTIVEC \ #define RS6000_BTM_COMMON (RS6000_BTM_ALTIVEC \
| RS6000_BTM_VSX \ | RS6000_BTM_VSX \
...@@ -2725,7 +2726,8 @@ extern int frame_pointer_needed; ...@@ -2725,7 +2726,8 @@ extern int frame_pointer_needed;
| RS6000_BTM_CELL \ | RS6000_BTM_CELL \
| RS6000_BTM_DFP \ | RS6000_BTM_DFP \
| RS6000_BTM_HARD_FLOAT \ | RS6000_BTM_HARD_FLOAT \
| RS6000_BTM_LDBL128) | RS6000_BTM_LDBL128 \
| RS6000_BTM_FLOAT128)
/* Define builtin enum index. */ /* Define builtin enum index. */
...@@ -2829,6 +2831,7 @@ enum rs6000_builtin_type_index ...@@ -2829,6 +2831,7 @@ enum rs6000_builtin_type_index
RS6000_BTI_void, /* void_type_node */ RS6000_BTI_void, /* void_type_node */
RS6000_BTI_ieee128_float, /* ieee 128-bit floating point */ RS6000_BTI_ieee128_float, /* ieee 128-bit floating point */
RS6000_BTI_ibm128_float, /* IBM 128-bit floating point */ RS6000_BTI_ibm128_float, /* IBM 128-bit floating point */
RS6000_BTI_const_str, /* pointer to const char * */
RS6000_BTI_MAX RS6000_BTI_MAX
}; };
...@@ -2885,6 +2888,7 @@ enum rs6000_builtin_type_index ...@@ -2885,6 +2888,7 @@ enum rs6000_builtin_type_index
#define void_type_internal_node (rs6000_builtin_types[RS6000_BTI_void]) #define void_type_internal_node (rs6000_builtin_types[RS6000_BTI_void])
#define ieee128_float_type_node (rs6000_builtin_types[RS6000_BTI_ieee128_float]) #define ieee128_float_type_node (rs6000_builtin_types[RS6000_BTI_ieee128_float])
#define ibm128_float_type_node (rs6000_builtin_types[RS6000_BTI_ibm128_float]) #define ibm128_float_type_node (rs6000_builtin_types[RS6000_BTI_ibm128_float])
#define const_str_type_node (rs6000_builtin_types[RS6000_BTI_const_str])
extern GTY(()) tree rs6000_builtin_types[RS6000_BTI_MAX]; extern GTY(()) tree rs6000_builtin_types[RS6000_BTI_MAX];
extern GTY(()) tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT]; extern GTY(()) tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
......
...@@ -13326,7 +13326,25 @@ ...@@ -13326,7 +13326,25 @@
"xssqrtqp %0,%1" "xssqrtqp %0,%1"
[(set_attr "type" "vecdiv")]) [(set_attr "type" "vecdiv")])
(define_insn "copysign<mode>3" (define_expand "copysign<mode>3"
[(use (match_operand:IEEE128 0 "altivec_register_operand"))
(use (match_operand:IEEE128 1 "altivec_register_operand"))
(use (match_operand:IEEE128 2 "altivec_register_operand"))]
"FLOAT128_IEEE_P (<MODE>mode)"
{
if (TARGET_FLOAT128_HW)
emit_insn (gen_copysign<mode>3_hard (operands[0], operands[1],
operands[2]));
else
{
rtx tmp = gen_reg_rtx (<MODE>mode);
emit_insn (gen_copysign<mode>3_soft (operands[0], operands[1],
operands[2], tmp));
}
DONE;
})
(define_insn "copysign<mode>3_hard"
[(set (match_operand:IEEE128 0 "altivec_register_operand" "=v") [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
(unspec:IEEE128 (unspec:IEEE128
[(match_operand:IEEE128 1 "altivec_register_operand" "v") [(match_operand:IEEE128 1 "altivec_register_operand" "v")
...@@ -13336,6 +13354,18 @@ ...@@ -13336,6 +13354,18 @@
"xscpsgnqp %0,%2,%1" "xscpsgnqp %0,%2,%1"
[(set_attr "type" "vecsimple")]) [(set_attr "type" "vecsimple")])
(define_insn "copysign<mode>3_soft"
[(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
(unspec:IEEE128
[(match_operand:IEEE128 1 "altivec_register_operand" "v")
(match_operand:IEEE128 2 "altivec_register_operand" "v")
(match_operand:IEEE128 3 "altivec_register_operand" "+v")]
UNSPEC_COPYSIGN))]
"!TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
"xscpsgndp %x3,%x2,%x1\;xxpermdi %x0,%x3,%x1,1"
[(set_attr "type" "veccomplex")
(set_attr "length" "8")])
(define_insn "neg<mode>2_hw" (define_insn "neg<mode>2_hw"
[(set (match_operand:IEEE128 0 "altivec_register_operand" "=v") [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
(neg:IEEE128 (neg:IEEE128
......
...@@ -14782,6 +14782,40 @@ The @code{__builtin_ppc_mftb} function always generates one instruction and ...@@ -14782,6 +14782,40 @@ The @code{__builtin_ppc_mftb} function always generates one instruction and
returns the Time Base Register value as an unsigned long, throwing away returns the Time Base Register value as an unsigned long, throwing away
the most significant word on 32-bit environments. the most significant word on 32-bit environments.
Additional built-in functions are available for the 64-bit PowerPC
family of processors, for efficient use of 128-bit floating point
(@code{__float128}) values.
The following floating-point built-in functions are available with
@code{-mfloat128} and Altivec support. All of them implement the
function that is part of the name.
@smallexample
__float128 __builtin_fabsq (__float128)
__float128 __builtin_copysignq (__float128, __float128)
@end smallexample
The following built-in functions are available with @code{-mfloat128}
and Altivec support.
@table @code
@item __float128 __builtin_infq (void)
Similar to @code{__builtin_inf}, except the return type is @code{__float128}.
@findex __builtin_infq
@item __float128 __builtin_huge_valq (void)
Similar to @code{__builtin_huge_val}, except the return type is @code{__float128}.
@findex __builtin_huge_valq
@item __float128 __builtin_nanq (void)
Similar to @code{__builtin_nan}, except the return type is @code{__float128}.
@findex __builtin_nanq
@item __float128 __builtin_nansq (void)
Similar to @code{__builtin_nans}, except the return type is @code{__float128}.
@findex __builtin_nansq
@end table
The following built-in functions are available for the PowerPC family The following built-in functions are available for the PowerPC family
of processors, starting with ISA 2.06 or later (@option{-mcpu=power7} of processors, starting with ISA 2.06 or later (@option{-mcpu=power7}
or @option{-mpopcntd}): or @option{-mpopcntd}):
......
2016-06-24 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* gcc.target/powerpc/abs128-1.c: New.
* gcc.target/powerpc/copysign128-1.c: New.
* gcc.target/powerpc/inf128-1.c: New.
* gcc.target/powerpc/nan128-1.c: New.
2016-06-24 Eric Botcazou <ebotcazou@adacore.com> 2016-06-24 Eric Botcazou <ebotcazou@adacore.com>
* gfortran.dg/pr71642.f90: New test. * gfortran.dg/pr71642.f90: New test.
......
/* { dg-do run { target { powerpc64*-*-* && vmx_hw } } } */
/* { dg-options "-mfloat128" } */
void abort ();
typedef unsigned long long int uint64_t;
typedef union
{
__float128 value;
struct
{
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
unsigned negative:1;
unsigned exponent:15;
unsigned quiet_nan:1;
uint64_t mant_high:47;
uint64_t mant_low:64;
#else
uint64_t mant_low:64;
uint64_t mant_high:47;
unsigned quiet_nan:1;
unsigned exponent:15;
unsigned negative:1;
#endif
} nan;
} ieee854_float128;
int
main (int argc, int *argv[])
{
ieee854_float128 x, z;
x.nan.negative = 1;
x.nan.exponent = 0x22;
x.nan.quiet_nan = 0;
x.nan.mant_high = 0x1234;
x.nan.mant_low = 0xabcdef;
z.value = __builtin_fabsq (x.value);
if (z.nan.negative != 0
|| z.nan.exponent != 0x22
|| z.nan.quiet_nan != 0
|| z.nan.mant_high != 0x1234
|| z.nan.mant_low != 0xabcdef)
abort ();
z.value = __builtin_fabsq (z.value);
if (z.nan.negative != 0
|| z.nan.exponent != 0x22
|| z.nan.quiet_nan != 0
|| z.nan.mant_high != 0x1234
|| z.nan.mant_low != 0xabcdef)
abort ();
return 0;
}
/* { dg-do run { target { powerpc64*-*-* && vmx_hw } } } */
/* { dg-options "-mfloat128" } */
void abort ();
typedef unsigned long long int uint64_t;
typedef union
{
__float128 value;
struct
{
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
unsigned negative:1;
unsigned exponent:15;
unsigned quiet_nan:1;
uint64_t mant_high:47;
uint64_t mant_low:64;
#else
uint64_t mant_low:64;
uint64_t mant_high:47;
unsigned quiet_nan:1;
unsigned exponent:15;
unsigned negative:1;
#endif
} nan;
} ieee854_float128;
int
main (int argc, int *argv[])
{
ieee854_float128 x, y, z;
x.nan.negative = 0;
x.nan.exponent = 0x22;
x.nan.quiet_nan = 0;
x.nan.mant_high = 0x1234;
x.nan.mant_low = 0xabcdef;
y.nan.negative = 1;
y.nan.exponent = 0;
y.nan.quiet_nan = 0;
y.nan.mant_high = 0;
y.nan.mant_low = 0;
z.value = __builtin_copysignq (x.value, y.value);
if (z.nan.negative != 1
|| z.nan.exponent != 0x22
|| z.nan.quiet_nan != 0
|| z.nan.mant_high != 0x1234
|| z.nan.mant_low != 0xabcdef)
abort ();
return 0;
}
/* { dg-do run { target { powerpc64*-*-* && vmx_hw } } } */
/* { dg-options "-mfloat128" } */
void abort ();
typedef unsigned long long int uint64_t;
typedef union
{
__float128 value;
struct
{
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
unsigned negative:1;
unsigned exponent:15;
unsigned quiet_nan:1;
uint64_t mant_high:47;
uint64_t mant_low:64;
#else
uint64_t mant_low:64;
uint64_t mant_high:47;
unsigned quiet_nan:1;
unsigned exponent:15;
unsigned negative:1;
#endif
} nan;
} ieee854_float128;
int
main (int argc, int *argv[])
{
ieee854_float128 y;
y.value = __builtin_infq ();
if (y.nan.negative != 0
|| y.nan.exponent != 0x7fff
|| y.nan.quiet_nan != 0
|| y.nan.mant_high != 0
|| y.nan.mant_low != 0)
abort ();
y.value = __builtin_huge_valq ();
if (y.nan.negative != 0
|| y.nan.exponent != 0x7fff
|| y.nan.quiet_nan != 0
|| y.nan.mant_high != 0
|| y.nan.mant_low != 0)
abort ();
return 0;
}
/* { dg-do run { target { powerpc64*-*-* && vmx_hw } } } */
/* { dg-options "-mfloat128" } */
#include <stdio.h>
void abort ();
typedef unsigned long long int uint64_t;
typedef union
{
__float128 value;
struct
{
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
unsigned negative:1;
unsigned exponent:15;
unsigned quiet_nan:1;
uint64_t mant_high:47;
uint64_t mant_low:64;
#else
uint64_t mant_low:64;
uint64_t mant_high:47;
unsigned quiet_nan:1;
unsigned exponent:15;
unsigned negative:1;
#endif
} nan;
} ieee854_float128;
int
main (int argc, int *argv[])
{
ieee854_float128 y;
y.value = __builtin_nanq ("1");
if (y.nan.negative != 0
|| y.nan.exponent != 0x7fff
|| y.nan.quiet_nan != 1
|| y.nan.mant_high != 0
|| y.nan.mant_low != 1)
abort ();
y.value = __builtin_nanq ("0x2ab3c");
if (y.nan.negative != 0
|| y.nan.exponent != 0x7fff
|| y.nan.quiet_nan != 1
|| y.nan.mant_high != 0
|| y.nan.mant_low != 0x2ab3c)
abort ();
y.value = __builtin_nansq ("1");
if (
y.nan.negative != 0
|| y.nan.exponent != 0x7fff
|| y.nan.quiet_nan != 0
|| y.nan.mant_high != 0
|| y.nan.mant_low != 1
)
abort ();
y.value = __builtin_nansq ("0x2ab3c");
if (y.nan.negative != 0
|| y.nan.exponent != 0x7fff
|| y.nan.quiet_nan != 0
|| y.nan.mant_high != 0
|| y.nan.mant_low != 0x2ab3c)
abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment