re PR testsuite/61415 (PowerPC test gcc.target/powerpc/tfmode_off.c fails if -mlong-double-64)

gcc/
	PR target/61415
	* config/rs6000/rs6000-builtin.def (BU_MISC_1): Delete.
	(BU_MISC_2): Rename to ...
	(BU_LDBL128_2): ... this.
	* config/rs6000/rs6000.h (RS6000_BTM_LDBL128): New define.
	(RS6000_BTM_COMMON): Add RS6000_BTM_LDBL128.
	* config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Handle
	RS6000_BTM_LDBL128.
	(rs6000_invalid_builtin): Add long double 128-bit builtin support.
	(rs6000_builtin_mask_names): Add RS6000_BTM_LDBL128.
	* config/rs6000/rs6000.md (unpacktf_0): Remove define)expand.
	(unpacktf_1): Likewise.
	* doc/extend.texi (__builtin_longdouble_dw0): Remove documentation.
	(__builtin_longdouble_dw1): Likewise.
	* doc/sourcebuild.texi (longdouble128): Document.

gcc/testsuite/
	PR target/61415
	* lib/target-supports.exp (check_effective_target_longdouble128): New.
	* gcc.target/powerpc/pack02.c: Use it.
	* gcc.target/powerpc/tfmode_off.c: Likewise.

From-SVN: r211653
This commit is contained in:
Peter Bergner 2014-06-13 13:42:53 -05:00 committed by Peter Bergner
parent c7ece684ca
commit 8241efd129
11 changed files with 58 additions and 42 deletions

View File

@ -1,3 +1,21 @@
2014-06-13 Peter Bergner <bergner@vnet.ibm.com>
PR target/61415
* config/rs6000/rs6000-builtin.def (BU_MISC_1): Delete.
(BU_MISC_2): Rename to ...
(BU_LDBL128_2): ... this.
* config/rs6000/rs6000.h (RS6000_BTM_LDBL128): New define.
(RS6000_BTM_COMMON): Add RS6000_BTM_LDBL128.
* config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Handle
RS6000_BTM_LDBL128.
(rs6000_invalid_builtin): Add long double 128-bit builtin support.
(rs6000_builtin_mask_names): Add RS6000_BTM_LDBL128.
* config/rs6000/rs6000.md (unpacktf_0): Remove define)expand.
(unpacktf_1): Likewise.
* doc/extend.texi (__builtin_longdouble_dw0): Remove documentation.
(__builtin_longdouble_dw1): Likewise.
* doc/sourcebuild.texi (longdouble128): Document.
2014-06-13 Jeff Law <law@redhat.com>
PR rtl-optimization/61094

View File

@ -622,19 +622,12 @@
| RS6000_BTC_TERNARY), \
CODE_FOR_ ## ICODE) /* ICODE */
/* Miscellaneous builtins. */
#define BU_MISC_1(ENUM, NAME, ATTR, ICODE) \
/* 128-bit long double floating point builtins. */
#define BU_LDBL128_2(ENUM, NAME, ATTR, ICODE) \
RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
"__builtin_" NAME, /* NAME */ \
RS6000_BTM_HARD_FLOAT, /* MASK */ \
(RS6000_BTC_ ## ATTR /* ATTR */ \
| RS6000_BTC_UNARY), \
CODE_FOR_ ## ICODE) /* ICODE */
#define BU_MISC_2(ENUM, NAME, ATTR, ICODE) \
RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
"__builtin_" NAME, /* NAME */ \
RS6000_BTM_HARD_FLOAT, /* MASK */ \
(RS6000_BTM_HARD_FLOAT /* MASK */ \
| RS6000_BTM_LDBL128), \
(RS6000_BTC_ ## ATTR /* ATTR */ \
| RS6000_BTC_BINARY), \
CODE_FOR_ ## ICODE) /* ICODE */
@ -1593,10 +1586,8 @@ BU_P8V_MISC_3 (BCDSUB_OV, "bcdsub_ov", CONST, bcdsub_unordered)
BU_DFP_MISC_2 (PACK_TD, "pack_dec128", CONST, packtd)
BU_DFP_MISC_2 (UNPACK_TD, "unpack_dec128", CONST, unpacktd)
BU_MISC_2 (PACK_TF, "pack_longdouble", CONST, packtf)
BU_MISC_2 (UNPACK_TF, "unpack_longdouble", CONST, unpacktf)
BU_MISC_1 (UNPACK_TF_0, "longdouble_dw0", CONST, unpacktf_0)
BU_MISC_1 (UNPACK_TF_1, "longdouble_dw1", CONST, unpacktf_1)
BU_LDBL128_2 (PACK_TF, "pack_longdouble", CONST, packtf)
BU_LDBL128_2 (UNPACK_TF, "unpack_longdouble", CONST, unpacktf)
BU_P7_MISC_2 (PACK_V1TI, "pack_vector_int128", CONST, packv1ti)
BU_P7_MISC_2 (UNPACK_V1TI, "unpack_vector_int128", CONST, unpackv1ti)

View File

@ -3041,7 +3041,8 @@ rs6000_builtin_mask_calculate (void)
| ((TARGET_CRYPTO) ? RS6000_BTM_CRYPTO : 0)
| ((TARGET_HTM) ? RS6000_BTM_HTM : 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));
}
/* Override command line options. Mostly we process the processor type and
@ -13589,11 +13590,15 @@ rs6000_invalid_builtin (enum rs6000_builtins fncode)
else if ((fnmask & (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR))
== (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR))
error ("Builtin function %s requires the -mhard-dfp and"
"-mpower8-vector options", name);
" -mpower8-vector options", name);
else if ((fnmask & RS6000_BTM_DFP) != 0)
error ("Builtin function %s requires the -mhard-dfp option", name);
else if ((fnmask & RS6000_BTM_P8_VECTOR) != 0)
error ("Builtin function %s requires the -mpower8-vector option", name);
else if ((fnmask & (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128))
== (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128))
error ("Builtin function %s requires the -mhard-float and"
" -mlong-double-128 options", name);
else if ((fnmask & RS6000_BTM_HARD_FLOAT) != 0)
error ("Builtin function %s requires the -mhard-float option", name);
else
@ -31413,6 +31418,7 @@ static struct rs6000_opt_mask const rs6000_builtin_mask_names[] =
{ "htm", RS6000_BTM_HTM, false, false },
{ "hard-dfp", RS6000_BTM_DFP, false, false },
{ "hard-float", RS6000_BTM_HARD_FLOAT, false, false },
{ "long-double-128", RS6000_BTM_LDBL128, false, false },
};
/* Option variables that we want to support inside attribute((target)) and

View File

@ -2508,8 +2508,8 @@ extern int frame_pointer_needed;
#define RS6000_BTC_SAT RS6000_BTC_MISC /* saturate sets VSCR. */
/* Builtin targets. For now, we reuse the masks for those options that are in
target flags, and pick two random bits for SPE and paired which aren't in
target_flags. */
target flags, and pick three random bits for SPE, paired and ldbl128 which
aren't in target_flags. */
#define RS6000_BTM_ALWAYS 0 /* Always enabled. */
#define RS6000_BTM_ALTIVEC MASK_ALTIVEC /* VMX/altivec vectors. */
#define RS6000_BTM_VSX MASK_VSX /* VSX (vector/scalar). */
@ -2526,6 +2526,7 @@ extern int frame_pointer_needed;
#define RS6000_BTM_CELL MASK_FPRND /* Target is cell powerpc. */
#define RS6000_BTM_DFP MASK_DFP /* Decimal 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_COMMON (RS6000_BTM_ALTIVEC \
| RS6000_BTM_VSX \
@ -2539,7 +2540,8 @@ extern int frame_pointer_needed;
| RS6000_BTM_POPCNTD \
| RS6000_BTM_CELL \
| RS6000_BTM_DFP \
| RS6000_BTM_HARD_FLOAT)
| RS6000_BTM_HARD_FLOAT \
| RS6000_BTM_LDBL128)
/* Define builtin enum index. */

View File

@ -15704,26 +15704,6 @@
""
"")
;; The Advance Toolchain 7.0-3 added private builtins: __builtin_longdouble_dw0
;; and __builtin_longdouble_dw1 to optimize glibc. Add support for these
;; builtins here.
(define_expand "unpacktf_0"
[(set (match_operand:DF 0 "nonimmediate_operand" "")
(unspec:DF [(match_operand:TF 1 "register_operand" "")
(const_int 0)]
UNSPEC_UNPACK_128BIT))]
""
"")
(define_expand "unpacktf_1"
[(set (match_operand:DF 0 "nonimmediate_operand" "")
(unspec:DF [(match_operand:TF 1 "register_operand" "")
(const_int 1)]
UNSPEC_UNPACK_128BIT))]
""
"")
(define_insn_and_split "unpack<mode>_dm"
[(set (match_operand:<FP128_64> 0 "nonimmediate_operand" "=d,m,d,r,m")
(unspec:<FP128_64>

View File

@ -13416,8 +13416,6 @@ double __builtin_rsqrt (double);
uint64_t __builtin_ppc_get_timebase ();
unsigned long __builtin_ppc_mftb ();
double __builtin_unpack_longdouble (long double, int);
double __builtin_longdouble_dw0 (long double);
double __builtin_longdouble_dw1 (long double);
long double __builtin_pack_longdouble (double, double);
@end smallexample

View File

@ -1295,6 +1295,9 @@ Target has 64-bit @code{double}.
@item double64plus
Target has @code{double} that is 64 bits or longer.
@item longdouble128
Target has 128-bit @code{long double}.
@item int32plus
Target has @code{int} that is at 32 bits or longer.

View File

@ -1,3 +1,10 @@
2014-06-13 Peter Bergner <bergner@vnet.ibm.com>
PR target/61415
* lib/target-supports.exp (check_effective_target_longdouble128): New.
* gcc.target/powerpc/pack02.c: Use it.
* gcc.target/powerpc/tfmode_off.c: Likewise.
2014-06-13 Ilya Enkovich <ilya.enkovich@intel.com>
PR rtl-optimization/61094

View File

@ -2,6 +2,7 @@
/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
/* { dg-require-effective-target powerpc_fprs } */
/* { dg-require-effective-target longdouble128 } */
/* { dg-options "-O2 -mhard-float" } */
#include <stddef.h>

View File

@ -1,6 +1,7 @@
/* { dg-do assemble } */
/* { dg-skip-if "" { powerpc-ibm-aix* } { "*" } { "" } } */
/* { dg-skip-if "no TFmode" { powerpc-*-eabi* } { "*" } { "" } } */
/* { dg-require-effective-target longdouble128 } */
/* { dg-options "-O2 -fno-align-functions -mtraceback=no -save-temps" } */
typedef float TFmode __attribute__ ((mode (TF)));

View File

@ -1862,6 +1862,15 @@ proc check_effective_target_large_double { } {
}]
}
# Return 1 if the target supports long double of 128 bits,
# 0 otherwise.
proc check_effective_target_longdouble128 { } {
return [check_no_compiler_messages longdouble128 object {
int dummy[sizeof(long double) == 16 ? 1 : -1];
}]
}
# Return 1 if the target supports double of 64 bits,
# 0 otherwise.