linux.h (GLIBC_DYNAMIC_LINKER): Handle `-mnan=2008'.
authorMaciej W. Rozycki <macro@codesourcery.com>
Mon, 29 Jul 2013 14:37:30 +0000 (14:37 +0000)
committerMaciej W. Rozycki <macro@gcc.gnu.org>
Mon, 29 Jul 2013 14:37:30 +0000 (14:37 +0000)
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

33 files changed:
gcc/ChangeLog
gcc/config.gcc
gcc/config.in
gcc/config/mips/linux.h
gcc/config/mips/linux64.h
gcc/config/mips/mips-modes.def
gcc/config/mips/mips-opts.h
gcc/config/mips/mips.c
gcc/config/mips/mips.h
gcc/config/mips/mips.md
gcc/config/mips/mips.opt
gcc/configure
gcc/configure.ac
gcc/doc/install.texi
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/fabs-2008.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/fabs-legacy.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/fabsf-2008.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/fabsf-legacy.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/fneg-2008.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/fneg-legacy.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/fnegf-2008.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/fnegf-legacy.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/mips.exp
gcc/testsuite/gcc.target/mips/nan-2008.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/nan-legacy.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/nanf-2008.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/nanf-legacy.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/nans-2008.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/nans-legacy.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/nansf-2008.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/nansf-legacy.c [new file with mode: 0644]

index e30f63b542a09051a22862a02f9c733068b361d3..4237a6d2550b3d79c52c75fc4b31894b37ae67dd 100644 (file)
@@ -1,3 +1,37 @@
+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>
 
        * config/i386/i386.md (float post-reload splitters): Do not check
index e09ba64d675476fb95d8950f35ff8e9017b4f3c9..e4c42ab6966d780e0558d6d6c9db44fffb9ae34b 100644 (file)
@@ -3532,7 +3532,7 @@ case "${target}" in
                ;;
 
        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
                "" | soft | hard)
@@ -3554,6 +3554,16 @@ case "${target}" in
                        ;;
                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
                "" | 32 | o64 | n32 | 64 | eabi)
                        # OK
@@ -3913,7 +3923,7 @@ case ${target} in
 esac
 
 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
 do
        eval "val=\$with_"`echo $option | sed s/-/_/g`
index 288c11f937776b9463fbdd2e0c1b483bbd48a8c8..25890e889ba0c7cd0ed67cfefddb8c18c3813cfc 100644 (file)
 #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. */
 #ifndef USED_FOR_TARGET
 #undef HAVE_AS_NO_MUL_BUG_ABORT_OPTION
index 9b4c68db6ee0bdcd10e3c181f38fc733c305091f..6736295eb363d2bd4089bfe8fbbcc5c2f28cd4b5 100644 (file)
@@ -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
 <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}"
index dbba47a1a13ad73d3122b526414bb8e337d89e03..421a53a1085f207aac6abdf6cbcdfef9f9019003 100644 (file)
@@ -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_EMULATIONN32 "elf32%{EB:b}%{EL:l}tsmipn32"
 
-#define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1"
-#define GLIBC_DYNAMIC_LINKER64 "/lib64/ld.so.1"
-#define GLIBC_DYNAMIC_LINKERN32 "/lib32/ld.so.1"
-#define UCLIBC_DYNAMIC_LINKERN32 "/lib32/ld-uClibc.so.0"
+#define GLIBC_DYNAMIC_LINKER32 \
+  "%{mnan=2008:/lib/ld-linux-mipsn8.so.1;:/lib/ld.so.1}"
+#define GLIBC_DYNAMIC_LINKER64 \
+  "%{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 GNU_USER_DYNAMIC_LINKERN32 \
   CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERN32, UCLIBC_DYNAMIC_LINKERN32, \
index ecb7f181d8f2dfc2bc00fca60cd73ec27ed1567c..383d2cb6d43907d082a54669082935c9242292e8 100644 (file)
@@ -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
 <http://www.gnu.org/licenses/>.  */
 
-/* MIPS has a quirky almost-IEEE format for all its
-   floating point.  */
-RESET_FLOAT_FORMAT (SF, mips_single_format);
-RESET_FLOAT_FORMAT (DF, mips_double_format);
-
-FLOAT_MODE (TF, 16, mips_quad_format);
+FLOAT_MODE (TF, 16, ieee_quad_format);
 
 /* Vector modes.  */
 VECTOR_MODES (INT, 4);        /* V4QI  V2HI      */
index dbfcfad0b04522de5b8fa317977e291ffaa26d1d..56249d94c4e2b4264b21242445cb4dab2ef76b1d 100644 (file)
@@ -27,6 +27,13 @@ enum mips_code_readable_setting {
   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.  */
 enum mips_r10k_cache_barrier_setting {
   R10K_CACHE_BARRIER_NONE,
index a56757c877f8d4e3375af76146048b546f241070..46e1d2d7c210d1a8bc3e387ef04a89234c8b1274 100644 (file)
@@ -8843,6 +8843,11 @@ mips_file_start (void)
     fprintf (asm_out_file, "\t.section .gcc_compiled_long%d\n"
             "\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
   {
     int attr;
@@ -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
      MIPS-3D support is requested.  */
   if (TARGET_MIPS3D
index 2dcccd48b8fd42f4f59c21fffac0c9322bc05065..af7eeee6682b36f2bac91fd63acca9c895f14806 100644 (file)
@@ -507,6 +507,12 @@ struct mips_cpu_info {
       if (TARGET_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)                                           \
        {                                                               \
          builtin_define_std ("MIPSEB");                                \
@@ -743,6 +749,7 @@ struct mips_cpu_info {
    --with-abi is ignored if -mabi is specified.
    --with-float is ignored if -mhard-float or -msoft-float are
      specified.
+   --with-nan is ignored if -mnan is specified.
    --with-divide is ignored if -mdivide-traps or -mdivide-breaks are
      specified. */
 #define OPTION_DEFAULT_SPECS \
@@ -755,6 +762,7 @@ struct mips_cpu_info {
   {"abi", "%{!mabi=*:-mabi=%(VALUE)}" }, \
   {"float", "%{!msoft-float:%{!mhard-float:-m%(VALUE)-float}}" }, \
   {"fpu", "%{!msingle-float:%{!mdouble-float:-m%(VALUE)-float}}" }, \
+  {"nan", "%{!mnan=*:-mnan=%(VALUE)}" }, \
   {"divide", "%{!mdivide-traps:%{!mdivide-breaks:-mdivide-%(VALUE)}}" }, \
   {"llsc", "%{!mllsc:%{!mno-llsc:-m%(VALUE)}}" }, \
   {"mips-plt", "%{!mplt:%{!mno-plt:-m%(VALUE)}}" }, \
@@ -1160,7 +1168,7 @@ struct mips_cpu_info {
 %(subtarget_asm_debugging_spec) \
 %{mabi=*} %{!mabi=*: %(asm_abi_default_spec)} \
 %{mgp32} %{mgp64} %{march=*} %{mxgot:-xgot} \
-%{mfp32} %{mfp64} \
+%{mfp32} %{mfp64} %{mnan=*} \
 %{mshared} %{mno-shared} \
 %{msym32} %{mno-sym32} \
 %{mtune=*} \
@@ -2897,6 +2905,10 @@ while (0)
 #define HAVE_AS_TLS 0
 #endif
 
+#ifndef HAVE_AS_NAN
+#define HAVE_AS_NAN 0
+#endif
+
 #ifndef USED_FOR_TARGET
 /* Information about ".set noFOO; ...; .set FOO" blocks.  */
 struct mips_asm_switch {
index ca79a31e29ac9f67ab8bf78e4bc30eba1a2ac0ef..397c40ab1801908bddf8d98c52a70522d8d8b1c3 100644 (file)
 ;; Do not use the integer abs macro instruction, since that signals an
 ;; exception on -2147483648 (sigh).
 
-;; abs.fmt is an arithmetic instruction and treats all NaN inputs as
-;; invalid; it does not clear their sign bits.  We therefore can't use
-;; abs.fmt if the signs of NaNs matter.
+;; The "legacy" (as opposed to "2008") form of ABS.fmt is an arithmetic
+;; instruction that treats all NaN inputs as invalid; it does not clear
+;; their sign bit.  We therefore can't use that form if the signs of
+;; NaNs matter.
 
 (define_insn "abs<mode>2"
   [(set (match_operand:ANYF 0 "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"
   [(set_attr "type" "fabs")
    (set_attr "mode" "<UNITMODE>")])
   [(set_attr "alu_type"        "sub")
    (set_attr "mode"    "DI")])
 
-;; neg.fmt is an arithmetic instruction and treats all NaN inputs as
-;; invalid; it does not flip their sign bit.  We therefore can't use
-;; neg.fmt if the signs of NaNs matter.
+;; The "legacy" (as opposed to "2008") form of NEG.fmt is an arithmetic
+;; instruction that treats all NaN inputs as invalid; it does not flip
+;; their sign bit.  We therefore can't use that form if the signs of
+;; NaNs matter.
 
 (define_insn "neg<mode>2"
   [(set (match_operand:ANYF 0 "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"
   [(set_attr "type" "fneg")
    (set_attr "mode" "<UNITMODE>")])
index 08ab29b1810fca5be588e6ff736e0521bd1850e2..0324041dbeaa6fbcd468c31750105c10ae6852d2 100644 (file)
@@ -205,6 +205,24 @@ mfused-madd
 Target Report Mask(FUSED_MADD)
 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
 Target Report RejectNegative InverseMask(64BIT)
 Use 32-bit general registers
index e36a6086c4431e0f5a73345003006b6af4485915..0d6ddaad4f313b1a061f933390ddeda87445e16e 100755 (executable)
@@ -26019,6 +26019,41 @@ $as_echo "$gcc_cv_ld_mips_personality_relaxation" >&6; }
 $as_echo "#define HAVE_LD_PERSONALITY_RELAXATION 1" >>confdefs.h
 
     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
 
index 9dfd389bd986ef7f793d1f36a2818bf18fe9ac95..b279373410a401c137409ae75f648759e3eb34c8 100644 (file)
@@ -4168,6 +4168,17 @@ EOF
       [Define if your linker can relax absolute .eh_frame personality
 pointers into PC-relative form.])
     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
 
index e05cbed9fea121d3f8a03786d1a6bf7afaa7e86d..9e5ba5e66c00cb602aee8e5018f9284635f1373b 100644 (file)
@@ -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.
 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}
 Specify how the compiler should generate code for checking for
 division by zero.  This option is only supported on the MIPS target.
index 445780955a9359e281340ac9971f004b4146c691..92cc25002a34feacf7157c9daf4a88fb5e598e41 100644 (file)
@@ -750,7 +750,8 @@ Objective-C and Objective-C++ Dialects}.
 -mabi=@var{abi}  -mabicalls  -mno-abicalls @gol
 -mshared  -mno-shared  -mplt  -mno-plt  -mxgot  -mno-xgot @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
 -mmcu -mmno-mcu @gol
 -meva -mno-eva @gol
@@ -16324,6 +16325,48 @@ operations.
 Assume that the floating-point coprocessor supports double-precision
 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
 @itemx -mno-llsc
 @opindex mllsc
index 8082e4a159c000d986479db83bb7a7c620f58328..7c022b708263ee0948b83bf3485579573aa0560e 100644 (file)
@@ -1,3 +1,23 @@
+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>
            Maxim Kuvyrkov  <maxim@kugelworks.com>
 
diff --git a/gcc/testsuite/gcc.target/mips/fabs-2008.c b/gcc/testsuite/gcc.target/mips/fabs-2008.c
new file mode 100644 (file)
index 0000000..f48437d
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-mabs=2008" } */
+
+NOMIPS16 double
+fabs_2008 (double d)
+{
+  return __builtin_fabs (d);
+}
+
+/* { dg-final { scan-assembler "\tabs\.d\t" } } */
diff --git a/gcc/testsuite/gcc.target/mips/fabs-legacy.c b/gcc/testsuite/gcc.target/mips/fabs-legacy.c
new file mode 100644 (file)
index 0000000..af86b85
--- /dev/null
@@ -0,0 +1,10 @@
+/* { 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" } } */
diff --git a/gcc/testsuite/gcc.target/mips/fabsf-2008.c b/gcc/testsuite/gcc.target/mips/fabsf-2008.c
new file mode 100644 (file)
index 0000000..229dae6
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-mabs=2008" } */
+
+NOMIPS16 float
+fabsf_2008 (float f)
+{
+  return __builtin_fabsf (f);
+}
+
+/* { dg-final { scan-assembler "\tabs\.s\t" } } */
diff --git a/gcc/testsuite/gcc.target/mips/fabsf-legacy.c b/gcc/testsuite/gcc.target/mips/fabsf-legacy.c
new file mode 100644 (file)
index 0000000..453a069
--- /dev/null
@@ -0,0 +1,10 @@
+/* { 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" } } */
diff --git a/gcc/testsuite/gcc.target/mips/fneg-2008.c b/gcc/testsuite/gcc.target/mips/fneg-2008.c
new file mode 100644 (file)
index 0000000..7d76f45
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-mabs=2008" } */
+
+NOMIPS16 double
+fneg_2008 (double d)
+{
+  return -d;
+}
+
+/* { dg-final { scan-assembler "\tneg\.d\t" } } */
diff --git a/gcc/testsuite/gcc.target/mips/fneg-legacy.c b/gcc/testsuite/gcc.target/mips/fneg-legacy.c
new file mode 100644 (file)
index 0000000..cd1422d
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-mabs=legacy" } */
+
+NOMIPS16 double
+fneg_legacy (double d)
+{
+  return -d;
+}
+
+/* { dg-final { scan-assembler-not "\tneg\.d\t" } } */
diff --git a/gcc/testsuite/gcc.target/mips/fnegf-2008.c b/gcc/testsuite/gcc.target/mips/fnegf-2008.c
new file mode 100644 (file)
index 0000000..72d8ef1
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-mabs=2008" } */
+
+NOMIPS16 float
+fnegf_2008 (float f)
+{
+  return -f;
+}
+
+/* { dg-final { scan-assembler "\tneg\.s\t" } } */
diff --git a/gcc/testsuite/gcc.target/mips/fnegf-legacy.c b/gcc/testsuite/gcc.target/mips/fnegf-legacy.c
new file mode 100644 (file)
index 0000000..946a6ef
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-mabs=legacy" } */
+
+NOMIPS16 float
+fnegf_legacy (float f)
+{
+  return -f;
+}
+
+/* { dg-final { scan-assembler-not "\tneg\.s\t" } } */
index 54c97db2481c6fb713dff1116913b227c2c8d493..f648f0736593863c0a8f349b679c5c8422d501cd 100644 (file)
@@ -276,8 +276,10 @@ foreach option {
 
 # Add -mfoo= options to mips_option_groups.
 foreach option {
+    abs
     branch-cost
     code-readable
+    nan
     r10k-cache-barrier
     tune
 } {
@@ -705,6 +707,18 @@ proc mips-dg-init {} {
            "-msoft-float",
            #endif
 
+           #ifdef __mips_abs2008
+           "-mabs=2008",
+           #else
+           "-mabs=legacy",
+           #endif
+
+           #ifdef __mips_nan2008
+           "-mnan=2008",
+           #else
+           "-mnan=legacy",
+           #endif
+
            #if __mips_fpr == 64
            "-mfp64",
            #else
@@ -826,6 +840,8 @@ proc mips-dg-finish {} {
 #            |                           |
 #         -mfp64                      -mfp32
 #            |                           |
+#         -mabs=2008/-mabs=legacy     <no option>
+#            |                           |
 #         -mhard-float                -msoft-float
 #            |                           |
 #         -mno-sym32                  -msym32
@@ -913,6 +929,8 @@ proc mips-dg-options { args } {
     mips_option_dependency options "-mips3d" "-mpaired-single"
     mips_option_dependency options "-mpaired-single" "-mfp64"
     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" "-mabicalls"
     mips_option_dependency options "-mrelax-pic-calls" "-mexplicit-relocs"
diff --git a/gcc/testsuite/gcc.target/mips/nan-2008.c b/gcc/testsuite/gcc.target/mips/nan-2008.c
new file mode 100644 (file)
index 0000000..b31299d
--- /dev/null
@@ -0,0 +1,7 @@
+/* { 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" } } */
diff --git a/gcc/testsuite/gcc.target/mips/nan-legacy.c b/gcc/testsuite/gcc.target/mips/nan-legacy.c
new file mode 100644 (file)
index 0000000..8ae7166
--- /dev/null
@@ -0,0 +1,7 @@
+/* { 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" } } */
diff --git a/gcc/testsuite/gcc.target/mips/nanf-2008.c b/gcc/testsuite/gcc.target/mips/nanf-2008.c
new file mode 100644 (file)
index 0000000..6c5bd7b
--- /dev/null
@@ -0,0 +1,7 @@
+/* { 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" } } */
diff --git a/gcc/testsuite/gcc.target/mips/nanf-legacy.c b/gcc/testsuite/gcc.target/mips/nanf-legacy.c
new file mode 100644 (file)
index 0000000..b13d339
--- /dev/null
@@ -0,0 +1,7 @@
+/* { 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" } } */
diff --git a/gcc/testsuite/gcc.target/mips/nans-2008.c b/gcc/testsuite/gcc.target/mips/nans-2008.c
new file mode 100644 (file)
index 0000000..b75fc28
--- /dev/null
@@ -0,0 +1,7 @@
+/* { 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" } } */
diff --git a/gcc/testsuite/gcc.target/mips/nans-legacy.c b/gcc/testsuite/gcc.target/mips/nans-legacy.c
new file mode 100644 (file)
index 0000000..45fab68
--- /dev/null
@@ -0,0 +1,7 @@
+/* { 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" } } */
diff --git a/gcc/testsuite/gcc.target/mips/nansf-2008.c b/gcc/testsuite/gcc.target/mips/nansf-2008.c
new file mode 100644 (file)
index 0000000..d6c86a8
--- /dev/null
@@ -0,0 +1,7 @@
+/* { 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" } } */
diff --git a/gcc/testsuite/gcc.target/mips/nansf-legacy.c b/gcc/testsuite/gcc.target/mips/nansf-legacy.c
new file mode 100644 (file)
index 0000000..27c480f
--- /dev/null
@@ -0,0 +1,7 @@
+/* { 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" } } */