+2017-02-28  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * elfxx-mips.c (mips_elf_perform_relocation): Also handle the
+       `jalr $0, $25' instruction encoding.
+
 2017-02-27  Nick Clifton  <nickc@redhat.com>
 
        PR ld/21180
 
       && !cross_mode_jump_p
       && ((JAL_TO_BAL_P (input_bfd)
           && r_type == R_MIPS_26
-          && (x >> 26) == 0x3)         /* jal addr */
+          && (x >> 26) == 0x3)                 /* jal addr */
          || (JALR_TO_BAL_P (input_bfd)
              && r_type == R_MIPS_JALR
-             && x == 0x0320f809)       /* jalr t9 */
+             && x == 0x0320f809)               /* jalr t9 */
          || (JR_TO_B_P (input_bfd)
              && r_type == R_MIPS_JALR
-             && x == 0x03200008)))     /* jr t9 */
+             && (x & ~1) == 0x03200008)))      /* jr t9 / jalr zero, t9 */
     {
       bfd_vma addr;
       bfd_vma dest;
       off = dest - addr;
       if (off <= 0x1ffff && off >= -0x20000)
        {
-         if (x == 0x03200008)  /* jr t9 */
+         if ((x & ~1) == 0x03200008)           /* jr t9 / jalr zero, t9 */
            x = 0x10000000 | (((bfd_vma) off >> 2) & 0xffff);   /* b addr */
          else
            x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff);   /* bal addr */
 
+2017-02-28  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * testsuite/gas/mips/jalr4.s: Add `jalr $0, $25' instructions.
+       * testsuite/gas/mips/jalr4.d: Adjust accordingly.  Remove MIPSr6
+       encoding patterns.
+       * testsuite/gas/mips/jalr4-n64.d: Likewise.
+       * testsuite/gas/mips/mipsr6@jalr4.d: New test.
+       * testsuite/gas/mips/mipsr6@jalr4-n32.d: New test.
+       * testsuite/gas/mips/mipsr6@jalr4-n64.d: New test.
+
 2017-02-25  Alan Modra  <amodra@gmail.com>
 
        * testsuite/gas/elf/strtab.s: Don't put directives on first
 
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 [0-9a-f]+ <[^>]*> 00000000     nop
-[0-9a-f]+ <[^>]*> 0320000[89]  jr      t9
+[0-9a-f]+ <[^>]*> 03200009     jalr    zero,t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar0
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200008     jr      t9
 [      ]*[0-9a-f]+: R_MIPS_JALR        bar0
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 [0-9a-f]+ <[^>]*> 00000000     nop
-[0-9a-f]+ <[^>]*> 0320000[89]  jr      t9
+[0-9a-f]+ <[^>]*> 03200009     jalr    zero,t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar1
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200008     jr      t9
 [      ]*[0-9a-f]+: R_MIPS_JALR        bar1
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 [0-9a-f]+ <[^>]*> 00000000     nop
-[0-9a-f]+ <[^>]*> 0320000[89]  jr      t9
+[0-9a-f]+ <[^>]*> 03200009     jalr    zero,t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar2
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200008     jr      t9
 [      ]*[0-9a-f]+: R_MIPS_JALR        bar2
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 [      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
 
 [0-9a-f]+ <[^>]*> 0320f809     jalr    t9
 [      ]*[0-9a-f]+: R_MIPS_JALR        bar0
 [0-9a-f]+ <[^>]*> 00000000     nop
-[0-9a-f]+ <[^>]*> 0320000[89]  jr      t9
+[0-9a-f]+ <[^>]*> 03200009     jalr    zero,t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar0
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200008     jr      t9
 [      ]*[0-9a-f]+: R_MIPS_JALR        bar0
 [0-9a-f]+ <[^>]*> 00000000     nop
 [0-9a-f]+ <[^>]*> 0320f809     jalr    t9
 [      ]*[0-9a-f]+: R_MIPS_JALR        bar1
 [0-9a-f]+ <[^>]*> 00000000     nop
-[0-9a-f]+ <[^>]*> 0320000[89]  jr      t9
+[0-9a-f]+ <[^>]*> 03200009     jalr    zero,t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar1
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200008     jr      t9
 [      ]*[0-9a-f]+: R_MIPS_JALR        bar1
 [0-9a-f]+ <[^>]*> 00000000     nop
 [0-9a-f]+ <[^>]*> 0320f809     jalr    t9
 [      ]*[0-9a-f]+: R_MIPS_JALR        bar2
 [0-9a-f]+ <[^>]*> 00000000     nop
-[0-9a-f]+ <[^>]*> 0320000[89]  jr      t9
+[0-9a-f]+ <[^>]*> 03200009     jalr    zero,t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar2
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200008     jr      t9
 [      ]*[0-9a-f]+: R_MIPS_JALR        bar2
 [0-9a-f]+ <[^>]*> 00000000     nop
        \.\.\.
 
        .reloc  1f, R_MIPS_JALR, bar0
 1:     jalr    $25
        .reloc  1f, R_MIPS_JALR, bar0
+1:     jalr    $0, $25
+       .reloc  1f, R_MIPS_JALR, bar0
 1:     jr      $25
        .reloc  1f, R_MIPS_JALR, bar1
 1:     jalr    $25
        .reloc  1f, R_MIPS_JALR, bar1
+1:     jalr    $0, $25
+       .reloc  1f, R_MIPS_JALR, bar1
 1:     jr      $25
        .reloc  1f, R_MIPS_JALR, bar2
 1:     jalr    $25
        .reloc  1f, R_MIPS_JALR, bar2
+1:     jalr    $0, $25
+       .reloc  1f, R_MIPS_JALR, bar2
 1:     jr      $25
        .end    foo
 
 
--- /dev/null
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALR reloc unaligned/cross-mode (n32)
+#as: -n32
+#source: jalr4.s
+#dump: mipsr6@jalr4.d
 
--- /dev/null
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALR reloc unaligned/cross-mode (n64)
+#as: -64
+#source: jalr4.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 0320f809     jalr    t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar0
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar0
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar0
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0320f809     jalr    t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar1
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar1
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar1
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0320f809     jalr    t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar2
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar2
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar2
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[      ]*[0-9a-f]+: R_MIPS_NONE        \*ABS\*
+[0-9a-f]+ <[^>]*> 00000000     nop
+       \.\.\.
+       \.\.\.
+       \.\.\.
+       \.\.\.
 
--- /dev/null
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALR reloc unaligned/cross-mode (o32)
+#as: -32
+#source: jalr4.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 0320f809     jalr    t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar0
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar0
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar0
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0320f809     jalr    t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar1
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar1
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar1
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0320f809     jalr    t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar2
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar2
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[      ]*[0-9a-f]+: R_MIPS_JALR        bar2
+[0-9a-f]+ <[^>]*> 00000000     nop
+       \.\.\.
+       \.\.\.
+       \.\.\.
+       \.\.\.
 
+2017-02-28  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * testsuite/ld-mips-elf/jalr4.dd: Adjust for `jalr $0, $25'
+       instructions.
+       * testsuite/ld-mips-elf/jalr4-r6.dd: New test.
+       * testsuite/ld-mips-elf/mips-elf.exp: Run the new test.
+
 2017-02-27   Georg-Johann Lay  <gjl@gcc.gnu.org>
 
        PR target/20849
 
--- /dev/null
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 04110017     bal     0+000060 <bar0>
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 10000015     b       0+000060 <bar0>
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 10000013     b       0+000060 <bar0>
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0320f809     jalr    t9
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 0320f809     jalr    t9
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jr      t9
+[0-9a-f]+ <[^>]*> 00000000     nop
+       \.\.\.
+       \.\.\.
+       \.\.\.
+       \.\.\.
 
 .*: +file format .*mips.*
 
 Disassembly of section \.text:
-[0-9a-f]+ <[^>]*> 0411000f     bal     0+000040 <bar0>
+[0-9a-f]+ <[^>]*> 04110017     bal     0+000060 <bar0>
 [0-9a-f]+ <[^>]*> 00000000     nop
-[0-9a-f]+ <[^>]*> 1000000d     b       0+000040 <bar0>
+[0-9a-f]+ <[^>]*> 10000015     b       0+000060 <bar0>
+[0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 10000013     b       0+000060 <bar0>
 [0-9a-f]+ <[^>]*> 00000000     nop
 [0-9a-f]+ <[^>]*> 0320f809     jalr    t9
 [0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jalr    zero,t9
+[0-9a-f]+ <[^>]*> 00000000     nop
 [0-9a-f]+ <[^>]*> 03200008     jr      t9
 [0-9a-f]+ <[^>]*> 00000000     nop
 [0-9a-f]+ <[^>]*> 0320f809     jalr    t9
 [0-9a-f]+ <[^>]*> 00000000     nop
+[0-9a-f]+ <[^>]*> 03200009     jalr    zero,t9
+[0-9a-f]+ <[^>]*> 00000000     nop
 [0-9a-f]+ <[^>]*> 03200008     jr      t9
 [0-9a-f]+ <[^>]*> 00000000     nop
        \.\.\.
 
            "$abi_asflags($abi)" \
            [list ../../../gas/testsuite/gas/mips/jalr4.s] \
            [list "objdump {-d --prefix-addresses --show-raw-insn} jalr4.dd"] \
+           "jalr4-${abi}"] \
+       [list \
+           "MIPSr6 JALR reloc unaligned/cross-mode link test ($abi)" \
+           "$abi_ldflags($abi) -T jalr3.ld" "" \
+           [string map \
+               [list -32 "-mips32r6 -32" \
+                   -n32 "-mips64r6 -n32" \
+                   -64 "-mips64r6 -64"] \
+               [regsub -- -march=from-abi $abi_asflags($abi) ""]] \
+           {../../../gas/testsuite/gas/mips/jalr4.s} \
+           {{objdump {-d --prefix-addresses --show-raw-insn} jalr4-r6.dd}} \
            "jalr4-${abi}"]]
 }