This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] MIPS/GAS: Support 32-bit offset with PREF
- From: "Maciej W. Rozycki" <macro at codesourcery dot com>
- To: binutils at sourceware dot org
- Cc: Richard Sandiford <rdsandiford at googlemail dot com>
- Date: Fri, 25 Feb 2011 00:42:43 +0000 (GMT)
- Subject: [PATCH] MIPS/GAS: Support 32-bit offset with PREF
Hi,
Interestingly enough, unlike with all the other instructions that address
memory using the "o(b)" format specifier, we do not support the 32-bit
offset form of "A(b)" as a macro with the PREF instruction. I don't know
what the original reason behind it was if any in particular, but it seems
a good idea to me to stay consistent across the instruction set, so here's
a change to make such a macro available.
No test case included as the microMIPS change would wipe it away anyway
-- I did include a suitable one there under the assumption this change
will be preapplied. Let me know if you'd rather I extracted it from there
and converted to a transitional form to use here.
Regression-tested with the mips-sde-elf and mips-linux-gnu targets. OK
to apply?
2011-02-25 Maciej W. Rozycki <macro@codesourcery.com>
gas/
* config/tc-mips.c (macro): Handle M_PREF_AB.
include/opcode/
* mips.h (M_PREF_AB): New enum value.
opcodes/
* mips-opc.c (mips_builtin_opcodes): Add "pref" macro.
Maciej
binutils-mips-pref.diff
Index: binutils-fsf-trunk-quilt/gas/config/tc-mips.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/gas/config/tc-mips.c 2011-02-24 23:46:08.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/config/tc-mips.c 2011-02-24 23:46:08.000000000 +0000
@@ -6530,6 +6530,9 @@ macro (struct mips_cl_insn *ip)
case M_CACHE_AB:
s = "cache";
goto st;
+ case M_PREF_AB:
+ s = "pref";
+ goto st;
case M_SDC1_AB:
s = "sdc1";
coproc = 1;
@@ -6571,7 +6574,7 @@ macro (struct mips_cl_insn *ip)
|| mask == M_L_DAB
|| mask == M_S_DAB)
fmt = "T,o(b)";
- else if (mask == M_CACHE_AB)
+ else if (mask == M_CACHE_AB || mask == M_PREF_AB)
fmt = "k,o(b)";
else if (coproc)
fmt = "E,o(b)";
Index: binutils-fsf-trunk-quilt/include/opcode/mips.h
===================================================================
--- binutils-fsf-trunk-quilt.orig/include/opcode/mips.h 2011-02-24 23:46:02.000000000 +0000
+++ binutils-fsf-trunk-quilt/include/opcode/mips.h 2011-02-24 23:46:08.000000000 +0000
@@ -864,6 +864,7 @@ enum
M_MULOU_I,
M_NOR_I,
M_OR_I,
+ M_PREF_AB,
M_REM_3,
M_REM_3I,
M_REMU_3,
Index: binutils-fsf-trunk-quilt/opcodes/mips-opc.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/opcodes/mips-opc.c 2011-02-24 23:46:02.000000000 +0000
+++ binutils-fsf-trunk-quilt/opcodes/mips-opc.c 2011-02-24 23:46:08.000000000 +0000
@@ -191,6 +191,7 @@ const struct mips_opcode mips_builtin_op
instruction name anyhow. */
/* name, args, match, mask, pinfo, pinfo2, membership */
{"pref", "k,o(b)", 0xcc000000, 0xfc000000, RD_b, 0, I4_32|G3 },
+{"pref", "k,A(b)", 0, (int) M_PREF_AB, INSN_MACRO, 0, I4_32|G3 },
{"prefx", "h,t(b)", 0x4c00000f, 0xfc0007ff, RD_b|RD_t|FP_S, 0, I4_33 },
{"nop", "", 0x00000000, 0xffffffff, 0, INSN2_ALIAS, I1 }, /* sll */
{"ssnop", "", 0x00000040, 0xffffffff, 0, INSN2_ALIAS, I1 }, /* sll */