This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] MIPS: IEEE 754-2008 NaN encoding features


On Thu, 11 Jul 2013, Richard Sandiford wrote:

> If it effectively came at the end then the command-line option would
> take precedence over any ".nan" directives in the source file.

 Yes, you're right.  I have no idea why I got it confused, sorry.

> We use the same wording elsewhere, so I hadn't realised this would
> be so controversial.  Naybe I should have stuck to my guns about
> making it an error when the command-line option and directive are
> both used but contradict one another.
> 
> How about:
> 
> +This option indicates whether the source code uses the IEEE 2008
> +NaN encoding (@option{-mnan=2008}) or the original MIPS encoding
> +(@option{-mnan=legacy}).  It only has an effect when the source
> +file contains no @code{.nan} directive.  @xref{MIPS NaN Encodings}.
> +
> +@option{-mnan=legacy} is the default if no @option{-mnan} option or
> +@code{.nan} directive is used.
> 
> instead?

 Thanks, however your original proposal was equally good and, as you've 
noted, consistent with wording elsewhere so I chose it instead.  For the 
record, here's the final version of this change that I applied.

 Thanks for your review (and patience).

2013-07-12  Maciej W. Rozycki  <macro@codesourcery.com>

	include/elf/
	* mips.h (EF_MIPS_NAN2008): New macro.

	bfd/
	* elfxx-mips.c (_bfd_mips_elf_merge_private_bfd_data): Handle
	EF_MIPS_NAN2008.
	(_bfd_mips_elf_print_private_bfd_data): Likewise.

	binutils/
	* readelf.c (get_machine_flags): Handle EF_MIPS_NAN2008.

	gas/
	* config/tc-mips.c (mips_flag_nan2008): New variable.
	(options): Add OPTION_NAN enum value.
	(md_longopts): Handle it.
	(md_parse_option): Likewise.
	(s_nan): New function.
	(mips_elf_final_processing): Handle EF_MIPS_NAN2008.
	(md_show_usage): Add -mnan.

	* doc/as.texinfo (Overview): Add -mnan.
	* doc/c-mips.texi (MIPS Opts): Document -mnan.
	(MIPS NaN Encodings): New node.  Document .nan directive.
	(MIPS-Dependent): List the new node.

	gas/testsuite/
	* gas/mips/nan-2008-1.d: New test.
	* gas/mips/nan-2008-2.d: New test.
	* gas/mips/nan-2008-3.d: New test.
	* gas/mips/nan-2008-4.d: New test.
	* gas/mips/nan-legacy-1.d: New test.
	* gas/mips/nan-legacy-2.d: New test.
	* gas/mips/nan-legacy-3.d: New test.
	* gas/mips/nan-legacy-4.d: New test.
	* gas/mips/nan-legacy-5.d: New test.
	* gas/mips/nan-error-1.l: New list test.
	* gas/mips/nan-error-2.l: New list test.
	* gas/mips/nan-2008-override.s: New test source.
	* gas/mips/nan-2008.s: New test source.
	* gas/mips/nan-legacy-override.s: New test source.
	* gas/mips/nan-legacy.s: New test source.
	* gas/mips/nan-error-1.s: New test source.
	* gas/mips/nan-error-2.s: New test source.
	* gas/mips/mips.exp: Run the new tests.

	ld/testsuite/
	* ld-mips-elf/nan-2008.d: New test.
	* ld-mips-elf/nan-legacy.d: New test.
	* ld-mips-elf/nan-mixed-1.d: New test.
	* ld-mips-elf/nan-mixed-2.d: New test.
	* ld-mips-elf/nan-2008.s: New test source.
	* ld-mips-elf/nan-legacy.s: New test source.

  Maciej

binutils-mips-nan2008.diff
Index: binutils-fsf-trunk-quilt/bfd/elfxx-mips.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/bfd/elfxx-mips.c	2013-07-08 13:07:31.000000000 +0100
+++ binutils-fsf-trunk-quilt/bfd/elfxx-mips.c	2013-07-11 01:12:40.170866194 +0100
@@ -14730,6 +14730,20 @@ _bfd_mips_elf_merge_private_bfd_data (bf
       old_flags &= ~ EF_MIPS_ARCH_ASE;
     }
 
+  /* Compare NaN encodings.  */
+  if ((new_flags & EF_MIPS_NAN2008) != (old_flags & EF_MIPS_NAN2008))
+    {
+      _bfd_error_handler (_("%B: linking %s module with previous %s modules"),
+			  ibfd,
+			  (new_flags & EF_MIPS_NAN2008
+			   ? "-mnan=2008" : "-mnan=legacy"),
+			  (old_flags & EF_MIPS_NAN2008
+			   ? "-mnan=2008" : "-mnan=legacy"));
+      ok = FALSE;
+      new_flags &= ~EF_MIPS_NAN2008;
+      old_flags &= ~EF_MIPS_NAN2008;
+    }
+
   /* Warn about any other mismatches */
   if (new_flags != old_flags)
     {
@@ -14921,6 +14935,9 @@ _bfd_mips_elf_print_private_bfd_data (bf
   if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
     fprintf (file, " [micromips]");
 
+  if (elf_elfheader (abfd)->e_flags & EF_MIPS_NAN2008)
+    fprintf (file, " [nan2008]");
+
   if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
     fprintf (file, " [32bitmode]");
   else
Index: binutils-fsf-trunk-quilt/binutils/readelf.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/binutils/readelf.c	2013-07-08 13:07:31.000000000 +0100
+++ binutils-fsf-trunk-quilt/binutils/readelf.c	2013-07-08 13:07:34.300922755 +0100
@@ -2568,6 +2568,9 @@ get_machine_flags (unsigned e_flags, uns
 	  if (e_flags & EF_MIPS_32BITMODE)
 	    strcat (buf, ", 32bitmode");
 
+	  if (e_flags & EF_MIPS_NAN2008)
+	    strcat (buf, ", nan2008");
+
 	  switch ((e_flags & EF_MIPS_MACH))
 	    {
 	    case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
Index: binutils-fsf-trunk-quilt/gas/config/tc-mips.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/gas/config/tc-mips.c	2013-07-08 13:07:31.000000000 +0100
+++ binutils-fsf-trunk-quilt/gas/config/tc-mips.c	2013-07-08 16:18:00.819980773 +0100
@@ -272,6 +272,9 @@ static int file_mips_soft_float = 0;
 /* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
 static int file_mips_single_float = 0;
 
+/* True if -mnan=2008, false if -mnan=legacy.  */
+static bfd_boolean mips_flag_nan2008 = FALSE;
+
 static struct mips_set_options mips_opts =
 {
   /* isa */ ISA_UNKNOWN, /* ase */ 0, /* mips16 */ -1, /* micromips */ -1,
@@ -1321,6 +1324,7 @@ static void s_gpdword (int);
 static void s_ehword (int);
 static void s_cpadd (int);
 static void s_insn (int);
+static void s_nan (int);
 static void md_obj_begin (void);
 static void md_obj_end (void);
 static void s_mips_ent (int);
@@ -1452,6 +1456,7 @@ enum options
     OPTION_PDR,
     OPTION_NO_PDR,
     OPTION_MVXWORKS_PIC,
+    OPTION_NAN,
     OPTION_END_OF_ENUM
   };
 
@@ -1567,6 +1572,7 @@ struct option md_longopts[] =
   {"mpdr", no_argument, NULL, OPTION_PDR},
   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
+  {"mnan", required_argument, NULL, OPTION_NAN},
 
   {NULL, no_argument, NULL, 0}
 };
@@ -1691,6 +1697,7 @@ static const pseudo_typeS mips_pseudo_ta
   {"ehword", s_ehword, 0},
   {"cpadd", s_cpadd, 0},
   {"insn", s_insn, 0},
+  {"nan", s_nan, 0},
 
   /* Relatively generic pseudo-ops that happen to be used on MIPS
      chips.  */
@@ -15357,6 +15364,18 @@ md_parse_option (int c, char *arg)
       mips_pic = VXWORKS_PIC;
       break;
 
+    case OPTION_NAN:
+      if (strcmp (arg, "2008") == 0)
+	mips_flag_nan2008 = TRUE;
+      else if (strcmp (arg, "legacy") == 0)
+	mips_flag_nan2008 = FALSE;
+      else
+	{
+	  as_fatal (_("Invalid NaN setting -mnan=%s"), arg);
+	  return 0;
+	}
+      break;
+
     default:
       return 0;
     }
@@ -17247,6 +17266,30 @@ s_insn (int ignore ATTRIBUTE_UNUSED)
   demand_empty_rest_of_line ();
 }
 
+/* Handle the .nan pseudo-op.  */
+
+static void
+s_nan (int ignore ATTRIBUTE_UNUSED)
+{
+  static const char str_legacy[] = "legacy";
+  static const char str_2008[] = "2008";
+  size_t i;
+
+  for (i = 0; !is_end_of_line[(unsigned char) input_line_pointer[i]]; i++);
+
+  if (i == sizeof (str_2008) - 1
+      && memcmp (input_line_pointer, str_2008, i) == 0)
+    mips_flag_nan2008 = TRUE;
+  else if (i == sizeof (str_legacy) - 1
+	   && memcmp (input_line_pointer, str_legacy, i) == 0)
+    mips_flag_nan2008 = FALSE;
+  else
+    as_bad (_("Bad .nan directive"));
+
+  input_line_pointer += i;
+  demand_empty_rest_of_line ();
+}
+
 /* Handle a .stab[snd] directive.  Ideally these directives would be
    implemented in a transparent way, so that removing them would not
    have any effect on the generated instructions.  However, s_stab
@@ -18846,6 +18889,9 @@ mips_elf_final_processing (void)
   if (mips_32bitmode)
     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
 
+  if (mips_flag_nan2008)
+    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NAN2008;
+
 #if 0 /* XXX FIXME */
   /* 32 bit code with 64 bit FP registers.  */
   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
@@ -19683,8 +19729,16 @@ MIPS options:\n\
 -msingle-float		only allow 32-bit floating-point operations\n\
 -mdouble-float		allow 32-bit and 64-bit floating-point operations\n\
 --[no-]construct-floats	[dis]allow floating point values to be constructed\n\
---[no-]relax-branch	[dis]allow out-of-range branches to be relaxed\n"
-		     ));
+--[no-]relax-branch	[dis]allow out-of-range branches to be relaxed\n\
+-mnan=ENCODING		select an IEEE 754 NaN encoding convention, either of:\n"));
+
+  first = 1;
+
+  show (stream, "legacy", &column, &first);
+  show (stream, "2008", &column, &first);
+
+  fputc ('\n', stream);
+
   fprintf (stream, _("\
 -KPIC, -call_shared	generate SVR4 position independent code\n\
 -call_nonpic		generate non-PIC code that can operate with DSOs\n\
Index: binutils-fsf-trunk-quilt/gas/doc/as.texinfo
===================================================================
--- binutils-fsf-trunk-quilt.orig/gas/doc/as.texinfo	2013-07-08 13:07:31.000000000 +0100
+++ binutils-fsf-trunk-quilt/gas/doc/as.texinfo	2013-07-08 13:07:34.300922755 +0100
@@ -402,6 +402,7 @@ gcc(1), ld(1), and the Info entries for 
    [@b{-mips3}] [@b{-mips4}] [@b{-mips5}] [@b{-mips32}] [@b{-mips32r2}]
    [@b{-mips64}] [@b{-mips64r2}]
    [@b{-construct-floats}] [@b{-no-construct-floats}]
+   [@b{-mnan=@var{encoding}}]
    [@b{-trap}] [@b{-no-break}] [@b{-break}] [@b{-no-trap}]
    [@b{-mips16}] [@b{-no-mips16}]
    [@b{-mmicromips}] [@b{-mno-micromips}]
@@ -1363,6 +1364,10 @@ The @samp{--relax-branch} option enables
 branches.  By default @samp{--no-relax-branch} is selected, causing any
 out-of-range branches to produce an error.
 
+@item -mnan=@var{encoding}
+Select between the IEEE 754-2008 (@option{-mnan=2008}) or the legacy
+(@option{-mnan=legacy}) NaN encoding format.  The latter is the default.
+
 @cindex emulation
 @item --emulation=@var{name}
 This option was formerly used to switch between ELF and ECOFF output
Index: binutils-fsf-trunk-quilt/gas/doc/c-mips.texi
===================================================================
--- binutils-fsf-trunk-quilt.orig/gas/doc/c-mips.texi	2013-07-08 13:07:31.000000000 +0100
+++ binutils-fsf-trunk-quilt/gas/doc/c-mips.texi	2013-07-11 23:32:32.830866647 +0100
@@ -30,6 +30,7 @@ Assembly Language Programming'' in the s
 * MIPS assembly options:: Directives to control code generation
 * MIPS autoextend::	Directives for extending MIPS 16 bit instructions
 * MIPS insn::		Directive to mark data as an instruction
+* MIPS NaN Encodings::	Directives to record which NaN encoding is being used
 * MIPS Option Stack::	Directives to save and restore options
 * MIPS ASE Instruction Generation Overrides:: Directives to control
   			generation of MIPS ASE instructions
@@ -416,6 +417,16 @@ Also no MIPS16 branches are ever relaxed
 By default @samp{--no-relax-branch} is selected, causing any out-of-range
 branches to produce an error.
 
+@cindex @option{-mnan=} command line option, MIPS
+@item -mnan=@var{encoding}
+This option indicates whether the source code uses the IEEE 2008
+NaN encoding (@option{-mnan=2008}) or the original MIPS encoding
+(@option{-mnan=legacy}).  It is equivalent to adding a @code{.nan}
+directive to the beginning of the source file.  @xref{MIPS NaN Encodings}.
+
+@option{-mnan=legacy} is the default if no @option{-mnan} option or
+@code{.nan} directive is used.
+
 @item --trap
 @itemx --no-break
 @c FIXME!  (1) reflect these options (next item too) in option summaries;
@@ -722,6 +733,47 @@ to be a code section, then the symbol wi
 
 @end example
 
+@node MIPS NaN Encodings
+@section Directives to record which NaN encoding is being used
+
+@cindex MIPS IEEE 754 NaN data encoding selection
+@cindex @code{.nan} directive, MIPS
+The IEEE 754 floating-point standard defines two types of not-a-number
+(NaN) data: ``signalling'' NaNs and ``quiet'' NaNs.  The original version
+of the standard did not specify how these two types should be
+distinguished.  Most implementations followed the i387 model, in which
+the first bit of the significand is set for quiet NaNs and clear for
+signalling NaNs.  However, the original MIPS implementation assigned the
+opposite meaning to the bit, so that it was set for signalling NaNs and
+clear for quiet NaNs.
+
+The 2008 revision of the standard formally suggested the i387 choice
+and as from Sep 2012 the current release of the MIPS architecture
+therefore optionally supports that form.  Code that uses one NaN encoding
+would usually be incompatible with code that uses the other NaN encoding,
+so MIPS ELF objects have a flag (@code{EF_MIPS_NAN2008}) to record which
+encoding is being used.
+
+Assembly files can use the @code{.nan} directive to select between the
+two encodings.  @samp{.nan 2008} says that the assembly file uses the
+IEEE 754-2008 encoding while @samp{.nan legacy} says that the file uses
+the original MIPS encoding.  If several @code{.nan} directives are given,
+the final setting is the one that is used.
+
+The command-line options @option{-mnan=legacy} and @option{-mnan=2008}
+can be used instead of @samp{.nan legacy} and @samp{.nan 2008}
+respectively.  However, any @code{.nan} directive overrides the
+command-line setting.
+
+@samp{.nan legacy} is the default if no @code{.nan} directive or
+@option{-mnan} option is given.
+
+Note that @sc{gnu} @code{@value{AS}} does not produce NaNs itself and
+therefore these directives do not affect code generation.  They simply
+control the setting of the @code{EF_MIPS_NAN2008} flag.
+
+Traditional MIPS assemblers do not support these directives.
+
 @node MIPS Option Stack
 @section Directives to save and restore options
 
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/mips.exp
===================================================================
--- binutils-fsf-trunk-quilt.orig/gas/testsuite/gas/mips/mips.exp	2013-07-08 13:07:27.000000000 +0100
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/mips.exp	2013-07-08 13:07:49.300970690 +0100
@@ -914,6 +914,20 @@ if { [istarget mips*-*-vxworks*] } {
     run_dump_test_arches "loc-swap-2"	[mips_arch_list_all]
     run_dump_test_arches "loc-swap-3"	[mips_arch_list_all]
 
+    run_dump_test "nan-legacy-1"
+    run_dump_test "nan-legacy-2"
+    run_dump_test "nan-legacy-3"
+    run_dump_test "nan-legacy-4"
+    run_dump_test "nan-legacy-5"
+
+    run_dump_test "nan-2008-1"
+    run_dump_test "nan-2008-2"
+    run_dump_test "nan-2008-3"
+    run_dump_test "nan-2008-4"
+
+    run_list_test "nan-error-1"
+    run_list_test "nan-error-2" "-mnan=foo"
+
     if $has_newabi {
 	run_dump_test "n32-consec"
     }
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008-1.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008-1.d	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,6 @@
+#name: MIPS 2008 NaN setting 1
+#source: nan-2008.s
+#objdump: -p
+
+.*:.*file format.*mips.*
+private flags = [0-9a-f]*[4-7c-f]..: .*[[,]nan2008[],].*
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008-2.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008-2.d	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,7 @@
+#name: MIPS 2008 NaN setting 2
+#source: nan-2008.s
+#objdump: -p
+#as: -mnan=legacy
+
+.*:.*file format.*mips.*
+private flags = [0-9a-f]*[4-7c-f]..: .*[[,]nan2008[],].*
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008-3.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008-3.d	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,6 @@
+#name: MIPS 2008 NaN setting 3
+#source: nan-2008-override.s
+#objdump: -p
+
+.*:.*file format.*mips.*
+private flags = [0-9a-f]*[4-7c-f]..: .*[[,]nan2008[],].*
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008-4.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008-4.d	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,7 @@
+#name: MIPS 2008 NaN setting 4
+#source: empty.s
+#objdump: -p
+#as: -mnan=2008
+
+.*:.*file format.*mips.*
+private flags = [0-9a-f]*[4-7c-f]..: .*[[,]nan2008[],].*
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008-override.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008-override.s	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,2 @@
+	.nan	legacy
+	.nan	2008
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-2008.s	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1 @@
+	.nan	2008
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-error-1.l
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-error-1.l	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,2 @@
+.*\.s: Assembler messages:
+.*\.s:1: Error: Bad .nan directive
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-error-1.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-error-1.s	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1 @@
+	.nan	foo
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-error-2.l
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-error-2.l	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,2 @@
+Assembler messages:
+Fatal error: Invalid NaN setting -mnan=foo
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-error-2.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-error-2.s	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1 @@
+# No contents necessary.
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-1.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-1.d	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,7 @@
+#name: MIPS legacy NaN setting 1
+#source: nan-legacy.s
+#objdump: -p
+
+.*:.*file format.*mips.*
+#failif
+private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-2.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-2.d	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,8 @@
+#name: MIPS legacy NaN setting 2
+#source: nan-legacy.s
+#objdump: -p
+#as: -mnan=2008
+
+.*:.*file format.*mips.*
+#failif
+private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-3.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-3.d	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,7 @@
+#name: MIPS legacy NaN setting 3
+#source: nan-legacy-override.s
+#objdump: -p
+
+.*:.*file format.*mips.*
+#failif
+private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-4.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-4.d	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,8 @@
+#name: MIPS legacy NaN setting 4
+#source: empty.s
+#objdump: -p
+#as: -mnan=legacy
+
+.*:.*file format.*mips.*
+#failif
+private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-5.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-5.d	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,7 @@
+#name: MIPS legacy NaN setting 5
+#source: empty.s
+#objdump: -p
+
+.*:.*file format.*mips.*
+#failif
+private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-override.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy-override.s	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1,2 @@
+	.nan	2008
+	.nan	legacy
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/nan-legacy.s	2013-07-08 13:07:49.300970690 +0100
@@ -0,0 +1 @@
+	.nan	legacy
Index: binutils-fsf-trunk-quilt/include/elf/mips.h
===================================================================
--- binutils-fsf-trunk-quilt.orig/include/elf/mips.h	2013-07-08 13:07:31.000000000 +0100
+++ binutils-fsf-trunk-quilt/include/elf/mips.h	2013-07-08 13:07:34.300922755 +0100
@@ -191,6 +191,9 @@ END_RELOC_NUMBERS (R_MIPS_maxext)
    (regs are 32-bits wide).  */
 #define EF_MIPS_32BITMODE	0x00000100
 
+/* Code in file uses the IEEE 754-2008 NaN encoding convention.  */
+#define EF_MIPS_NAN2008		0x00000400
+
 /* Architectural Extensions used by this file */
 #define EF_MIPS_ARCH_ASE	0x0f000000
 
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/mips-elf.exp
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/testsuite/ld-mips-elf/mips-elf.exp	2013-07-08 13:07:27.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/mips-elf.exp	2013-07-08 13:07:49.300970690 +0100
@@ -666,6 +666,11 @@ run_dump_test "attr-gnu-4-44"
 run_dump_test "attr-gnu-4-45"
 run_dump_test "attr-gnu-4-51"
 
+run_dump_test "nan-legacy"
+run_dump_test "nan-2008"
+run_dump_test "nan-mixed-1"
+run_dump_test "nan-mixed-2"
+
 if { $linux_gnu } {
     run_ld_link_tests {
 	{"GOT and versioning 1"
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-2008.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-2008.d	2013-07-08 13:07:49.800921964 +0100
@@ -0,0 +1,7 @@
+#source: nan-2008.s
+#source: nan-2008.s
+#ld: -r
+#objdump: -p
+
+.*:.*file format.*mips.*
+private flags = [0-9a-f]*[4-7c-f]..: .*[[,]nan2008[],].*
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-2008.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-2008.s	2013-07-08 13:07:49.800921964 +0100
@@ -0,0 +1,6 @@
+	.nan	2008
+
+# We need some section contents for the ELF header flag compatibility check
+# to trigger.
+	.data
+	.byte	0
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-legacy.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-legacy.d	2013-07-08 13:07:49.800921964 +0100
@@ -0,0 +1,8 @@
+#source: nan-legacy.s
+#source: nan-legacy.s
+#ld: -r
+#objdump: -p
+
+.*:.*file format.*mips.*
+#failif
+private flags = [0-9a-f]*[4-7c-f]..: .*[[]nan2008[]].*
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-legacy.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-legacy.s	2013-07-08 13:07:49.800921964 +0100
@@ -0,0 +1,6 @@
+	.nan	legacy
+
+# We need some section contents for the ELF header flag compatibility check
+# to trigger.
+	.data
+	.byte	0
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-mixed-1.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-mixed-1.d	2013-07-11 15:39:41.040885557 +0100
@@ -0,0 +1,5 @@
+#source: nan-legacy.s
+#source: nan-2008.s
+#ld: -r
+#error: \A[^\n]*: [^\n]* linking -mnan=2008 module with previous -mnan=legacy modules\n
+#error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z
Index: binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-mixed-2.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/ld/testsuite/ld-mips-elf/nan-mixed-2.d	2013-07-11 15:40:20.040944562 +0100
@@ -0,0 +1,5 @@
+#source: nan-2008.s
+#source: nan-legacy.s
+#ld: -r
+#error: \A[^\n]*: [^\n]* linking -mnan=legacy module with previous -mnan=2008 modules\n
+#error:   [^\n]*: failed to merge target specific data of file [^\n]*\.o\Z


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]