This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[committed] MIPS16/GAS: Disallow EXTEND delay-slot scheduling


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 =


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]