gas: blackfin: reject invalid register destinations for vector add/sub
authorMike Frysinger <vapier@gentoo.org>
Thu, 24 Mar 2011 06:17:47 +0000 (06:17 +0000)
committerMike Frysinger <vapier@gentoo.org>
Thu, 24 Mar 2011 06:17:47 +0000 (06:17 +0000)
The destination registers with vector add/sub insns must be different,
so make sure gas rejects attempt to write these.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
gas/ChangeLog
gas/config/bfin-parse.y
gas/testsuite/ChangeLog
gas/testsuite/gas/bfin/expected_errors.l
gas/testsuite/gas/bfin/expected_errors.s

index 4c4a03c4aad822ff10d2f30ff584dc3b0af16acb..61478ffe405329258f3d8b1cfd0f09bc2500ac50 100644 (file)
@@ -1,3 +1,10 @@
+2011-03-24  Mike Frysinger  <vapier@gentoo.org>
+
+       * config/bfin-parse.y (dual 32bit add/sub): Return yyerror when dest
+       reg $1 is the same as dest reg $7.
+       (quad 16bit add/sub): Return yyerror when dest reg $1 is the same as
+       dest reg $7.
+
 2011-03-24  Mike Frysinger  <vapier@gentoo.org>
 
        * config/bfin-parse.y (check_macfuncs): Clarify error message when
index f20d20b3c18addd85d990860eb1d65f1b0e959f2..803afd1c55299c2cc1628f4f5d4978b5f3158837 100644 (file)
@@ -1,5 +1,5 @@
 /* bfin-parse.y  ADI Blackfin parser
-   Copyright 2005, 2006, 2007, 2008, 2009, 2010
+   Copyright 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
@@ -898,6 +898,9 @@ asm_1:
 
        | REG ASSIGN REG_A PLUS REG_A COMMA REG ASSIGN REG_A MINUS REG_A amod1
        {
+         if (REG_SAME ($1, $7))
+           return yyerror ("Resource conflict in dest reg");
+
          if (IS_DREG ($1) && IS_DREG ($7) && !REG_SAME ($3, $5)
              && IS_A1 ($9) && !IS_A1 ($11))
            {
@@ -941,6 +944,8 @@ asm_1:
          if (!IS_DREG ($1) || !IS_DREG ($3) || !IS_DREG ($5) || !IS_DREG ($7))
            return yyerror ("Dregs expected");
 
+         if (REG_SAME ($1, $7))
+           return yyerror ("Resource conflict in dest reg");
 
          if ($4.r0 == 1 && $10.r0 == 2)
            {
index ce01151d76de6cfd24713754f2512dcc77529255..7975fb851f9196a8701a9c0b90816def97441a59 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-24  Mike Frysinger  <vapier@gentoo.org>
+
+       * gas/bfin/expected_errors.s: Add invalid vector add/sub insn tests.
+       * gas/bfin/expected_errors.l: Add new error messages.
+
 2011-03-24  Mike Frysinger  <vapier@gentoo.org>
 
        * gas/bfin/16bit_illegals.d, gas/bfin/16bit_illegals.s: Delete.
index 316ff20f661247a605685c8e933d1ef158e3e97b..863b30bdadc28f980935c5ffd7d1f53b3269b4fa 100644 (file)
@@ -95,3 +95,8 @@
 .*:120: Error: Destination Dregs \(full\) must differ by one.
 .*:121: Error: Destination Dregs \(half\) must match.
 .*:122: Error: Destination Dreg sizes \(full or half\) must match.
+.*:124: Error: Resource conflict in dest reg.
+.*:125: Error: Differing source registers.
+.*:126: Error: Resource conflict in dest reg.
+.*:127: Error: Differing source registers.
+.*:129: Error: Register mismatch.
index 736613ff72044c7dc1261bd95c228153c68f932d..46be66c3a4728d7ee0b534fb06cd8126554f57b4 100644 (file)
        R0 = A0, R3 = A1;
        R0.L = A0, R1.H = A1;
        R0 = A0, R1.H = A1;
+
+       R0 = R1 +|+ R2, R0 = R1 -|- R2;
+       R0 = R4 +|+ R5, R1 = R6 -|- R7;
+       R1 = R3 +|- R7, R1 = R3 -|+ R7;
+       R7 = R3 +|- R4, R1 = R1 -|+ R2;
+
+       R0 = R3 + R4, R1 = R5 - R6;