[committed] MIPS16/GAS: Disallow EXTEND delay-slot scheduling
Maciej W. Rozycki
macro@imgtec.com
Fri Dec 23 21:12:00 GMT 2016
Do not allow any explicitly coded EXTEND instruction to be automatically
scheduled into a jump delay slot, as an EXTEND prefix is coupled with
the next regular MIPS16 instruction and therefore swapping it with a
jump would change program's semantics; EXTEND is not architecturally
allowed to be present in a jump delay slot anyway.
opcodes/
* mips16-opc.c (mips16_opcodes): Set NODS in `pinfo' for
"extend".
gas/
* testsuite/gas/mips/mips16-extend-swap.d: New test.
* testsuite/gas/mips/mips16-extend-swap.s: New test source.
* testsuite/gas/mips/mips.exp: Run the new test.
---
binutils-mips16-extend-nods.diff
Index: binutils/gas/testsuite/gas/mips/mips.exp
===================================================================
--- binutils.orig/gas/testsuite/gas/mips/mips.exp 2016-12-22 20:11:55.559859316 +0000
+++ binutils/gas/testsuite/gas/mips/mips.exp 2016-12-23 12:22:19.672724597 +0000
@@ -1341,6 +1341,7 @@ if { [istarget mips*-*-vxworks*] } {
run_list_test "mips16e-save-err" "-march=mips32 -32"
run_dump_test "mips16-intermix"
run_dump_test "mips16-extend"
+ run_dump_test "mips16-extend-swap"
run_dump_test "mips16-sprel-swap"
run_dump_test "mips16-sdrasp"
Index: binutils/gas/testsuite/gas/mips/mips16-extend-swap.d
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/mips16-extend-swap.d 2016-12-23 12:22:19.687431321 +0000
@@ -0,0 +1,22 @@
+#objdump: -d --prefix-addresses --show-raw-insn
+#name: MIPS16 jump delay slot scheduling for EXTEND instructions
+#as: -32
+
+# Verify that EXTEND instructions are not scheduled into a jump delay slot.
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> f123 extend 0x123
+[0-9a-f]+ <[^>]*> 1800 0000 jal 00000000 <foo>
+[0-9a-f]+ <[^>]*> 6500 nop
+[0-9a-f]+ <[^>]*> f123 extend 0x123
+[0-9a-f]+ <[^>]*> 1c00 0000 jalx 00000000 <foo>
+[0-9a-f]+ <[^>]*> 6500 nop
+[0-9a-f]+ <[^>]*> f123 eb00 jr v1
+[0-9a-f]+ <[^>]*> 6500 nop
+[0-9a-f]+ <[^>]*> f123 e820 jr ra
+[0-9a-f]+ <[^>]*> 6500 nop
+[0-9a-f]+ <[^>]*> f123 eb40 jalr v1
+[0-9a-f]+ <[^>]*> 6500 nop
+ \.\.\.
Index: binutils/gas/testsuite/gas/mips/mips16-extend-swap.s
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils/gas/testsuite/gas/mips/mips16-extend-swap.s 2016-12-23 12:22:19.701291273 +0000
@@ -0,0 +1,21 @@
+ .set mips1
+ .set mips16
+foo:
+ extend 0x123
+ jal bar
+
+ extend 0x123
+ jalx baz
+
+ extend 0x123
+ jr $3
+
+ extend 0x123
+ jr $31
+
+ extend 0x123
+ jalr $3
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+ .align 4, 0
+ .space 16
Index: binutils/opcodes/mips16-opc.c
===================================================================
--- binutils.orig/opcodes/mips16-opc.c 2016-12-22 20:11:55.148434037 +0000
+++ binutils/opcodes/mips16-opc.c 2016-12-23 12:22:11.732315543 +0000
@@ -357,7 +357,7 @@ const struct mips_opcode mips16_opcodes[
{"zew", "x", 0xe851, 0xf8ff, MOD_1, 0, I64, 0, 0 },
/* Place EXTEND last so that it catches any prefix that didn't match
anything. */
-{"extend", "e", 0xf000, 0xf800, 0, 0, I1, 0, 0 },
+{"extend", "e", 0xf000, 0xf800, NODS, 0, I1, 0, 0 },
};
const int bfd_mips16_num_opcodes =
More information about the Binutils
mailing list