mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
[AArch64] Fix mis-detection of unpredictable load/store operations with FP regs.
* config/tc-aarch64.c (warn_unpredictable_ldst): Check that transfer registers are in the GP register set. Adjust warnings. Use correct field member for address register. * testsuite/gas/aarch64/diagnostic.l: Update.
This commit is contained in:
@ -1,3 +1,10 @@
|
|||||||
|
2014-11-20 Richard Earnshaw <rearnsha@arm.com>
|
||||||
|
|
||||||
|
* config/tc-aarch64.c (warn_unpredictable_ldst): Check that transfer
|
||||||
|
registers are in the GP register set. Adjust warnings. Use correct
|
||||||
|
field member for address register.
|
||||||
|
* testsuite/gas/aarch64/diagnostic.l: Update.
|
||||||
|
|
||||||
2014-11-19 Ryan Mansfield <rmansfield@qnx.com>
|
2014-11-19 Ryan Mansfield <rmansfield@qnx.com>
|
||||||
|
|
||||||
* config/tc-aarch64.c (md_assemble): Call warn_unpredictable_ldst.
|
* config/tc-aarch64.c (md_assemble): Call warn_unpredictable_ldst.
|
||||||
|
@ -5490,7 +5490,7 @@ programmer_friendly_fixup (aarch64_instruction *instr)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for loads and stores that will cause unpredictable behavior */
|
/* Check for loads and stores that will cause unpredictable behavior. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
warn_unpredictable_ldst (aarch64_instruction *instr, char *str)
|
warn_unpredictable_ldst (aarch64_instruction *instr, char *str)
|
||||||
@ -5504,17 +5504,24 @@ warn_unpredictable_ldst (aarch64_instruction *instr, char *str)
|
|||||||
case ldst_imm9:
|
case ldst_imm9:
|
||||||
case ldst_unscaled:
|
case ldst_unscaled:
|
||||||
case ldst_unpriv:
|
case ldst_unpriv:
|
||||||
if (opnds[0].reg.regno == opnds[1].reg.regno
|
/* Loading/storing the base register is unpredictable if writeback. */
|
||||||
|
if ((aarch64_get_operand_class (opnds[0].type)
|
||||||
|
== AARCH64_OPND_CLASS_INT_REG)
|
||||||
|
&& opnds[0].reg.regno == opnds[1].addr.base_regno
|
||||||
&& opnds[1].addr.writeback)
|
&& opnds[1].addr.writeback)
|
||||||
as_warn (_("unpredictable register after writeback -- `%s'"), str);
|
as_warn (_("unpredictable transfer with writeback -- `%s'"), str);
|
||||||
break;
|
break;
|
||||||
case ldstpair_off:
|
case ldstpair_off:
|
||||||
case ldstnapair_offs:
|
case ldstnapair_offs:
|
||||||
case ldstpair_indexed:
|
case ldstpair_indexed:
|
||||||
if ((opnds[0].reg.regno == opnds[2].reg.regno
|
/* Loading/storing the base register is unpredictable if writeback. */
|
||||||
|| opnds[1].reg.regno == opnds[2].reg.regno)
|
if ((aarch64_get_operand_class (opnds[0].type)
|
||||||
|
== AARCH64_OPND_CLASS_INT_REG)
|
||||||
|
&& (opnds[0].reg.regno == opnds[2].addr.base_regno
|
||||||
|
|| opnds[1].reg.regno == opnds[2].addr.base_regno)
|
||||||
&& opnds[2].addr.writeback)
|
&& opnds[2].addr.writeback)
|
||||||
as_warn (_("unpredictable register after writeback -- `%s'"), str);
|
as_warn (_("unpredictable transfer with writeback -- `%s'"), str);
|
||||||
|
/* Load operations must load different registers. */
|
||||||
if ((opcode->opcode & (1 << 22))
|
if ((opcode->opcode & (1 << 22))
|
||||||
&& opnds[0].reg.regno == opnds[1].reg.regno)
|
&& opnds[0].reg.regno == opnds[1].reg.regno)
|
||||||
as_warn (_("unpredictable load of register pair -- `%s'"), str);
|
as_warn (_("unpredictable load of register pair -- `%s'"), str);
|
||||||
|
@ -109,8 +109,8 @@
|
|||||||
[^:]*:116: Warning: unpredictable load of register pair -- `ldp d0,d0,\[sp\]'
|
[^:]*:116: Warning: unpredictable load of register pair -- `ldp d0,d0,\[sp\]'
|
||||||
[^:]*:117: Warning: unpredictable load of register pair -- `ldp x0,x0,\[sp\],#16'
|
[^:]*:117: Warning: unpredictable load of register pair -- `ldp x0,x0,\[sp\],#16'
|
||||||
[^:]*:118: Warning: unpredictable load of register pair -- `ldnp x0,x0,\[sp\]'
|
[^:]*:118: Warning: unpredictable load of register pair -- `ldnp x0,x0,\[sp\]'
|
||||||
[^:]*:121: Warning: unpredictable register after writeback -- `ldr x0,\[x0,#8\]!'
|
[^:]*:121: Warning: unpredictable transfer with writeback -- `ldr x0,\[x0,#8\]!'
|
||||||
[^:]*:122: Warning: unpredictable register after writeback -- `str x0,\[x0,#8\]!'
|
[^:]*:122: Warning: unpredictable transfer with writeback -- `str x0,\[x0,#8\]!'
|
||||||
[^:]*:123: Warning: unpredictable register after writeback -- `str x1,\[x1\],#8'
|
[^:]*:123: Warning: unpredictable transfer with writeback -- `str x1,\[x1\],#8'
|
||||||
[^:]*:124: Warning: unpredictable register after writeback -- `stp x0,x1,\[x0,#16\]!'
|
[^:]*:124: Warning: unpredictable transfer with writeback -- `stp x0,x1,\[x0,#16\]!'
|
||||||
[^:]*:125: Warning: unpredictable register after writeback -- `ldp x0,x1,\[x1\],#16'
|
[^:]*:125: Warning: unpredictable transfer with writeback -- `ldp x0,x1,\[x1\],#16'
|
||||||
|
Reference in New Issue
Block a user