From 645c455650ed35460afdacb078c7c58308607fbe Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Fri, 23 Dec 2016 12:37:40 +0000 Subject: [PATCH] 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. --- gas/ChangeLog | 6 ++++++ gas/testsuite/gas/mips/mips.exp | 1 + gas/testsuite/gas/mips/mips16-extend-swap.d | 22 +++++++++++++++++++++ gas/testsuite/gas/mips/mips16-extend-swap.s | 21 ++++++++++++++++++++ opcodes/ChangeLog | 5 +++++ opcodes/mips16-opc.c | 2 +- 6 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 gas/testsuite/gas/mips/mips16-extend-swap.d create mode 100644 gas/testsuite/gas/mips/mips16-extend-swap.s diff --git a/gas/ChangeLog b/gas/ChangeLog index d78c57d094..53fa95280c 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2016-12-23 Maciej W. Rozycki + + * 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. + 2016-12-23 Joe Seymour * config/tc-msp430.c (msp430_mcu_data): Sync with data from TI's diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp index cd62e446ec..c16891ad69 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -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" diff --git a/gas/testsuite/gas/mips/mips16-extend-swap.d b/gas/testsuite/gas/mips/mips16-extend-swap.d new file mode 100644 index 0000000000..eb9dd73bb2 --- /dev/null +++ b/gas/testsuite/gas/mips/mips16-extend-swap.d @@ -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 +[0-9a-f]+ <[^>]*> 6500 nop +[0-9a-f]+ <[^>]*> f123 extend 0x123 +[0-9a-f]+ <[^>]*> 1c00 0000 jalx 00000000 +[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 + \.\.\. diff --git a/gas/testsuite/gas/mips/mips16-extend-swap.s b/gas/testsuite/gas/mips/mips16-extend-swap.s new file mode 100644 index 0000000000..c299cf1611 --- /dev/null +++ b/gas/testsuite/gas/mips/mips16-extend-swap.s @@ -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 diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 9938992f4f..5166be4fa3 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2016-12-23 Maciej W. Rozycki + + * mips16-opc.c (mips16_opcodes): Set NODS in `pinfo' for + "extend". + 2016-12-23 Maciej W. Rozycki * mips-dis.c (set_default_mips_dis_options): Use diff --git a/opcodes/mips16-opc.c b/opcodes/mips16-opc.c index 758b78fba6..7d430dd1b9 100644 --- a/opcodes/mips16-opc.c +++ b/opcodes/mips16-opc.c @@ -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 = -- 2.34.1