Commit ff3f3951 by Maciej W. Rozycki Committed by Maciej W. Rozycki

linux.h (GLIBC_DYNAMIC_LINKER): Handle `-mnan=2008'.

	gcc/
	* config/mips/linux.h (GLIBC_DYNAMIC_LINKER): Handle `-mnan=2008'.
	(UCLIBC_DYNAMIC_LINKER): New macro.
	* config/mips/linux64.h (GLIBC_DYNAMIC_LINKER32): Handle
	`-mnan=2008'.
	(GLIBC_DYNAMIC_LINKER64, GLIBC_DYNAMIC_LINKERN32): Likewise.
	(UCLIBC_DYNAMIC_LINKER32): Undefine macro first.  Handle
	`-mnan=2008'.
	(UCLIBC_DYNAMIC_LINKER64): Redefine macro.
	(UCLIBC_DYNAMIC_LINKERN32): Likewise.
	* config/mips/mips-modes.def: Remove RESET_FLOAT_FORMAT calls
	for SF and DF modes.  Use ieee_quad_format for TF mode.
	* config/mips/mips-opts.h (mips_ieee_754_setting): New enum.
	* config/mips/mips.c (mips_file_start): Output a `.nan' directive.
	(mips_option_override): Handle `-mnan=legacy'.
	* config/mips/mips.h (TARGET_CPU_CPP_BUILTINS): Handle
	`-mabs=2008' and `-mnan=2008'.
	(OPTION_DEFAULT_SPECS): Add "nan" default.
	(ASM_SPEC): Handle `-mnan='.
	[!HAVE_AS_NAN] (HAVE_AS_NAN): New macro.
	* config/mips/mips.md (abs<mode>2): Handle `-mabs=2008', update
	comment accordingly.
	(neg<mode>2): Likewise.
	* config/mips/mips.opt (mabs, mnan): New options.
	* doc/install.texi (Configuration): Document `--with-nan=' option.
	* doc/invoke.texi (Option Summary): List MIPS `-mabs=' and
	`-mnan=' options.
	(MIPS Options): Document them.
	* config.gcc <mips*-*-*>: Handle `--with-nan='.
	* configure.ac <mips*-*-*>: Check for GAS `-mnan=2008' support.
	* configure: Regenerate.
	* config.in: Regenerate.

	gcc/testsuite/
	* gcc.target/mips/fabs-2008.c: New test case.
	* gcc.target/mips/fabs-legacy.c: New test case.
	* gcc.target/mips/fabsf-2008.c: New test case.
	* gcc.target/mips/fabsf-legacy.c: New test case.
	* gcc.target/mips/fneg-2008.c: New test case.
	* gcc.target/mips/fneg-legacy.c: New test case.
	* gcc.target/mips/fneg-2008.c: New test case.
	* gcc.target/mips/fneg-legacy.c: New test case.
	* gcc.target/mips/nan-2008.c: New test case.
	* gcc.target/mips/nan-legacy.c: New test case.
	* gcc.target/mips/nanf-2008.c: New test case.
	* gcc.target/mips/nanf-legacy.c: New test case.
	* gcc.target/mips/nans-2008.c: New test case.
	* gcc.target/mips/nans-legacy.c: New test case.
	* gcc.target/mips/nansf-2008.c: New test case.
	* gcc.target/mips/nansf-legacy.c: New test case.
	* gcc.target/mips/mips.exp: Handle `-mabs=' and `-mnan='.

From-SVN: r201313
parent 576e2f37
2013-07-29 Maciej W. Rozycki <macro@codesourcery.com>
* config/mips/linux.h (GLIBC_DYNAMIC_LINKER): Handle `-mnan=2008'.
(UCLIBC_DYNAMIC_LINKER): New macro.
* config/mips/linux64.h (GLIBC_DYNAMIC_LINKER32): Handle
`-mnan=2008'.
(GLIBC_DYNAMIC_LINKER64, GLIBC_DYNAMIC_LINKERN32): Likewise.
(UCLIBC_DYNAMIC_LINKER32): Undefine macro first. Handle
`-mnan=2008'.
(UCLIBC_DYNAMIC_LINKER64): Redefine macro.
(UCLIBC_DYNAMIC_LINKERN32): Likewise.
* config/mips/mips-modes.def: Remove RESET_FLOAT_FORMAT calls
for SF and DF modes. Use ieee_quad_format for TF mode.
* config/mips/mips-opts.h (mips_ieee_754_setting): New enum.
* config/mips/mips.c (mips_file_start): Output a `.nan' directive.
(mips_option_override): Handle `-mnan=legacy'.
* config/mips/mips.h (TARGET_CPU_CPP_BUILTINS): Handle
`-mabs=2008' and `-mnan=2008'.
(OPTION_DEFAULT_SPECS): Add "nan" default.
(ASM_SPEC): Handle `-mnan='.
[!HAVE_AS_NAN] (HAVE_AS_NAN): New macro.
* config/mips/mips.md (abs<mode>2): Handle `-mabs=2008', update
comment accordingly.
(neg<mode>2): Likewise.
* config/mips/mips.opt (mabs, mnan): New options.
* doc/install.texi (Configuration): Document `--with-nan=' option.
* doc/invoke.texi (Option Summary): List MIPS `-mabs=' and
`-mnan=' options.
(MIPS Options): Document them.
* config.gcc <mips*-*-*>: Handle `--with-nan='.
* configure.ac <mips*-*-*>: Check for GAS `-mnan=2008' support.
* configure: Regenerate.
* config.in: Regenerate.
2013-07-29 Uros Bizjak <ubizjak@gmail.com> 2013-07-29 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (float post-reload splitters): Do not check * config/i386/i386.md (float post-reload splitters): Do not check
......
...@@ -3532,7 +3532,7 @@ case "${target}" in ...@@ -3532,7 +3532,7 @@ case "${target}" in
;; ;;
mips*-*-*) mips*-*-*)
supported_defaults="abi arch arch_32 arch_64 float fpu tune tune_32 tune_64 divide llsc mips-plt synci" supported_defaults="abi arch arch_32 arch_64 float fpu nan tune tune_32 tune_64 divide llsc mips-plt synci"
case ${with_float} in case ${with_float} in
"" | soft | hard) "" | soft | hard)
...@@ -3554,6 +3554,16 @@ case "${target}" in ...@@ -3554,6 +3554,16 @@ case "${target}" in
;; ;;
esac esac
case ${with_nan} in
"" | 2008 | legacy)
# OK
;;
*)
echo "Unknown NaN encoding used in --with-nan=$with_nan" 1>&2
exit 1
;;
esac
case ${with_abi} in case ${with_abi} in
"" | 32 | o64 | n32 | 64 | eabi) "" | 32 | o64 | n32 | 64 | eabi)
# OK # OK
...@@ -3913,7 +3923,7 @@ case ${target} in ...@@ -3913,7 +3923,7 @@ case ${target} in
esac esac
t= t=
all_defaults="abi cpu cpu_32 cpu_64 arch arch_32 arch_64 tune tune_32 tune_64 schedule float mode fpu divide llsc mips-plt synci tls" all_defaults="abi cpu cpu_32 cpu_64 arch arch_32 arch_64 tune tune_32 tune_64 schedule float mode fpu nan divide llsc mips-plt synci tls"
for option in $all_defaults for option in $all_defaults
do do
eval "val=\$with_"`echo $option | sed s/-/_/g` eval "val=\$with_"`echo $option | sed s/-/_/g`
......
...@@ -417,6 +417,12 @@ ...@@ -417,6 +417,12 @@
#endif #endif
/* Define if the assembler understands -mnan=. */
#ifndef USED_FOR_TARGET
#undef HAVE_AS_NAN
#endif
/* Define if your assembler supports the -no-mul-bug-abort option. */ /* Define if your assembler supports the -no-mul-bug-abort option. */
#ifndef USED_FOR_TARGET #ifndef USED_FOR_TARGET
#undef HAVE_AS_NO_MUL_BUG_ABORT_OPTION #undef HAVE_AS_NO_MUL_BUG_ABORT_OPTION
......
...@@ -17,4 +17,9 @@ You should have received a copy of the GNU General Public License ...@@ -17,4 +17,9 @@ You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1" #define GLIBC_DYNAMIC_LINKER \
"%{mnan=2008:/lib/ld-linux-mipsn8.so.1;:/lib/ld.so.1}"
#undef UCLIBC_DYNAMIC_LINKER
#define UCLIBC_DYNAMIC_LINKER \
"%{mnan=2008:/lib/ld-uClibc-mipsn8.so.0;:/lib/ld-uClibc.so.0}"
...@@ -22,10 +22,22 @@ along with GCC; see the file COPYING3. If not see ...@@ -22,10 +22,22 @@ along with GCC; see the file COPYING3. If not see
#define GNU_USER_LINK_EMULATION64 "elf64%{EB:b}%{EL:l}tsmip" #define GNU_USER_LINK_EMULATION64 "elf64%{EB:b}%{EL:l}tsmip"
#define GNU_USER_LINK_EMULATIONN32 "elf32%{EB:b}%{EL:l}tsmipn32" #define GNU_USER_LINK_EMULATIONN32 "elf32%{EB:b}%{EL:l}tsmipn32"
#define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1" #define GLIBC_DYNAMIC_LINKER32 \
#define GLIBC_DYNAMIC_LINKER64 "/lib64/ld.so.1" "%{mnan=2008:/lib/ld-linux-mipsn8.so.1;:/lib/ld.so.1}"
#define GLIBC_DYNAMIC_LINKERN32 "/lib32/ld.so.1" #define GLIBC_DYNAMIC_LINKER64 \
#define UCLIBC_DYNAMIC_LINKERN32 "/lib32/ld-uClibc.so.0" "%{mnan=2008:/lib64/ld-linux-mipsn8.so.1;:/lib64/ld.so.1}"
#define GLIBC_DYNAMIC_LINKERN32 \
"%{mnan=2008:/lib32/ld-linux-mipsn8.so.1;:/lib32/ld.so.1}"
#undef UCLIBC_DYNAMIC_LINKER32
#define UCLIBC_DYNAMIC_LINKER32 \
"%{mnan=2008:/lib/ld-uClibc-mipsn8.so.0;:/lib/ld-uClibc.so.0}"
#undef UCLIBC_DYNAMIC_LINKER64
#define UCLIBC_DYNAMIC_LINKER64 \
"%{mnan=2008:/lib/ld64-uClibc-mipsn8.so.0;:/lib/ld64-uClibc.so.0}"
#define UCLIBC_DYNAMIC_LINKERN32 \
"%{mnan=2008:/lib32/ld-uClibc-mipsn8.so.0;:/lib32/ld-uClibc.so.0}"
#define BIONIC_DYNAMIC_LINKERN32 "/system/bin/linker32" #define BIONIC_DYNAMIC_LINKERN32 "/system/bin/linker32"
#define GNU_USER_DYNAMIC_LINKERN32 \ #define GNU_USER_DYNAMIC_LINKERN32 \
CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERN32, UCLIBC_DYNAMIC_LINKERN32, \ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERN32, UCLIBC_DYNAMIC_LINKERN32, \
......
...@@ -17,12 +17,7 @@ You should have received a copy of the GNU General Public License ...@@ -17,12 +17,7 @@ You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
/* MIPS has a quirky almost-IEEE format for all its FLOAT_MODE (TF, 16, ieee_quad_format);
floating point. */
RESET_FLOAT_FORMAT (SF, mips_single_format);
RESET_FLOAT_FORMAT (DF, mips_double_format);
FLOAT_MODE (TF, 16, mips_quad_format);
/* Vector modes. */ /* Vector modes. */
VECTOR_MODES (INT, 4); /* V4QI V2HI */ VECTOR_MODES (INT, 4); /* V4QI V2HI */
......
...@@ -27,6 +27,13 @@ enum mips_code_readable_setting { ...@@ -27,6 +27,13 @@ enum mips_code_readable_setting {
CODE_READABLE_YES CODE_READABLE_YES
}; };
/* Enumerates the setting of the -mabs and -mnan options. */
enum mips_ieee_754_setting {
MIPS_IEEE_754_DEFAULT,
MIPS_IEEE_754_LEGACY,
MIPS_IEEE_754_2008
};
/* Enumerates the setting of the -mr10k-cache-barrier option. */ /* Enumerates the setting of the -mr10k-cache-barrier option. */
enum mips_r10k_cache_barrier_setting { enum mips_r10k_cache_barrier_setting {
R10K_CACHE_BARRIER_NONE, R10K_CACHE_BARRIER_NONE,
......
...@@ -8843,6 +8843,11 @@ mips_file_start (void) ...@@ -8843,6 +8843,11 @@ mips_file_start (void)
fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n" fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
"\t.previous\n", TARGET_LONG64 ? 64 : 32); "\t.previous\n", TARGET_LONG64 ? 64 : 32);
/* Record the NaN encoding. */
if (HAVE_AS_NAN || mips_nan != MIPS_IEEE_754_DEFAULT)
fprintf (asm_out_file, "\t.nan\t%s\n",
mips_nan == MIPS_IEEE_754_2008 ? "2008" : "legacy");
#ifdef HAVE_AS_GNU_ATTRIBUTE #ifdef HAVE_AS_GNU_ATTRIBUTE
{ {
int attr; int attr;
...@@ -16980,6 +16985,15 @@ mips_option_override (void) ...@@ -16980,6 +16985,15 @@ mips_option_override (void)
} }
} }
/* Pre-IEEE 754-2008 MIPS hardware has a quirky almost-IEEE format
for all its floating point. */
if (mips_nan != MIPS_IEEE_754_2008)
{
REAL_MODE_FORMAT (SFmode) = &mips_single_format;
REAL_MODE_FORMAT (DFmode) = &mips_double_format;
REAL_MODE_FORMAT (TFmode) = &mips_quad_format;
}
/* Make sure that the user didn't turn off paired single support when /* Make sure that the user didn't turn off paired single support when
MIPS-3D support is requested. */ MIPS-3D support is requested. */
if (TARGET_MIPS3D if (TARGET_MIPS3D
......
...@@ -507,6 +507,12 @@ struct mips_cpu_info { ...@@ -507,6 +507,12 @@ struct mips_cpu_info {
if (TARGET_PAIRED_SINGLE_FLOAT) \ if (TARGET_PAIRED_SINGLE_FLOAT) \
builtin_define ("__mips_paired_single_float"); \ builtin_define ("__mips_paired_single_float"); \
\ \
if (mips_abs == MIPS_IEEE_754_2008) \
builtin_define ("__mips_abs2008"); \
\
if (mips_nan == MIPS_IEEE_754_2008) \
builtin_define ("__mips_nan2008"); \
\
if (TARGET_BIG_ENDIAN) \ if (TARGET_BIG_ENDIAN) \
{ \ { \
builtin_define_std ("MIPSEB"); \ builtin_define_std ("MIPSEB"); \
...@@ -743,6 +749,7 @@ struct mips_cpu_info { ...@@ -743,6 +749,7 @@ struct mips_cpu_info {
--with-abi is ignored if -mabi is specified. --with-abi is ignored if -mabi is specified.
--with-float is ignored if -mhard-float or -msoft-float are --with-float is ignored if -mhard-float or -msoft-float are
specified. specified.
--with-nan is ignored if -mnan is specified.
--with-divide is ignored if -mdivide-traps or -mdivide-breaks are --with-divide is ignored if -mdivide-traps or -mdivide-breaks are
specified. */ specified. */
#define OPTION_DEFAULT_SPECS \ #define OPTION_DEFAULT_SPECS \
...@@ -755,6 +762,7 @@ struct mips_cpu_info { ...@@ -755,6 +762,7 @@ struct mips_cpu_info {
{"abi", "%{!mabi=*:-mabi=%(VALUE)}" }, \ {"abi", "%{!mabi=*:-mabi=%(VALUE)}" }, \
{"float", "%{!msoft-float:%{!mhard-float:-m%(VALUE)-float}}" }, \ {"float", "%{!msoft-float:%{!mhard-float:-m%(VALUE)-float}}" }, \
{"fpu", "%{!msingle-float:%{!mdouble-float:-m%(VALUE)-float}}" }, \ {"fpu", "%{!msingle-float:%{!mdouble-float:-m%(VALUE)-float}}" }, \
{"nan", "%{!mnan=*:-mnan=%(VALUE)}" }, \
{"divide", "%{!mdivide-traps:%{!mdivide-breaks:-mdivide-%(VALUE)}}" }, \ {"divide", "%{!mdivide-traps:%{!mdivide-breaks:-mdivide-%(VALUE)}}" }, \
{"llsc", "%{!mllsc:%{!mno-llsc:-m%(VALUE)}}" }, \ {"llsc", "%{!mllsc:%{!mno-llsc:-m%(VALUE)}}" }, \
{"mips-plt", "%{!mplt:%{!mno-plt:-m%(VALUE)}}" }, \ {"mips-plt", "%{!mplt:%{!mno-plt:-m%(VALUE)}}" }, \
...@@ -1160,7 +1168,7 @@ struct mips_cpu_info { ...@@ -1160,7 +1168,7 @@ struct mips_cpu_info {
%(subtarget_asm_debugging_spec) \ %(subtarget_asm_debugging_spec) \
%{mabi=*} %{!mabi=*: %(asm_abi_default_spec)} \ %{mabi=*} %{!mabi=*: %(asm_abi_default_spec)} \
%{mgp32} %{mgp64} %{march=*} %{mxgot:-xgot} \ %{mgp32} %{mgp64} %{march=*} %{mxgot:-xgot} \
%{mfp32} %{mfp64} \ %{mfp32} %{mfp64} %{mnan=*} \
%{mshared} %{mno-shared} \ %{mshared} %{mno-shared} \
%{msym32} %{mno-sym32} \ %{msym32} %{mno-sym32} \
%{mtune=*} \ %{mtune=*} \
...@@ -2897,6 +2905,10 @@ while (0) ...@@ -2897,6 +2905,10 @@ while (0)
#define HAVE_AS_TLS 0 #define HAVE_AS_TLS 0
#endif #endif
#ifndef HAVE_AS_NAN
#define HAVE_AS_NAN 0
#endif
#ifndef USED_FOR_TARGET #ifndef USED_FOR_TARGET
/* Information about ".set noFOO; ...; .set FOO" blocks. */ /* Information about ".set noFOO; ...; .set FOO" blocks. */
struct mips_asm_switch { struct mips_asm_switch {
......
...@@ -2711,14 +2711,15 @@ ...@@ -2711,14 +2711,15 @@
;; Do not use the integer abs macro instruction, since that signals an ;; Do not use the integer abs macro instruction, since that signals an
;; exception on -2147483648 (sigh). ;; exception on -2147483648 (sigh).
;; abs.fmt is an arithmetic instruction and treats all NaN inputs as ;; The "legacy" (as opposed to "2008") form of ABS.fmt is an arithmetic
;; invalid; it does not clear their sign bits. We therefore can't use ;; instruction that treats all NaN inputs as invalid; it does not clear
;; abs.fmt if the signs of NaNs matter. ;; their sign bit. We therefore can't use that form if the signs of
;; NaNs matter.
(define_insn "abs<mode>2" (define_insn "abs<mode>2"
[(set (match_operand:ANYF 0 "register_operand" "=f") [(set (match_operand:ANYF 0 "register_operand" "=f")
(abs:ANYF (match_operand:ANYF 1 "register_operand" "f")))] (abs:ANYF (match_operand:ANYF 1 "register_operand" "f")))]
"!HONOR_NANS (<MODE>mode)" "mips_abs == MIPS_IEEE_754_2008 || !HONOR_NANS (<MODE>mode)"
"abs.<fmt>\t%0,%1" "abs.<fmt>\t%0,%1"
[(set_attr "type" "fabs") [(set_attr "type" "fabs")
(set_attr "mode" "<UNITMODE>")]) (set_attr "mode" "<UNITMODE>")])
...@@ -2793,14 +2794,15 @@ ...@@ -2793,14 +2794,15 @@
[(set_attr "alu_type" "sub") [(set_attr "alu_type" "sub")
(set_attr "mode" "DI")]) (set_attr "mode" "DI")])
;; neg.fmt is an arithmetic instruction and treats all NaN inputs as ;; The "legacy" (as opposed to "2008") form of NEG.fmt is an arithmetic
;; invalid; it does not flip their sign bit. We therefore can't use ;; instruction that treats all NaN inputs as invalid; it does not flip
;; neg.fmt if the signs of NaNs matter. ;; their sign bit. We therefore can't use that form if the signs of
;; NaNs matter.
(define_insn "neg<mode>2" (define_insn "neg<mode>2"
[(set (match_operand:ANYF 0 "register_operand" "=f") [(set (match_operand:ANYF 0 "register_operand" "=f")
(neg:ANYF (match_operand:ANYF 1 "register_operand" "f")))] (neg:ANYF (match_operand:ANYF 1 "register_operand" "f")))]
"!HONOR_NANS (<MODE>mode)" "mips_abs == MIPS_IEEE_754_2008 || !HONOR_NANS (<MODE>mode)"
"neg.<fmt>\t%0,%1" "neg.<fmt>\t%0,%1"
[(set_attr "type" "fneg") [(set_attr "type" "fneg")
(set_attr "mode" "<UNITMODE>")]) (set_attr "mode" "<UNITMODE>")])
......
...@@ -205,6 +205,24 @@ mfused-madd ...@@ -205,6 +205,24 @@ mfused-madd
Target Report Mask(FUSED_MADD) Target Report Mask(FUSED_MADD)
Generate floating-point multiply-add instructions Generate floating-point multiply-add instructions
mabs=
Target RejectNegative Joined Enum(mips_ieee_754_value) Var(mips_abs) Init(MIPS_IEEE_754_DEFAULT)
-mabs=MODE Select the IEEE 754 ABS/NEG instruction execution mode
mnan=
Target RejectNegative Joined Enum(mips_ieee_754_value) Var(mips_nan) Init(MIPS_IEEE_754_DEFAULT)
-mnan=ENCODING Select the IEEE 754 NaN data encoding
Enum
Name(mips_ieee_754_value) Type(int)
Known MIPS IEEE 754 settings (for use with the -mabs= and -mnan= options):
EnumValue
Enum(mips_ieee_754_value) String(2008) Value(MIPS_IEEE_754_2008)
EnumValue
Enum(mips_ieee_754_value) String(legacy) Value(MIPS_IEEE_754_LEGACY)
mgp32 mgp32
Target Report RejectNegative InverseMask(64BIT) Target Report RejectNegative InverseMask(64BIT)
Use 32-bit general registers Use 32-bit general registers
......
...@@ -26019,6 +26019,41 @@ $as_echo "$gcc_cv_ld_mips_personality_relaxation" >&6; } ...@@ -26019,6 +26019,41 @@ $as_echo "$gcc_cv_ld_mips_personality_relaxation" >&6; }
$as_echo "#define HAVE_LD_PERSONALITY_RELAXATION 1" >>confdefs.h $as_echo "#define HAVE_LD_PERSONALITY_RELAXATION 1" >>confdefs.h
fi fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for -mnan= support" >&5
$as_echo_n "checking assembler for -mnan= support... " >&6; }
if test "${gcc_cv_as_mips_nan+set}" = set; then :
$as_echo_n "(cached) " >&6
else
gcc_cv_as_mips_nan=no
if test x$gcc_cv_as != x; then
$as_echo '' > conftest.s
if { ac_try='$gcc_cv_as $gcc_cv_as_flags -mnan=2008 -o conftest.o conftest.s >&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }
then
gcc_cv_as_mips_nan=yes
else
echo "configure: failed program was" >&5
cat conftest.s >&5
fi
rm -f conftest.o conftest.s
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_mips_nan" >&5
$as_echo "$gcc_cv_as_mips_nan" >&6; }
if test $gcc_cv_as_mips_nan = yes; then
$as_echo "#define HAVE_AS_NAN 1" >>confdefs.h
fi
if test x$gcc_cv_as_mips_nan = xno \
&& test x$with_nan != x; then
as_fn_error "Requesting --with-nan= requires assembler support for -mnan=" "$LINENO" 5
fi
;; ;;
esac esac
......
...@@ -4168,6 +4168,17 @@ EOF ...@@ -4168,6 +4168,17 @@ EOF
[Define if your linker can relax absolute .eh_frame personality [Define if your linker can relax absolute .eh_frame personality
pointers into PC-relative form.]) pointers into PC-relative form.])
fi fi
gcc_GAS_CHECK_FEATURE([-mnan= support],
gcc_cv_as_mips_nan,,
[-mnan=2008],,,
[AC_DEFINE(HAVE_AS_NAN, 1,
[Define if the assembler understands -mnan=.])])
if test x$gcc_cv_as_mips_nan = xno \
&& test x$with_nan != x; then
AC_MSG_ERROR(
[Requesting --with-nan= requires assembler support for -mnan=])
fi
;; ;;
esac esac
......
...@@ -1221,6 +1221,24 @@ ISA for floating-point arithmetics. You can select either @samp{sse} which ...@@ -1221,6 +1221,24 @@ ISA for floating-point arithmetics. You can select either @samp{sse} which
enables @option{-msse2} or @samp{avx} which enables @option{-mavx} by default. enables @option{-msse2} or @samp{avx} which enables @option{-mavx} by default.
This option is only supported on i386 and x86-64 targets. This option is only supported on i386 and x86-64 targets.
@item --with-nan=@var{encoding}
On MIPS targets, set the default encoding convention to use for the
special not-a-number (NaN) IEEE 754 floating-point data. The
possibilities for @var{encoding} are:
@table @code
@item legacy
Use the legacy encoding, as with the @option{-mnan=legacy} command-line
option.
@item 2008
Use the 754-2008 encoding, as with the @option{-mnan=2008} command-line
option.
@end table
To use this configuration option you must have an assembler version
installed that supports the @option{-mnan=} command-line option too.
In the absence of this configuration option the default convention is
the legacy encoding, as when neither of the @option{-mnan=2008} and
@option{-mnan=legacy} command-line options has been used.
@item --with-divide=@var{type} @item --with-divide=@var{type}
Specify how the compiler should generate code for checking for Specify how the compiler should generate code for checking for
division by zero. This option is only supported on the MIPS target. division by zero. This option is only supported on the MIPS target.
......
...@@ -750,7 +750,8 @@ Objective-C and Objective-C++ Dialects}. ...@@ -750,7 +750,8 @@ Objective-C and Objective-C++ Dialects}.
-mabi=@var{abi} -mabicalls -mno-abicalls @gol -mabi=@var{abi} -mabicalls -mno-abicalls @gol
-mshared -mno-shared -mplt -mno-plt -mxgot -mno-xgot @gol -mshared -mno-shared -mplt -mno-plt -mxgot -mno-xgot @gol
-mgp32 -mgp64 -mfp32 -mfp64 -mhard-float -msoft-float @gol -mgp32 -mgp64 -mfp32 -mfp64 -mhard-float -msoft-float @gol
-mno-float -msingle-float -mdouble-float @gol -mno-float -msingle-float -mdouble-float @gol
-mabs=@var{mode} -mnan=@var{encoding} @gol
-mdsp -mno-dsp -mdspr2 -mno-dspr2 @gol -mdsp -mno-dsp -mdspr2 -mno-dspr2 @gol
-mmcu -mmno-mcu @gol -mmcu -mmno-mcu @gol
-meva -mno-eva @gol -meva -mno-eva @gol
...@@ -16324,6 +16325,48 @@ operations. ...@@ -16324,6 +16325,48 @@ operations.
Assume that the floating-point coprocessor supports double-precision Assume that the floating-point coprocessor supports double-precision
operations. This is the default. operations. This is the default.
@item -mabs=2008
@itemx -mabs=legacy
@opindex mabs=2008
@opindex mabs=legacy
These options control the treatment of the special not-a-number (NaN)
IEEE 754 floating-point data with the @code{abs.@i{fmt}} and
@code{neg.@i{fmt}} machine instructions.
By default or when the @option{-mabs=legacy} is used the legacy
treatment is selected. In this case these instructions are considered
arithmetic and avoided where correct operation is required and the
input operand might be a NaN. A longer sequence of instructions that
manipulate the sign bit of floating-point datum manually is used
instead unless the @option{-ffinite-math-only} option has also been
specified.
The @option{-mabs=2008} option selects the IEEE 754-2008 treatment. In
this case these instructions are considered non-arithmetic and therefore
operating correctly in all cases, including in particular where the
input operand is a NaN. These instructions are therefore always used
for the respective operations.
@item -mnan=2008
@itemx -mnan=legacy
@opindex mnan=2008
@opindex mnan=legacy
These options control the encoding of the special not-a-number (NaN)
IEEE 754 floating-point data.
The @option{-mnan=legacy} option selects the legacy encoding. In this
case quiet NaNs (qNaNs) are denoted by the first bit of their trailing
significand field being 0, whereas signalling NaNs (sNaNs) are denoted
by the first bit of their trailing significand field being 1.
The @option{-mnan=2008} option selects the IEEE 754-2008 encoding. In
this case qNaNs are denoted by the first bit of their trailing
significand field being 1, whereas sNaNs are denoted by the first bit of
their trailing significand field being 0.
The default is @option{-mnan=legacy} unless GCC has been configured with
@option{--with-nan=2008}.
@item -mllsc @item -mllsc
@itemx -mno-llsc @itemx -mno-llsc
@opindex mllsc @opindex mllsc
......
2013-07-29 Maciej W. Rozycki <macro@codesourcery.com>
* gcc.target/mips/fabs-2008.c: New test case.
* gcc.target/mips/fabs-legacy.c: New test case.
* gcc.target/mips/fabsf-2008.c: New test case.
* gcc.target/mips/fabsf-legacy.c: New test case.
* gcc.target/mips/fneg-2008.c: New test case.
* gcc.target/mips/fneg-legacy.c: New test case.
* gcc.target/mips/fneg-2008.c: New test case.
* gcc.target/mips/fneg-legacy.c: New test case.
* gcc.target/mips/nan-2008.c: New test case.
* gcc.target/mips/nan-legacy.c: New test case.
* gcc.target/mips/nanf-2008.c: New test case.
* gcc.target/mips/nanf-legacy.c: New test case.
* gcc.target/mips/nans-2008.c: New test case.
* gcc.target/mips/nans-legacy.c: New test case.
* gcc.target/mips/nansf-2008.c: New test case.
* gcc.target/mips/nansf-legacy.c: New test case.
* gcc.target/mips/mips.exp: Handle `-mabs=' and `-mnan='.
2013-07-29 Alexander Ivchenko <alexander.ivchenko@intel.com> 2013-07-29 Alexander Ivchenko <alexander.ivchenko@intel.com>
Maxim Kuvyrkov <maxim@kugelworks.com> Maxim Kuvyrkov <maxim@kugelworks.com>
......
/* { dg-do compile } */
/* { dg-options "-mabs=2008" } */
NOMIPS16 double
fabs_2008 (double d)
{
return __builtin_fabs (d);
}
/* { dg-final { scan-assembler "\tabs\.d\t" } } */
/* { dg-do compile } */
/* { dg-options "-mabs=legacy" } */
NOMIPS16 double
fabs_legacy (double d)
{
return __builtin_fabs (d);
}
/* { dg-final { scan-assembler-not "\tabs\.d\t" } } */
/* { dg-do compile } */
/* { dg-options "-mabs=2008" } */
NOMIPS16 float
fabsf_2008 (float f)
{
return __builtin_fabsf (f);
}
/* { dg-final { scan-assembler "\tabs\.s\t" } } */
/* { dg-do compile } */
/* { dg-options "-mabs=legacy" } */
NOMIPS16 float
fabsf_legacy (float f)
{
return __builtin_fabsf (f);
}
/* { dg-final { scan-assembler-not "\tabs\.s\t" } } */
/* { dg-do compile } */
/* { dg-options "-mabs=2008" } */
NOMIPS16 double
fneg_2008 (double d)
{
return -d;
}
/* { dg-final { scan-assembler "\tneg\.d\t" } } */
/* { dg-do compile } */
/* { dg-options "-mabs=legacy" } */
NOMIPS16 double
fneg_legacy (double d)
{
return -d;
}
/* { dg-final { scan-assembler-not "\tneg\.d\t" } } */
/* { dg-do compile } */
/* { dg-options "-mabs=2008" } */
NOMIPS16 float
fnegf_2008 (float f)
{
return -f;
}
/* { dg-final { scan-assembler "\tneg\.s\t" } } */
/* { dg-do compile } */
/* { dg-options "-mabs=legacy" } */
NOMIPS16 float
fnegf_legacy (float f)
{
return -f;
}
/* { dg-final { scan-assembler-not "\tneg\.s\t" } } */
...@@ -276,8 +276,10 @@ foreach option { ...@@ -276,8 +276,10 @@ foreach option {
# Add -mfoo= options to mips_option_groups. # Add -mfoo= options to mips_option_groups.
foreach option { foreach option {
abs
branch-cost branch-cost
code-readable code-readable
nan
r10k-cache-barrier r10k-cache-barrier
tune tune
} { } {
...@@ -705,6 +707,18 @@ proc mips-dg-init {} { ...@@ -705,6 +707,18 @@ proc mips-dg-init {} {
"-msoft-float", "-msoft-float",
#endif #endif
#ifdef __mips_abs2008
"-mabs=2008",
#else
"-mabs=legacy",
#endif
#ifdef __mips_nan2008
"-mnan=2008",
#else
"-mnan=legacy",
#endif
#if __mips_fpr == 64 #if __mips_fpr == 64
"-mfp64", "-mfp64",
#else #else
...@@ -826,6 +840,8 @@ proc mips-dg-finish {} { ...@@ -826,6 +840,8 @@ proc mips-dg-finish {} {
# | | # | |
# -mfp64 -mfp32 # -mfp64 -mfp32
# | | # | |
# -mabs=2008/-mabs=legacy <no option>
# | |
# -mhard-float -msoft-float # -mhard-float -msoft-float
# | | # | |
# -mno-sym32 -msym32 # -mno-sym32 -msym32
...@@ -913,6 +929,8 @@ proc mips-dg-options { args } { ...@@ -913,6 +929,8 @@ proc mips-dg-options { args } {
mips_option_dependency options "-mips3d" "-mpaired-single" mips_option_dependency options "-mips3d" "-mpaired-single"
mips_option_dependency options "-mpaired-single" "-mfp64" mips_option_dependency options "-mpaired-single" "-mfp64"
mips_option_dependency options "-mfp64" "-mhard-float" mips_option_dependency options "-mfp64" "-mhard-float"
mips_option_dependency options "-mabs=2008" "-mhard-float"
mips_option_dependency options "-mabs=legacy" "-mhard-float"
mips_option_dependency options "-mrelax-pic-calls" "-mno-plt" mips_option_dependency options "-mrelax-pic-calls" "-mno-plt"
mips_option_dependency options "-mrelax-pic-calls" "-mabicalls" mips_option_dependency options "-mrelax-pic-calls" "-mabicalls"
mips_option_dependency options "-mrelax-pic-calls" "-mexplicit-relocs" mips_option_dependency options "-mrelax-pic-calls" "-mexplicit-relocs"
......
/* { dg-do compile } */
/* { dg-options "-mnan=2008 -EB" } */
double d = __builtin_nan ("");
/* { dg-final { scan-assembler "\t\.nan\t2008\n" } } */
/* { dg-final { scan-assembler "\t\.word\t2146959360\n\t.word\t0\n" } } */
/* { dg-do compile } */
/* { dg-options "-mnan=legacy -EB" } */
double d = __builtin_nan ("");
/* { dg-final { scan-assembler "\t\.nan\tlegacy\n" } } */
/* { dg-final { scan-assembler "\t\.word\t2146959359\n\t.word\t-1\n" } } */
/* { dg-do compile } */
/* { dg-options "-mnan=2008 -EB" } */
float f = __builtin_nanf ("");
/* { dg-final { scan-assembler "\t\.nan\t2008\n" } } */
/* { dg-final { scan-assembler "\t\.word\t2143289344\n" } } */
/* { dg-do compile } */
/* { dg-options "-mnan=legacy -EB" } */
float f = __builtin_nanf ("");
/* { dg-final { scan-assembler "\t\.nan\tlegacy\n" } } */
/* { dg-final { scan-assembler "\t\.word\t2143289343\n" } } */
/* { dg-do compile } */
/* { dg-options "-mnan=2008 -EB" } */
double ds = __builtin_nans ("");
/* { dg-final { scan-assembler "\t\.nan\t2008\n" } } */
/* { dg-final { scan-assembler "\t\.word\t2146697216\n\t.word\t0\n" } } */
/* { dg-do compile } */
/* { dg-options "-mnan=legacy -EB" } */
double ds = __builtin_nans ("");
/* { dg-final { scan-assembler "\t\.nan\tlegacy\n" } } */
/* { dg-final { scan-assembler "\t\.word\t2147483647\n\t.word\t-1\n" } } */
/* { dg-do compile } */
/* { dg-options "-mnan=2008 -EB" } */
float fs = __builtin_nansf ("");
/* { dg-final { scan-assembler "\t\.nan\t2008\n" } } */
/* { dg-final { scan-assembler "\t\.word\t2141192192\n" } } */
/* { dg-do compile } */
/* { dg-options "-mnan=legacy -EB" } */
float fs = __builtin_nansf ("");
/* { dg-final { scan-assembler "\t\.nan\tlegacy\n" } } */
/* { dg-final { scan-assembler "\t\.word\t2147483647\n" } } */
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