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 Mon, 8 Jul 2013, Richard Sandiford wrote:

> >  * 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::		Directives to mark IEEE 754 NaN data encoding
> >  * MIPS Option Stack::	Directives to save and restore options
> >  * MIPS ASE Instruction Generation Overrides:: Directives to control
> >    			generation of MIPS ASE instructions
> 
> Please use:
> 
> MIPS NaN Encodings::	Directives to record which NaN encoding is being used

 OK.

> > +  /* 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
> > +			   ? "2008 NaN" : "legacy NaN"),
> > +			  (old_flags & EF_MIPS_NAN2008
> > +			   ? "2008 NaN" : "legacy NaN"));
> 
> For translation, I think this should be:
> 
>       _bfd_error_handler (_("%B: linking %s-NaN module with previous %s-NaN modules"),
> 			  ibfd,
> 			  new_flags & EF_MIPS_NAN2008 ? "2008" : "legacy",
> 			  old_flags & EF_MIPS_NAN2008 ? "2008" : "legacy");
> 
> or:
> 
>       _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"));
> 
> etc.  I'd prefer the latter FWIW.  Even though it's possible to have a
> link in which ".nan" was used and "-mnan" never was, I think in practice
> the command-line option will have been involved somewhere, and quoting
> commnd-line options seems more user-friendly.

 OK (otherwise "legacy" would IMHO require translation too).

> > @@ -416,6 +417,48 @@ 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=@var{encoding}} command line option, MIPS
> > +@item -mnan=@var{encoding}
> > +This options controls the encoding of the special not-a-number (NaN)
> > +IEEE 754 floating-point symbolic data.
> > +
> > +By default @option{-mnan=legacy} or the legacy encoding is selected.  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.
> > +
> > +@sc{gnu} @code{@value{AS}} does not produce NaNs itself and therefore this
> > +option does not affect code generated.  Instead it is used, in combination
> > +with the @code{.nan} directive (@pxref{MIPS nan}), to control link-time
> > +compatibility of ELF object files, by setting the @code{NAN2008} ELF file
> > +header flag as appropriate.
> > +
> > +In the absence of a @code{.nan} directive to set the @code{NAN2008} ELF
> > +file header flag in a file being assembled the option is processed as
> > +follows:
> > +
> > +@itemize @bullet
> > +@item
> > +for maximum backwards compatibility, by default or in the presence of
> > +the @option{-mnan=legacy} option the @code{NAN2008} ELF file header flag
> > +is cleared, marking the object file compatible with objects that use the
> > +legacy NaN encoding,
> > +@item
> > +in the presence of the @option{-mnan=2008} option the @code{NAN2008} ELF
> > +file header flag is set, marking the object file compatible with objects
> > +that use the IEEE 754-2008 NaN encoding.
> > +@end itemize
> > +
> > +In the presence of a @code{.nan} directive to set the @code{NAN2008} ELF
> > +file header flag a file being assembled, the effective (last) value
> > +requested with the directive overrides any setting requested with the
> > +@option{-mnan=@var{encoding}} option.
> 
> Let's make this a bit shorter, something like:
> 
> --------------------------------------------------------------------------
> 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.
> --------------------------------------------------------------------------

 Quite a bit sorter!  However the directive does not have to be at the 
beginning (the setting cannot be flipped so the last one wins).  I have 
therefore removed "the beginning of".  I have shortened the index entry 
too, to follow our usual format.

> > +@cindex MIPS IEEE 754 NaN data encoding selection
> > +@kindex @code{.nan legacy}
> > +@kindex @code{.nan 2008}
> > +These directives control the encoding of the special not-a-number (NaN)
> > +IEEE 754 floating-point symbolic data.
> 
> IMO "values" reads better than "symbolic data".  (IEEE754 itself refers
> to them as "values".)

 You may not like the wording, which I think is a matter of personal 
taste, but you're wrong as to IEEE 754:

"2.1.35 NaN: not a number -- a symbolic floating-point datum. [...]"

(in the Definitions section) and the document seems to carefully avoid the 
use of "value" in the context of NaNs (quite understandingly, as these 
entities are the opposite of values).

 Also:

"2.1.27 format: A set of representations of numerical values and symbols, 
perhaps accompanied by an encoding."

-- i.e. the standard makes a clear distinction between values and symbols 
and I think our documentation should follow the formal standard.

> But we can't really start the section like this, because the @kindex
> lines only insert index entries.  Nothing appears inline.  I'd suggest:

 I can see this:

"
9.27.9 Directives to mark IEEE 754 NaN data encoding
----------------------------------------------------

These directives control the encoding of the special not-a-number (NaN)
IEEE 754 floating-point symbolic data.
"

in output -- you may or may not like it, but I think that's a matter of 
personal taste.  What's wrong with that that makes you assert that "we 
can't really start the section like this?"

> --------------------------------------------------------------------------
> The IEEE 754 floating-point standard defines two types of not-a-number
> (NaN) value: ``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 an uncoming release of the MIPS architecture will therefore support

 Typo aside it is not true that it is an "upcoming release", because as of 
the 3.50 version of the architecture manuals (MD00082, MD00083) released 
Sep 2012 this is already the currently established MIPS architecture 
standard.  Please note that this is an optional feature -- CP1.FIR.HAS2008 
is optional, as is the ability to set CP1.FCSR.NAN2008 to 1 even if the 
former is set, e.g. an implementation could only support ABS2008, but not 
NAN2008.

> 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 2008} and @samp{.nan legacy} 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.
> --------------------------------------------------------------------------
> 
> ...which I'm sure needs some copy-editing and tweaking.

 So I have applied my notes to your proposal and made sure lines fit in 74 
columns, that I gather is our usual limit in documentation.  I have 
reshaped the index entries too, folded the two .nan entries into one to 
follow our usual practice and made it @cindex rather than @kindex, because 
if the latter is used, then @code renders incorrectly in PDF for some 
reason ("}" appears ignored and code formatting is applied up to the end 
of line).

> Looks good otherwise, thanks.  OK with those changes if you're happy with
> them, otherwise let me know.

 Well, the outcome is not your proposal verbatim, so here it is just in 
case you had further concerns.  OK to apply in this form?

2013-07-11  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 16:40:09.210884693 +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 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) symbolic 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 2008} and @samp{.nan legacy}
+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]