From 4bf8c6e8986890caa482c845d2c4a0ff238c1e28 Mon Sep 17 00:00:00 2001 From: Jiong Wang Date: Fri, 13 Mar 2015 12:02:23 +0000 Subject: [PATCH] [AArch64] Don't warn on XZR/SP overlapping when it's in load/store 2015-03-13 Jiong Wang gas/ * config/tc-aarch64.c (warn_unpredictable_ldst): Don't warn on reg number 31. gas/testsuite/ * gas/aarch64/diagnostic.s: New testcases. * gas/aarch64/diagnostic.l: New error match. --- gas/ChangeLog | 5 ++ gas/config/tc-aarch64.c | 2 + gas/testsuite/ChangeLog | 5 ++ gas/testsuite/gas/aarch64/diagnostic.l | 4 ++ gas/testsuite/gas/aarch64/diagnostic.s | 84 ++++++++++++++++++++++++++ 5 files changed, 100 insertions(+) diff --git a/gas/ChangeLog b/gas/ChangeLog index 69b5bb9fa76..09cef3dc456 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2015-03-13 Jiong Wang + + * config/tc-aarch64.c (warn_unpredictable_ldst): Don't warn on reg + number 31. + 2015-03-13 Jiong Wang * config/tc-aarch64.h (SUB_SEGMENT_ALIGN): Define to be zero. diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 77701c6d1df..50311342ab2 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -5585,6 +5585,7 @@ warn_unpredictable_ldst (aarch64_instruction *instr, char *str) 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.base_regno != REG_SP && opnds[1].addr.writeback) as_warn (_("unpredictable transfer with writeback -- `%s'"), str); break; @@ -5596,6 +5597,7 @@ warn_unpredictable_ldst (aarch64_instruction *instr, char *str) == 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.base_regno != REG_SP && opnds[2].addr.writeback) as_warn (_("unpredictable transfer with writeback -- `%s'"), str); /* Load operations must load different registers. */ diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 065657c3477..2876e6334e3 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-03-13 Jiong Wang + + * gas/aarch64/diagnostic.s: New testcases. + * gas/aarch64/diagnostic.l: New error match. + 2015-03-13 Jiong Wang * gas/aarch64/tail_padding.s: New testcase. diff --git a/gas/testsuite/gas/aarch64/diagnostic.l b/gas/testsuite/gas/aarch64/diagnostic.l index 7a89f8ee74b..2d7bd48a037 100644 --- a/gas/testsuite/gas/aarch64/diagnostic.l +++ b/gas/testsuite/gas/aarch64/diagnostic.l @@ -116,3 +116,7 @@ [^:]*:125: Warning: unpredictable transfer with writeback -- `ldp x0,x1,\[x1\],#16' [^:]*:126: Error: this relocation modifier is not allowed on this instruction at operand 2 -- `adr x2,:got:s1' [^:]*:127: Error: this relocation modifier is not allowed on this instruction at operand 2 -- `ldr x0,\[x0,:got:s1\]' +[^:]*:130: Error: integer 64-bit register expected at operand 2 -- `ldr x1,\[wsp,#8\]!' +[^:]*:131: Error: integer 64-bit register expected at operand 3 -- `ldp x6,x29,\[w7,#8\]!' +[^:]*:132: Error: integer 64-bit register expected at operand 2 -- `str x30,\[w11,#8\]!' +[^:]*:133: Error: integer 64-bit register expected at operand 3 -- `stp x8,x27,\[wsp,#8\]!' diff --git a/gas/testsuite/gas/aarch64/diagnostic.s b/gas/testsuite/gas/aarch64/diagnostic.s index 7650b65c3e4..fbde0e0e560 100644 --- a/gas/testsuite/gas/aarch64/diagnostic.s +++ b/gas/testsuite/gas/aarch64/diagnostic.s @@ -125,3 +125,87 @@ ldp x0, x1, [x1], #16 adr x2, :got:s1 ldr x0, [x0, :got:s1] + + # Test error of 32-bit base reg + ldr x1, [wsp, #8]! + ldp x6, x29, [w7, #8]! + str x30, [w11, #8]! + stp x8, x27, [wsp, #8]! + + # Test various valid load/store reg combination. + # especially we shouldn't warn on xzr, although + # xzr is with the same encoding 31 as sp. + .macro ldst_pair_wb_2 op, reg1, reg2 + .irp base x3, x6, x25, sp + \op \reg1, \reg2, [\base], #16 + \op \reg1, \reg2, [\base, #32]! + \op \reg2, \reg1, [\base], #32 + \op \reg2, \reg1, [\base, #16]! + .endr + .endm + + .macro ldst_pair_wb_1 op, reg1, width + .irp reg2 0, 14, 21, 23, 29 + ldst_pair_wb_2 \op, \reg1, \width\reg2 + .endr + .endm + + .macro ldst_pair_wb_64 op + .irp reg1 x2, x15, x16, x27, x30, xzr + ldst_pair_wb_1 \op, \reg1, x + .endr + .endm + + .macro ldst_pair_wb_32 op + .irp reg1 w1, w12, w16, w19, w30, wzr + ldst_pair_wb_1 \op, \reg1, w + .endr + .endm + + .macro ldst_single_wb_1 op, reg + .irp base x1, x4, x13, x26, sp + \op \reg, [\base], #16 + .endr + .endm + + .macro ldst_single_wb_32 op + .irp reg w0, w3, w12, w21, w28, w30, wzr + ldst_single_wb_1 \op, \reg + .endr + .endm + + .macro ldst_single_wb_64 op + .irp reg x2, x5, x17, x23, x24, x30, xzr + ldst_single_wb_1 \op, \reg + .endr + .endm + + ldst_pair_wb_32 stp + ldst_pair_wb_64 stp + + ldst_pair_wb_32 ldp + ldst_pair_wb_64 ldp + + ldst_pair_wb_64 ldpsw + + ldst_single_wb_32 str + ldst_single_wb_64 str + + ldst_single_wb_32 strb + + ldst_single_wb_32 strh + + ldst_single_wb_32 ldr + ldst_single_wb_64 ldr + + ldst_single_wb_32 ldrb + + ldst_single_wb_32 ldrh + + ldst_single_wb_32 ldrsb + ldst_single_wb_64 ldrsb + + ldst_single_wb_32 ldrsh + ldst_single_wb_64 ldrsh + + ldst_single_wb_64 ldrsw -- 2.30.2