* config/tc-mips.c (append_insn): Convert MIPS16 jr/jalr jumps
authorDavid Ung <davidu@mips.com>
Wed, 19 Oct 2005 18:47:09 +0000 (18:47 +0000)
committerDavid Ung <davidu@mips.com>
Wed, 19 Oct 2005 18:47:09 +0000 (18:47 +0000)
into jrc/jalrc versions if ISA_MIPS32+ and not doing the swap,
hence avoiding to emit a nop.

* gas/mips/mips.exp: Run new test.
* gas/testsuite/gas/mips/mips16e-jrc.s: New test for converting
jalr/jr to the compact jalrc/jrc instructions.
* gas/testsuite/gas/mips/mips16e-jrc.d: New.

gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/ChangeLog
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/mips16e-jrc.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16e-jrc.s [new file with mode: 0644]

index 234aef8..4d44caa 100644 (file)
@@ -1,3 +1,9 @@
+2005-10-19  David Ung  <davidu@mips.com>
+
+       * config/tc-mips.c (append_insn): Convert MIPS16 jr/jalr jumps
+       into jrc/jalrc versions if ISA_MIPS32+ and not doing the swap,
+       hence avoiding to emit a nop.
+
 2005-10-19  Jie Zhang  <jie.zhang@analog.com>
 
        * config/tc-bfin.c (md_begin): Let the lex_type of '(' be
index 6e06105..7ae421d 100644 (file)
@@ -2693,12 +2693,29 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
                 sync.p, we can not swap.  */
              || (prev_pinfo & INSN_SYNC))
            {
-             /* We could do even better for unconditional branches to
-                portions of this object file; we could pick up the
-                instruction at the destination, put it in the delay
-                slot, and bump the destination address.  */
-             insert_into_history (0, 1, ip);
-             emit_nop ();
+             if (mips_opts.mips16
+                 && (pinfo & INSN_UNCOND_BRANCH_DELAY)
+                 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
+                 && (mips_opts.isa == ISA_MIPS32
+                     || mips_opts.isa == ISA_MIPS32R2
+                     || mips_opts.isa == ISA_MIPS64
+                     || mips_opts.isa == ISA_MIPS64R2))
+               {
+                 /* Convert MIPS16 jr/jalr into a "compact" jump.  */
+                 ip->insn_opcode |= 0x0080;
+                 install_insn (ip);
+                 insert_into_history (0, 1, ip);
+               } 
+             else
+               {
+                 /* We could do even better for unconditional branches to
+                    portions of this object file; we could pick up the
+                    instruction at the destination, put it in the delay
+                    slot, and bump the destination address.  */
+                 insert_into_history (0, 1, ip);
+                 emit_nop ();
+               }
+               
              if (mips_relax.sequence)
                mips_relax.sizes[mips_relax.sequence - 1] += 4;
            }
index 1f4f742..7260810 100644 (file)
@@ -1,3 +1,10 @@
+2005-10-19  David Ung  <davidu@mips.com>
+
+       * gas/mips/mips.exp: Run new test.
+       * gas/testsuite/gas/mips/mips16e-jrc.s: New test for converting
+       jalr/jr to the compact jalrc/jrc instructions.
+       * gas/testsuite/gas/mips/mips16e-jrc.d: New.
+
 2005-10-19  Martin Schwidefsky  <schwidefsky@de.ibm.com>
 
        * gas/s390/zarch-z9-109.s: Add tests for unnormalized hfp multiply
index 0eba51b..c787e4f 100644 (file)
@@ -771,4 +771,5 @@ if { [istarget mips*-*-*] } then {
            run_dump_test "mips16-dwarf2-n32"
        }
     }
+    if { !$no_mips16 } { run_dump_test "mips16e-jrc" }
 }
diff --git a/gas/testsuite/gas/mips/mips16e-jrc.d b/gas/testsuite/gas/mips/mips16e-jrc.d
new file mode 100644 (file)
index 0000000..1a739b5
--- /dev/null
@@ -0,0 +1,14 @@
+#objdump: -dr -mmips:isa32 -mmips:16
+#as: -march=mips32 -mips16
+#name: mips16e jalrc/jrc
+.*:     file format .*
+Disassembly of section .text:
+00000000 <.text>:
+   0:  eac0            jalrc   v0
+   2:  e8a0            jrc     ra
+   4:  6a01            li      v0,1
+   6:  6500            nop
+   8:  6500            nop
+   a:  6500            nop
+   c:  6500            nop
+   e:  6500            nop
diff --git a/gas/testsuite/gas/mips/mips16e-jrc.s b/gas/testsuite/gas/mips/mips16e-jrc.s
new file mode 100644 (file)
index 0000000..02c8389
--- /dev/null
@@ -0,0 +1,6 @@
+# Test the generation of jalrc/jrc opcodes
+        jalr    $31,$2
+        jr      $31
+       li      $2,1
+
+        .p2align 4