diff options
author | Maciej W. Rozycki <macro@linux-mips.org> | 2013-07-12 15:58:15 +0000 |
---|---|---|
committer | Maciej W. Rozycki <macro@linux-mips.org> | 2013-07-12 15:58:15 +0000 |
commit | ba92f8875272b3d30872644d5305868ff4d047b8 (patch) | |
tree | 77c84c712c3409bc45868cdb86a58a00e95760fb /gas | |
parent | 627e05482b7a540b8453a196d03e15cce03a4e40 (diff) | |
download | gdb-ba92f8875272b3d30872644d5305868ff4d047b8.zip gdb-ba92f8875272b3d30872644d5305868ff4d047b8.tar.gz gdb-ba92f8875272b3d30872644d5305868ff4d047b8.tar.bz2 |
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.
Diffstat (limited to 'gas')
23 files changed, 238 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 480181f..10bcdda 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2013-07-12 Maciej W. Rozycki <macro@codesourcery.com> + + * 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. + 2013-07-09 Tristan Gingold <gingold@adacore.com> * configure.com: Define HAVE_SYS_TYPES_H and HAVE_UNISTD_H diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 22ba44a..7fb870e 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -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, @@ -1310,6 +1313,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); @@ -1441,6 +1445,7 @@ enum options OPTION_PDR, OPTION_NO_PDR, OPTION_MVXWORKS_PIC, + OPTION_NAN, OPTION_END_OF_ENUM }; @@ -1556,6 +1561,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} }; @@ -1680,6 +1686,7 @@ static const pseudo_typeS mips_pseudo_table[] = {"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. */ @@ -15262,6 +15269,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; } @@ -17152,6 +17171,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 @@ -18751,6 +18794,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)) @@ -19588,8 +19634,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\ diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index d1e397f..a2771d7 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -402,6 +402,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}. [@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 the relaxation of out-of-range 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 diff --git a/gas/doc/c-mips.texi b/gas/doc/c-mips.texi index 741237a..8a25a76 100644 --- a/gas/doc/c-mips.texi +++ b/gas/doc/c-mips.texi @@ -30,6 +30,7 @@ Assembly Language Programming'' in the same work. * 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 @@ baz: @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 diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 8deb0d7..882bcc6 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,24 @@ +2013-07-12 Maciej W. Rozycki <macro@codesourcery.com> + + * 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. + 2013-07-09 Richard Sandiford <rdsandiford@googlemail.com> * gas/mips/la-reloc.s, gas/mips/la-reloc.d, gas/mips/dla-reloc.s, diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp index 673b1d7..73127dd 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -915,6 +915,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" } diff --git a/gas/testsuite/gas/mips/nan-2008-1.d b/gas/testsuite/gas/mips/nan-2008-1.d new file mode 100644 index 0000000..3649fd2 --- /dev/null +++ b/gas/testsuite/gas/mips/nan-2008-1.d @@ -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[],].* diff --git a/gas/testsuite/gas/mips/nan-2008-2.d b/gas/testsuite/gas/mips/nan-2008-2.d new file mode 100644 index 0000000..e8a07ce --- /dev/null +++ b/gas/testsuite/gas/mips/nan-2008-2.d @@ -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[],].* diff --git a/gas/testsuite/gas/mips/nan-2008-3.d b/gas/testsuite/gas/mips/nan-2008-3.d new file mode 100644 index 0000000..7c3c4a3 --- /dev/null +++ b/gas/testsuite/gas/mips/nan-2008-3.d @@ -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[],].* diff --git a/gas/testsuite/gas/mips/nan-2008-4.d b/gas/testsuite/gas/mips/nan-2008-4.d new file mode 100644 index 0000000..22ba87f --- /dev/null +++ b/gas/testsuite/gas/mips/nan-2008-4.d @@ -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[],].* diff --git a/gas/testsuite/gas/mips/nan-2008-override.s b/gas/testsuite/gas/mips/nan-2008-override.s new file mode 100644 index 0000000..ec6d6b8 --- /dev/null +++ b/gas/testsuite/gas/mips/nan-2008-override.s @@ -0,0 +1,2 @@ + .nan legacy + .nan 2008 diff --git a/gas/testsuite/gas/mips/nan-2008.s b/gas/testsuite/gas/mips/nan-2008.s new file mode 100644 index 0000000..9a3875e --- /dev/null +++ b/gas/testsuite/gas/mips/nan-2008.s @@ -0,0 +1 @@ + .nan 2008 diff --git a/gas/testsuite/gas/mips/nan-error-1.l b/gas/testsuite/gas/mips/nan-error-1.l new file mode 100644 index 0000000..470bf9c --- /dev/null +++ b/gas/testsuite/gas/mips/nan-error-1.l @@ -0,0 +1,2 @@ +.*\.s: Assembler messages: +.*\.s:1: Error: Bad .nan directive diff --git a/gas/testsuite/gas/mips/nan-error-1.s b/gas/testsuite/gas/mips/nan-error-1.s new file mode 100644 index 0000000..c6f64c3 --- /dev/null +++ b/gas/testsuite/gas/mips/nan-error-1.s @@ -0,0 +1 @@ + .nan foo diff --git a/gas/testsuite/gas/mips/nan-error-2.l b/gas/testsuite/gas/mips/nan-error-2.l new file mode 100644 index 0000000..2182615 --- /dev/null +++ b/gas/testsuite/gas/mips/nan-error-2.l @@ -0,0 +1,2 @@ +Assembler messages: +Fatal error: Invalid NaN setting -mnan=foo diff --git a/gas/testsuite/gas/mips/nan-error-2.s b/gas/testsuite/gas/mips/nan-error-2.s new file mode 100644 index 0000000..dc87e66 --- /dev/null +++ b/gas/testsuite/gas/mips/nan-error-2.s @@ -0,0 +1 @@ +# No contents necessary. diff --git a/gas/testsuite/gas/mips/nan-legacy-1.d b/gas/testsuite/gas/mips/nan-legacy-1.d new file mode 100644 index 0000000..4dcb93c --- /dev/null +++ b/gas/testsuite/gas/mips/nan-legacy-1.d @@ -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[]].* diff --git a/gas/testsuite/gas/mips/nan-legacy-2.d b/gas/testsuite/gas/mips/nan-legacy-2.d new file mode 100644 index 0000000..6ad4dce --- /dev/null +++ b/gas/testsuite/gas/mips/nan-legacy-2.d @@ -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[]].* diff --git a/gas/testsuite/gas/mips/nan-legacy-3.d b/gas/testsuite/gas/mips/nan-legacy-3.d new file mode 100644 index 0000000..649f0ee --- /dev/null +++ b/gas/testsuite/gas/mips/nan-legacy-3.d @@ -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[]].* diff --git a/gas/testsuite/gas/mips/nan-legacy-4.d b/gas/testsuite/gas/mips/nan-legacy-4.d new file mode 100644 index 0000000..3dc00cb --- /dev/null +++ b/gas/testsuite/gas/mips/nan-legacy-4.d @@ -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[]].* diff --git a/gas/testsuite/gas/mips/nan-legacy-5.d b/gas/testsuite/gas/mips/nan-legacy-5.d new file mode 100644 index 0000000..db3a954 --- /dev/null +++ b/gas/testsuite/gas/mips/nan-legacy-5.d @@ -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[]].* diff --git a/gas/testsuite/gas/mips/nan-legacy-override.s b/gas/testsuite/gas/mips/nan-legacy-override.s new file mode 100644 index 0000000..64b2c82 --- /dev/null +++ b/gas/testsuite/gas/mips/nan-legacy-override.s @@ -0,0 +1,2 @@ + .nan 2008 + .nan legacy diff --git a/gas/testsuite/gas/mips/nan-legacy.s b/gas/testsuite/gas/mips/nan-legacy.s new file mode 100644 index 0000000..4c299f8 --- /dev/null +++ b/gas/testsuite/gas/mips/nan-legacy.s @@ -0,0 +1 @@ + .nan legacy |