diff options
author | Richard Earnshaw <Richard.Earnshaw@arm.com> | 2014-11-20 15:28:52 +0000 |
---|---|---|
committer | Richard Earnshaw <Richard.Earnshaw@arm.com> | 2014-11-20 15:28:52 +0000 |
commit | 5c47e525893b06db772d8b1c043233a173101c8c (patch) | |
tree | d880e94983b0cae5a50739d8e1dbc8abc9f7f434 /gas | |
parent | 0cfb07174869f3542a96619fb36a85398af35da2 (diff) | |
download | gdb-5c47e525893b06db772d8b1c043233a173101c8c.zip gdb-5c47e525893b06db772d8b1c043233a173101c8c.tar.gz gdb-5c47e525893b06db772d8b1c043233a173101c8c.tar.bz2 |
[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.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/config/tc-aarch64.c | 19 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/diagnostic.l | 10 |
3 files changed, 25 insertions, 11 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 8341ee4..97e5a9e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -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> * config/tc-aarch64.c (md_assemble): Call warn_unpredictable_ldst. diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 41378f5..c8824e5 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -5490,7 +5490,7 @@ programmer_friendly_fixup (aarch64_instruction *instr) return TRUE; } -/* Check for loads and stores that will cause unpredictable behavior */ +/* Check for loads and stores that will cause unpredictable behavior. */ static void 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_unscaled: 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) - as_warn (_("unpredictable register after writeback -- `%s'"), str); + as_warn (_("unpredictable transfer with writeback -- `%s'"), str); break; case ldstpair_off: case ldstnapair_offs: case ldstpair_indexed: - if ((opnds[0].reg.regno == opnds[2].reg.regno - || opnds[1].reg.regno == opnds[2].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[2].addr.base_regno + || opnds[1].reg.regno == opnds[2].addr.base_regno) && 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)) && opnds[0].reg.regno == opnds[1].reg.regno) as_warn (_("unpredictable load of register pair -- `%s'"), str); diff --git a/gas/testsuite/gas/aarch64/diagnostic.l b/gas/testsuite/gas/aarch64/diagnostic.l index d5fdba8..61ce5d2 100644 --- a/gas/testsuite/gas/aarch64/diagnostic.l +++ b/gas/testsuite/gas/aarch64/diagnostic.l @@ -109,8 +109,8 @@ [^:]*:116: Warning: unpredictable load of register pair -- `ldp d0,d0,\[sp\]' [^:]*:117: Warning: unpredictable load of register pair -- `ldp x0,x0,\[sp\],#16' [^:]*:118: Warning: unpredictable load of register pair -- `ldnp x0,x0,\[sp\]' -[^:]*:121: Warning: unpredictable register after writeback -- `ldr x0,\[x0,#8\]!' -[^:]*:122: Warning: unpredictable register after writeback -- `str x0,\[x0,#8\]!' -[^:]*:123: Warning: unpredictable register after writeback -- `str x1,\[x1\],#8' -[^:]*:124: Warning: unpredictable register after writeback -- `stp x0,x1,\[x0,#16\]!' -[^:]*:125: Warning: unpredictable register after writeback -- `ldp x0,x1,\[x1\],#16' +[^:]*:121: Warning: unpredictable transfer with writeback -- `ldr x0,\[x0,#8\]!' +[^:]*:122: Warning: unpredictable transfer with writeback -- `str x0,\[x0,#8\]!' +[^:]*:123: Warning: unpredictable transfer with writeback -- `str x1,\[x1\],#8' +[^:]*:124: Warning: unpredictable transfer with writeback -- `stp x0,x1,\[x0,#16\]!' +[^:]*:125: Warning: unpredictable transfer with writeback -- `ldp x0,x1,\[x1\],#16' |