[MIPS/GAS] Add Loongson EXT2 Instructions support.
authorChenghua Xu <paul.hua.gm@gmail.com>
Wed, 29 Aug 2018 12:08:58 +0000 (20:08 +0800)
committerChenghua Xu <paul.hua.gm@gmail.com>
Wed, 29 Aug 2018 12:08:58 +0000 (20:08 +0800)
bfd/
* elfxx-mips.c (print_mips_ases): Add Loongson EXT2 extension.

binutils/
* readelf.c (print_mips_ases): Add Loongson EXT2 extension.

gas/
* NEWS: Mention Loongson EXTensions R2 (EXT2) support.
* config/tc-mips.c (options): Add OPTION_LOONGSON_EXT2 and
OPTION_NO_LOONGSON_EXT2.
(md_longopts): Likewise.
(mips_ases): Define availability for EXT.
(mips_convert_ase_flags): Map ASE_LOONGSON_EXT2 to
AFL_ASE_LOONGSON_EXT2.
(md_show_usage): Add help for -mloongson-ext2 and
-mno-loongson-ext2.
* doc/as.texi: Document -mloongson-ext2, -mno-loongson-ext2.
* doc/c-mips.texi: Document -mloongson-ext2, -mno-loongson-ext2,
.set loongson-ext2 and .set noloongson-ext2.
* testsuite/gas/mips/loongson-ext2.d: New test.
* testsuite/gas/mips/loongson-ext2.s: New test.
* testsuite/gas/mips/mips.exp: Run loongson-ext2 test.

include/
* elf/mips.h (AFL_ASE_LOONGSON_EXT2): New macro.
(AFL_ASE_MASK): Update to include AFL_ASE_LOONGSON_EXT2.
* opcode/mips.h (ASE_LOONGSON_EXT2): New macro.

opcodes/
* mips-dis.c (parse_mips_ase_option): Handle -M loongson-ext
option.
(print_mips_disassembler_options): Document -M loongson-ext.
* mips-opc.c (LEXT2): New macro.
(mips_opcodes): Add cto, ctz, dcto, dctz instructions.

18 files changed:
bfd/ChangeLog
bfd/elfxx-mips.c
binutils/ChangeLog
binutils/readelf.c
gas/ChangeLog
gas/NEWS
gas/config/tc-mips.c
gas/doc/as.texi
gas/doc/c-mips.texi
gas/testsuite/gas/mips/loongson-ext2.d [new file with mode: 0644]
gas/testsuite/gas/mips/loongson-ext2.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips.exp
include/ChangeLog
include/elf/mips.h
include/opcode/mips.h
opcodes/ChangeLog
opcodes/mips-dis.c
opcodes/mips-opc.c

index bf32a6136b3c69942932de1227cbc3886336ebe3..d28ed5b54bb1bd4dff7e90f47401db0cdf0c476c 100644 (file)
@@ -1,3 +1,7 @@
+2018-08-29  Chenghua Xu  <paul.hua.gm@gmail.com>
+
+       * elfxx-mips.c (print_mips_ases): Add Loongson EXT2 extension.
+
 2018-08-29  Chenghua Xu  <paul.hua.gm@gmail.com>
 
         * elfxx-mips.c (infer_mips_abiflags): Use ases instead of
index e4275d7ac7b0b65a80e38f1c255b61aee1f3ce76..8d1e4f2ab16295e5a706d81c2a3fd572630b0a03 100644 (file)
@@ -15681,6 +15681,8 @@ print_mips_ases (FILE *file, unsigned int mask)
     fputs ("\n\tLoongson CAM ASE", file);
   if (mask & AFL_ASE_LOONGSON_EXT)
     fputs ("\n\tLoongson EXT ASE", file);
+  if (mask & AFL_ASE_LOONGSON_EXT2)
+    fputs ("\n\tLoongson EXT2 ASE", file);
   if (mask == 0)
     fprintf (file, "\n\t%s", _("None"));
   else if ((mask & ~AFL_ASE_MASK) != 0)
index 20e9ad025aaa798aaaf65b571215995722146886..21b936c4fd625b2ed8b27b69745e2f01c7545597 100644 (file)
@@ -1,3 +1,7 @@
+2018-08-29  Chenghua Xu  <paul.hua.gm@gmail.com>
+
+       * readelf.c (print_mips_ases): Add Loongson EXT2 extension.
+
 2018-08-29  Chenghua Xu  <paul.hua.gm@gmail.com>
 
         * readelf.c (print_mips_ases): Add Loongson EXT extension.
index 92353c596f4bd2bef7a2bc280ad3a7f472dacda9..8192686f7e671f5cfeb8bf3ffe785ecfd2975c72 100644 (file)
@@ -15655,6 +15655,8 @@ print_mips_ases (unsigned int mask)
     fputs ("\n\tLoongson CAM ASE", stdout);
   if (mask & AFL_ASE_LOONGSON_EXT)
     fputs ("\n\tLoongson EXT ASE", stdout);
+  if (mask & AFL_ASE_LOONGSON_EXT2)
+    fputs ("\n\tLoongson EXT2 ASE", stdout);
   if (mask == 0)
     fprintf (stdout, "\n\t%s", _("None"));
   else if ((mask & ~AFL_ASE_MASK) != 0)
index 94fd28c7fe26ad3bdc244175e1978304d3ff65f9..34efeb525d4a25633a31ec5c93fe8df80da42ff7 100644 (file)
@@ -1,3 +1,21 @@
+2018-08-29  Chenghua Xu  <paul.hua.gm@gmail.com>
+
+       * NEWS: Mention Loongson EXTensions R2 (EXT2) support.
+       * config/tc-mips.c (options): Add OPTION_LOONGSON_EXT2 and
+       OPTION_NO_LOONGSON_EXT2.
+       (md_longopts): Likewise.
+       (mips_ases): Define availability for EXT.
+       (mips_convert_ase_flags): Map ASE_LOONGSON_EXT2 to
+       AFL_ASE_LOONGSON_EXT2.
+       (md_show_usage): Add help for -mloongson-ext2 and
+       -mno-loongson-ext2.
+       * doc/as.texi: Document -mloongson-ext2, -mno-loongson-ext2.
+       * doc/c-mips.texi: Document -mloongson-ext2, -mno-loongson-ext2,
+       .set loongson-ext2 and .set noloongson-ext2.
+       * testsuite/gas/mips/loongson-ext2.d: New test.
+       * testsuite/gas/mips/loongson-ext2.s: New test.
+       * testsuite/gas/mips/mips.exp: Run loongson-ext2 test.
+
 2018-08-29  Chenghua Xu  <paul.hua.gm@gmail.com>
 
         * NEWS: Mention Loongson EXTensions (EXT) support.
index 48854e5434eb72b724388d2de091dff422dcb7f4..d045bbbc726b6f44f25121fe0d16088b59f91c89 100644 (file)
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -1,5 +1,7 @@
 -*- text -*-
 
+* Add support for the MIPS Loongson EXTensions R2 (EXT2) instructions.
+
 * Add support for the MIPS Loongson EXTensions (EXT) instructions.
 
 * Add support for the MIPS Loongson Content Address Memory (CAM) ASE.
index 51eee005786e9839d4d0ed39c75ec638a549de55..e60cf4eeaaa75fd3007f513c8e44a60b720635aa 100644 (file)
@@ -1535,6 +1535,8 @@ enum options
     OPTION_NO_LOONGSON_CAM,
     OPTION_LOONGSON_EXT,
     OPTION_NO_LOONGSON_EXT,
+    OPTION_LOONGSON_EXT2,
+    OPTION_NO_LOONGSON_EXT2,
     OPTION_END_OF_ENUM
   };
 
@@ -1601,6 +1603,8 @@ struct option md_longopts[] =
   {"mno-loongson-cam", no_argument, NULL, OPTION_NO_LOONGSON_CAM},
   {"mloongson-ext", no_argument, NULL, OPTION_LOONGSON_EXT},
   {"mno-loongson-ext", no_argument, NULL, OPTION_NO_LOONGSON_EXT},
+  {"mloongson-ext2", no_argument, NULL, OPTION_LOONGSON_EXT2},
+  {"mno-loongson-ext2", no_argument, NULL, OPTION_NO_LOONGSON_EXT2},
 
   /* Old-style architecture options.  Don't add more of these.  */
   {"m4650", no_argument, NULL, OPTION_M4650},
@@ -1813,6 +1817,11 @@ static const struct mips_ase mips_ases[] = {
     OPTION_LOONGSON_EXT, OPTION_NO_LOONGSON_EXT,
     0, 0, -1, -1,
     -1 },
+
+  { "loongson-ext2", ASE_LOONGSON_EXT | ASE_LOONGSON_EXT2, 0,
+    OPTION_LOONGSON_EXT2, OPTION_NO_LOONGSON_EXT2,
+    0, 0, -1, -1,
+    -1 },
 };
 
 /* The set of ASEs that require -mfp64.  */
@@ -1820,7 +1829,8 @@ static const struct mips_ase mips_ases[] = {
 
 /* Groups of ASE_* flags that represent different revisions of an ASE.  */
 static const unsigned int mips_ase_groups[] = {
-  ASE_DSP | ASE_DSPR2 | ASE_DSPR3
+  ASE_DSP | ASE_DSPR2 | ASE_DSPR3, 
+  ASE_LOONGSON_EXT | ASE_LOONGSON_EXT2 
 };
 \f
 /* Pseudo-op table.
@@ -19050,6 +19060,8 @@ mips_convert_ase_flags (int ase)
     ext_ases |= AFL_ASE_LOONGSON_CAM;
   if (ase & ASE_LOONGSON_EXT)
     ext_ases |= AFL_ASE_LOONGSON_EXT;
+  if (ase & ASE_LOONGSON_EXT2)
+    ext_ases |= AFL_ASE_LOONGSON_EXT2;
 
   return ext_ases;
 }
@@ -20080,6 +20092,9 @@ MIPS options:\n\
 -mloongson-ext         generate Loongson EXTensions (EXT) instructions\n\
 -mno-loongson-ext      do not generate Loongson EXTensions Instructions\n"));
   fprintf (stream, _("\
+-mloongson-ext2                generate Loongson EXTensions R2 (EXT2) instructions\n\
+-mno-loongson-ext2     do not generate Loongson EXTensions R2 Instructions\n"));
+  fprintf (stream, _("\
 -minsn32               only generate 32-bit microMIPS instructions\n\
 -mno-insn32            generate all microMIPS instructions\n"));
   fprintf (stream, _("\
index 92dd3660810c952e4410c50b27af118cb391ee4e..f3285b63eaa04621b1513c6c0a0d9a74f245c74f 100644 (file)
@@ -447,6 +447,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
    [@b{-mloongson-mmi}] [@b{-mno-loongson-mmi}]
    [@b{-mloongson-cam}] [@b{-mno-loongson-cam}]
    [@b{-mloongson-ext}] [@b{-mno-loongson-ext}]
+   [@b{-mloongson-ext2}] [@b{-mno-loongson-ext2}]
    [@b{-minsn32}] [@b{-mno-insn32}]
    [@b{-mfix7000}] [@b{-mno-fix7000}]
    [@b{-mfix-rm7000}] [@b{-mno-fix-rm7000}]
@@ -1587,6 +1588,13 @@ Generate code for the Loongson EXTensions (EXT) instructions.
 This tells the assembler to accept Loongson EXT instructions.
 @samp{-mno-loongson-ext} turns off this option.
 
+@item -mloongson-ext2
+@itemx -mno-loongson-ext2
+Generate code for the Loongson EXTensions R2 (EXT2) instructions.
+This option implies @samp{-mloongson-ext}.
+This tells the assembler to accept Loongson EXT2 instructions.
+@samp{-mno-loongson-ext2} turns off this option.
+
 @item -minsn32
 @itemx -mno-insn32
 Only use 32-bit instruction encodings when generating code for the
index 80b4160efd5aa89ad285d1a01488750d6d1ef6c2..f74e10f4d61219a0a68d18a9187674d580796ae7 100644 (file)
@@ -267,6 +267,13 @@ Application Specific Extension.  This tells the assembler to accept EXT
 instructions.
 @samp{-mno-loongson-ext} turns off this option.
 
+@item -mloongson-ext2
+@itemx -mno-loongson-ext2
+Generate code for the Loongson EXTensions R2 (EXT2) instructions
+Application Specific Extension.  This tells the assembler to accept EXT2
+instructions.
+@samp{-mno-loongson-ext2} turns off this option.
+
 @item -minsn32
 @itemx -mno-insn32
 Only use 32-bit instruction encodings when generating code for the
@@ -1182,6 +1189,15 @@ instructions from the Loongson EXT from that point on in the assembly.
 The @code{.set noloongson-ext} directive prevents Loongson EXT instructions
 from being accepted.
 
+@cindex Loongson EXTensions R2 (EXT2) instructions generation override
+@kindex @code{.set loongson-ext2}
+@kindex @code{.set noloongson-ext2}
+The directive @code{.set loongson-ext2} makes the assembler accept
+instructions from the Loongson EXT2 from that point on in the assembly.
+This directive implies @code{.set loognson-ext}.
+The @code{.set noloongson-ext2} directive prevents Loongson EXT2 instructions
+from being accepted.
+
 Traditional MIPS assemblers do not support these directives.
 
 @node MIPS Floating-Point
diff --git a/gas/testsuite/gas/mips/loongson-ext2.d b/gas/testsuite/gas/mips/loongson-ext2.d
new file mode 100644 (file)
index 0000000..d821386
--- /dev/null
@@ -0,0 +1,28 @@
+#as: -mloongson-ext2 -mabi=64
+#objdump: -M reg-names=numeric -M loongson-ext2 -dp
+#name: Loongson EXT2 tests
+
+.*:     file format .*
+
+private flags = .*
+
+MIPS ABI Flags Version: 0
+ISA: .*
+GPR size: .*
+CPR1 size: .*
+CPR2 size: .*
+FP ABI: .*
+ISA Extension: None
+ASEs:
+       Loongson EXT ASE
+       Loongson EXT2 ASE
+FLAGS 1: .*
+FLAGS 2: .*
+
+Disassembly of section .text:
+
+[0-9a-f]+ <.text>:
+.*:    70801062        cto     \$2,\$4
+.*:    70801022        ctz     \$2,\$4
+.*:    708010e2        dcto    \$2,\$4
+.*:    708010a2        dctz    \$2,\$4
diff --git a/gas/testsuite/gas/mips/loongson-ext2.s b/gas/testsuite/gas/mips/loongson-ext2.s
new file mode 100644 (file)
index 0000000..023a469
--- /dev/null
@@ -0,0 +1,7 @@
+       .text
+       .set noreorder
+
+       cto     $2,$4
+       ctz     $2,$4
+       dcto    $2,$4
+       dctz    $2,$4
index 2f6ddc97a9c1dce6ce43fe5bdf6c83cad3ba91ef..cb1da9a70cb4b2fc74aeea0bd47b83407ff2409e 100644 (file)
@@ -1395,6 +1395,7 @@ if { [istarget mips*-*-vxworks*] } {
     run_dump_test "loongson-3a-mmi"
 
     run_dump_test "loongson-cam"
+    run_dump_test "loongson-ext2"
 
     if { $has_newabi } {
        run_dump_test_arches "octeon"   [mips_arch_list_matching octeon]
index b45a328365eec685ef36e94fa38a75c303b36404..baeb718fa5a979d2d6aecba76cce190667309afc 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-29  Chenghua Xu  <paul.hua.gm@gmail.com>
+
+       * elf/mips.h (AFL_ASE_LOONGSON_EXT2): New macro.
+       (AFL_ASE_MASK): Update to include AFL_ASE_LOONGSON_EXT2.
+       * opcode/mips.h (ASE_LOONGSON_EXT2): New macro.
+
 2018-08-29  Chenghua Xu  <paul.hua.gm@gmail.com>
 
         * elf/mips.h (AFL_ASE_LOONGSON_EXT): New macro.
index cd76139b595bb82062aad109482fd586b255c757..983275a5bb50f320a97bdc7ee91cefb95754d0d7 100644 (file)
@@ -1241,7 +1241,8 @@ extern void bfd_mips_elf_swap_abiflags_v0_out
 #define AFL_ASE_LOONGSON_MMI 0x00040000 /* Loongson MMI ASE.  */
 #define AFL_ASE_LOONGSON_CAM 0x00080000 /* Loongson CAM ASE.  */
 #define AFL_ASE_LOONGSON_EXT 0x00100000 /* Loongson EXT instructions.  */
-#define AFL_ASE_MASK         0x001effff /* All ASEs.  */
+#define AFL_ASE_LOONGSON_EXT2 0x00200000 /* Loongson EXT2 instructions.  */
+#define AFL_ASE_MASK         0x003effff /* All ASEs.  */
 
 /* Values for the isa_ext word of an ABI flags structure.  */
 
index 4d60cbc9b7f9aa77363d53777a8ecd2c02d841db..28fa1d7ae0e67dd6bb784db59efaaf596419717f 100644 (file)
@@ -1308,6 +1308,8 @@ static const unsigned int mips_isa_table[] = {
 #define ASE_LOONGSON_CAM       0x00400000
 /* Loongson EXTensions (EXT) instructions.  */
 #define ASE_LOONGSON_EXT       0x00800000
+/* Loongson EXTensions R2 (EXT2) instructions.  */
+#define ASE_LOONGSON_EXT2      0x01000000
 
 /* MIPS ISA defines, use instead of hardcoding ISA level.  */
 
index 13a1e1597bfa88d89138274465f20d5f8b859e93..7da724f49dd5418131646270bd9d40eafe535610 100644 (file)
@@ -1,3 +1,11 @@
+2018-08-29  Chenghua Xu  <paul.hua.gm@gmail.com>
+
+       * mips-dis.c (parse_mips_ase_option): Handle -M loongson-ext
+       option.
+       (print_mips_disassembler_options): Document -M loongson-ext.
+       * mips-opc.c (LEXT2): New macro.
+       (mips_opcodes): Add cto, ctz, dcto, dctz instructions.
+
 2018-08-29  Chenghua Xu  <paul.hua.gm@gmail.com>
 
         * mips-dis.c (mips_arch_choices): Add EXT to loongson3a
index 277d79d41cadfe314e0e6a791a0f359a33d34f05..894bc4fd997dea93a9df19ac74f7f8ccbc3bd76f 100644 (file)
@@ -947,6 +947,13 @@ parse_mips_ase_option (const char *option)
       mips_ase |= ASE_LOONGSON_CAM;
       return TRUE;
     }
+  
+  /* Put here for match ext2 frist */
+  if (CONST_STRNEQ (option, "loongson-ext2"))
+    {
+      mips_ase |= ASE_LOONGSON_EXT2;
+      return TRUE;
+    }
 
   if (CONST_STRNEQ (option, "loongson-ext"))
     {
@@ -2613,6 +2620,10 @@ static struct
                  N_("Recognize the Loongson EXTensions (EXT) "
                     " instructions.\n"),
                  MIPS_OPTION_ARG_NONE },
+  { "loongson-ext2",
+                 N_("Recognize the Loongson EXTensions R2 (EXT2) "
+                    " instructions.\n"),
+                 MIPS_OPTION_ARG_NONE },
   { "gpr-names=", N_("Print GPR names according to specified ABI.\n\
                   Default: based on binary being disassembled.\n"),
                  MIPS_OPTION_ARG_ABI },
index 5e4690d44fc84608578e2742a4a7d6e73533c71e..f1ceaee51d67e619ffde3781e3ceb1a7c5bba58b 100644 (file)
@@ -420,6 +420,9 @@ decode_mips_operand (const char *p)
 /* Loongson EXTensions (EXT) instructions support.  */
 #define LEXT   ASE_LOONGSON_EXT
 
+/* Loongson EXTensions R2 (EXT2) instructions support.  */
+#define LEXT2  ASE_LOONGSON_EXT2
+
 /* The order of overloaded instructions matters.  Label arguments and
    register arguments look the same. Instructions that can have either
    for arguments must apear in the correct order in this table for the
@@ -518,6 +521,10 @@ const struct mips_opcode mips_builtin_opcodes[] =
 {"gssq",               "+z,t,+c(b)",   0xe8000020, 0xfc008020, RD_1|RD_2|RD_4|SM,      0,              0,              LEXT,   0 },
 {"gslqc1",             "+Z,T,+c(b)",   0xc8008020, 0xfc008020, WR_1|WR_2|RD_4|LM,      0,              0,              LEXT,   0 },
 {"gssqc1",             "+Z,T,+c(b)",   0xe8008020, 0xfc008020, RD_1|RD_2|RD_4|SM,      0,              0,              LEXT,   0 },
+{"cto",                        "d,s",          0x70000062, 0xfc1f07ff, WR_1|RD_2,              0,              0,              LEXT2,  0 },
+{"ctz",                        "d,s",          0x70000022, 0xfc1f07ff, WR_1|RD_2,              0,              0,              LEXT2,  0 },
+{"dcto",               "d,s",          0x700000e2, 0xfc1f07ff, WR_1|RD_2,              0,              0,              LEXT2,  0 },
+{"dctz",               "d,s",          0x700000a2, 0xfc1f07ff, WR_1|RD_2,              0,              0,              LEXT2,  0 },
 
 /* R5900 VU0 Macromode instructions. */
 {"vabs",               "+7+K,+6+K",      0x4a0001fd, 0xfe0007ff,       CP,             VU0CH,          VU0,            0,      0 },
This page took 0.061851 seconds and 4 git commands to generate.