gas/
authorJan Beulich <jbeulich@novell.com>
Wed, 10 Apr 2013 13:20:05 +0000 (13:20 +0000)
committerJan Beulich <jbeulich@novell.com>
Wed, 10 Apr 2013 13:20:05 +0000 (13:20 +0000)
2013-04-10  Jan Beulich <jbeulich@suse.com>

* gas/config/tc-arm.c (encode_arm_addr_mode_3): Only reject base
register being PC when is_t or writeback, and use distinct
diagnostic for the latter case.

gas/testsuite/
2013-04-10  Jan Beulich <jbeulich@suse.com>

* gas/testsuite/gas/arm/ldst-pc.s: Add index, non-writeback
forms of various loads and stores with PC as base.
* gas/testsuite/gas/arm/ldst-pc.d: Update accordingly.

gas/ChangeLog
gas/config/tc-arm.c
gas/testsuite/ChangeLog
gas/testsuite/gas/arm/ldst-pc.d
gas/testsuite/gas/arm/ldst-pc.s
gas/testsuite/gas/arm/sp-pc-validations-bad.l

index 3818536..4419429 100644 (file)
@@ -1,5 +1,11 @@
 2013-04-10  Jan Beulich <jbeulich@suse.com>
 
+       * gas/config/tc-arm.c (encode_arm_addr_mode_3): Only reject base
+       register being PC when is_t or writeback, and use distinct
+       diagnostic for the latter case.
+
+2013-04-10  Jan Beulich <jbeulich@suse.com>
+
        * gas/config/tc-arm.c (parse_operands): Re-write
        po_barrier_or_imm().
        (do_barrier): Remove bogus constraint().
index 10399d6..a72b0b0 100644 (file)
@@ -7196,8 +7196,10 @@ encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
   if (inst.operands[i].immisreg)
     {
       constraint ((inst.operands[i].imm == REG_PC
-                  || inst.operands[i].reg == REG_PC),
+                  || (is_t && inst.operands[i].reg == REG_PC)),
                  BAD_PC_ADDRESSING);
+      constraint (inst.operands[i].reg == REG_PC && inst.operands[i].writeback,
+                 BAD_PC_WRITEBACK);
       inst.instruction |= inst.operands[i].imm;
       if (!inst.operands[i].negative)
        inst.instruction |= INDEX_UP;
index 28aa947..9f8c2a4 100644 (file)
@@ -1,5 +1,11 @@
 2013-04-10  Jan Beulich <jbeulich@suse.com>
 
+       * gas/testsuite/gas/arm/ldst-pc.s: Add index, non-writeback
+       forms of various loads and stores with PC as base.
+       * gas/testsuite/gas/arm/ldst-pc.d: Update accordingly.
+
+2013-04-10  Jan Beulich <jbeulich@suse.com>
+
        * gas/arm/barrier-bad.d: Change title.
        * gas/arm/barrier-bad.s: Add immediate form of ISB and DSB as
        well as one symbolic form of DSB.
index 333d8a0..7a745c5 100644 (file)
@@ -7,10 +7,19 @@
 .*: +file format .*arm.*
 
 Disassembly of section .text:
-0+000 <[^>]*> e51f1008         ldr     r1, \[pc, #-8\] ; 0+000 <[^>]*>
-0+004 <[^>]*> e79f1002         ldr     r1, \[pc, r2\]
-0+008 <[^>]*> f55ff008         pld     \[pc, #-8\]     ; 0+008 <[^>]*>
-0+00c <[^>]*> f7dff001         pld     \[pc, r1\]
-0+010 <[^>]*> f45ff008         pli     \[pc, #-8\]     ; 0+010 <[^>]*>
-0+014 <[^>]*> f6dff001         pli     \[pc, r1\]
-0+018 <[^>]*> e58f1004         str     r1, \[pc, #4\]  ; 0+024 <[^>]*>
+(0[0-9a-f]+) <[^>]+> e51f1008  ldr     r1, \[pc, #-8\] ; \1 <[^>]*>
+0[0-9a-f]+ <[^>]+> e79f1002    ldr     r1, \[pc, r2\]
+0[0-9a-f]+ <[^>]+> e7df1002    ldrb    r1, \[pc, r2\]
+0[0-9a-f]+ <[^>]+> e18f00d2    ldrd    r0, \[pc, r2\]
+0[0-9a-f]+ <[^>]+> e19f10b2    ldrh    r1, \[pc, r2\]
+0[0-9a-f]+ <[^>]+> e19f10d2    ldrsb   r1, \[pc, r2\]
+0[0-9a-f]+ <[^>]+> e19f10f2    ldrsh   r1, \[pc, r2\]
+(0[0-9a-f]+) <[^>]+> f55ff008  pld     \[pc, #-8\]     ; \1 <[^>]*>
+0[0-9a-f]+ <[^>]+> f7dff001    pld     \[pc, r1\]
+(0[0-9a-f]+) <[^>]+> f45ff008  pli     \[pc, #-8\]     ; \1 <[^>]*>
+0[0-9a-f]+ <[^>]+> f6dff001    pli     \[pc, r1\]
+0[0-9a-f]+ <[^>]+> e58f1004    str     r1, \[pc, #4\]  ; 0+038 <[^>]*>
+0[0-9a-f]+ <[^>]+> e78f1002    str     r1, \[pc, r2\]
+0[0-9a-f]+ <[^>]+> e7cf1002    strb    r1, \[pc, r2\]
+0[0-9a-f]+ <[^>]+> e18f00f2    strd    r0, \[pc, r2\]
+0[0-9a-f]+ <[^>]+> e18f10b2    strh    r1, \[pc, r2\]
index eac55fa..2d96e3b 100644 (file)
@@ -5,6 +5,11 @@
        .align 2
        ldr r1, [pc, #-8]
        ldr r1, [pc, r2]
+       ldrb r1, [pc, r2]
+       ldrd r0, r1, [pc, r2]
+       ldrh r1, [pc, r2]
+       ldrsb r1, [pc, r2]
+       ldrsh r1, [pc, r2]
 
        pld [pc, #-8]
        pld [pc, r1]
@@ -13,3 +18,7 @@
        pli [pc, r1]
 
        str r1, [pc, #4]
+       str r1, [pc, r2]
+       strb r1, [pc, r2]
+       strd r0, r1, [pc, r2]
+       strh r1, [pc, r2]
index 048841f..6e0a52b 100644 (file)
@@ -33,8 +33,8 @@
 [^:]*:56: Error: cannot use register index with PC-relative addressing -- `ldrd r0,r1,\[r2,pc\]'
 [^:]*:57: Error: cannot use register index with PC-relative addressing -- `ldrd r0,r1,\[r2,pc\]!'
 [^:]*:58: Error: cannot use register index with PC-relative addressing -- `ldrd r0,r1,\[r2\],pc'
-[^:]*:59: Error: cannot use register index with PC-relative addressing -- `ldrd r0,r1,\[pc,r2\]!'
-[^:]*:60: Error: cannot use register index with PC-relative addressing -- `ldrd r0,r1,\[pc\],r2'
+[^:]*:59: Error: cannot use writeback with PC-relative addressing -- `ldrd r0,r1,\[pc,r2\]!'
+[^:]*:60: Error: cannot use writeback with PC-relative addressing -- `ldrd r0,r1,\[pc\],r2'
 [^:]*:63: Error: r15 not allowed here -- `ldrex pc,\[r0\]'
 [^:]*:64: Error: instruction does not accept this addressing mode -- `ldrex r0,\[pc\]'
 [^:]*:67: Error: r15 not allowed here -- `ldrexb pc,\[r0\]'
@@ -53,8 +53,8 @@
 [^:]*:90: Error: cannot use register index with PC-relative addressing -- `ldrh r0,\[r1,pc\]'
 [^:]*:91: Error: cannot use register index with PC-relative addressing -- `ldrh r0,\[r1,pc\]!'
 [^:]*:92: Error: cannot use register index with PC-relative addressing -- `ldrh r0,\[r1\],pc'
-[^:]*:93: Error: cannot use register index with PC-relative addressing -- `ldrh r0,\[pc,r1\]!'
-[^:]*:94: Error: cannot use register index with PC-relative addressing -- `ldrh r0,\[pc\],r1'
+[^:]*:93: Error: cannot use writeback with PC-relative addressing -- `ldrh r0,\[pc,r1\]!'
+[^:]*:94: Error: cannot use writeback with PC-relative addressing -- `ldrh r0,\[pc\],r1'
 [^:]*:97: Error: r15 not allowed here -- `ldrht pc,\[r0\],#4'
 [^:]*:98: Error: cannot use writeback with PC-relative addressing -- `ldrht r0,\[pc\],#4'
 [^:]*:99: Error: r15 not allowed here -- `ldrht pc,\[r0\],r1'
@@ -71,8 +71,8 @@
 [^:]*:116: Error: cannot use register index with PC-relative addressing -- `ldrsb r0,\[r1,pc\]'
 [^:]*:117: Error: cannot use register index with PC-relative addressing -- `ldrsb r0,\[r1,pc\]!'
 [^:]*:118: Error: cannot use register index with PC-relative addressing -- `ldrsb r0,\[r1\],pc'
-[^:]*:119: Error: cannot use register index with PC-relative addressing -- `ldrsb r0,\[pc,r1\]!'
-[^:]*:120: Error: cannot use register index with PC-relative addressing -- `ldrsb r0,\[pc\],r1'
+[^:]*:119: Error: cannot use writeback with PC-relative addressing -- `ldrsb r0,\[pc,r1\]!'
+[^:]*:120: Error: cannot use writeback with PC-relative addressing -- `ldrsb r0,\[pc\],r1'
 [^:]*:123: Error: r15 not allowed here -- `ldrsbt pc,\[r0\],#4'
 [^:]*:124: Error: cannot use writeback with PC-relative addressing -- `ldrsbt r0,\[pc\],#4'
 [^:]*:125: Error: r15 not allowed here -- `ldrsbt pc,\[r0\],r1'
@@ -89,8 +89,8 @@
 [^:]*:142: Error: cannot use register index with PC-relative addressing -- `ldrsh r0,\[r1,pc\]'
 [^:]*:143: Error: cannot use register index with PC-relative addressing -- `ldrsh r0,\[r1,pc\]!'
 [^:]*:144: Error: cannot use register index with PC-relative addressing -- `ldrsh r0,\[r1\],pc'
-[^:]*:145: Error: cannot use register index with PC-relative addressing -- `ldrsh r0,\[pc,r1\]!'
-[^:]*:146: Error: cannot use register index with PC-relative addressing -- `ldrsh r0,\[pc\],r1'
+[^:]*:145: Error: cannot use writeback with PC-relative addressing -- `ldrsh r0,\[pc,r1\]!'
+[^:]*:146: Error: cannot use writeback with PC-relative addressing -- `ldrsh r0,\[pc\],r1'
 [^:]*:149: Error: r15 not allowed here -- `ldrsht pc,\[r0\],#4'
 [^:]*:150: Error: cannot use writeback with PC-relative addressing -- `ldrsht r0,\[pc\],#4'
 [^:]*:151: Error: r15 not allowed here -- `ldrsht pc,\[r0\],r1'
 [^:]*:209: Error: cannot use register index with PC-relative addressing -- `strd r0,r1,\[r2,pc\]'
 [^:]*:210: Error: cannot use register index with PC-relative addressing -- `strd r0,r1,\[r2,pc\]!'
 [^:]*:211: Error: cannot use register index with PC-relative addressing -- `strd r0,r1,\[r2\],pc'
-[^:]*:212: Error: cannot use register index with PC-relative addressing -- `strd r0,r1,\[pc,r2\]!'
-[^:]*:213: Error: cannot use register index with PC-relative addressing -- `strd r0,r1,\[pc\],r2'
+[^:]*:212: Error: cannot use writeback with PC-relative addressing -- `strd r0,r1,\[pc,r2\]!'
+[^:]*:213: Error: cannot use writeback with PC-relative addressing -- `strd r0,r1,\[pc\],r2'
 [^:]*:216: Error: r15 not allowed here -- `strex pc,r0,\[r1\]'
 [^:]*:217: Error: r15 not allowed here -- `strex r0,pc,\[r1\]'
 [^:]*:218: Error: instruction does not accept this addressing mode -- `strex r0,r1,\[pc\]'
 [^:]*:245: Error: cannot use register index with PC-relative addressing -- `strh r0,\[r1,pc\]'
 [^:]*:246: Error: cannot use register index with PC-relative addressing -- `strh r0,\[r1,pc\]!'
 [^:]*:247: Error: cannot use register index with PC-relative addressing -- `strh r0,\[r1\],pc'
-[^:]*:248: Error: cannot use register index with PC-relative addressing -- `strh r0,\[pc,r1\]!'
-[^:]*:249: Error: cannot use register index with PC-relative addressing -- `strh r0,\[pc\],r1'
+[^:]*:248: Error: cannot use writeback with PC-relative addressing -- `strh r0,\[pc,r1\]!'
+[^:]*:249: Error: cannot use writeback with PC-relative addressing -- `strh r0,\[pc\],r1'
 [^:]*:252: Error: r15 not allowed here -- `strht pc,\[r0\],#4'
 [^:]*:253: Error: cannot use writeback with PC-relative addressing -- `strht r0,\[pc\],#4'
 [^:]*:254: Error: r15 not allowed here -- `strht pc,\[r0\],r1'