This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH bfin] Check register in compare instruction


All the following instructions are illegal on Blackfin:

CC = I0 == 0;
CC = I0 == I0;
CC = I0 < 0;
CC = I0 < I0;
CC = I0 <= 0;
CC = I0 <= I0;

I have just committed the attached patch to catch them.


Jie
	* config/bfin-parse.y (asm_1): Only PREG and DREG are allowed
	in comparison.

	testsuite/
	* gas/bfin/expected_comparison_errors.s: Add more cases.
	* gas/bfin/expected_comparison_errors.l: Update accordingly.

Index: config/bfin-parse.y
===================================================================
RCS file: /cvs/src/src/gas/config/bfin-parse.y,v
retrieving revision 1.24
diff -u -p -r1.24 bfin-parse.y
--- config/bfin-parse.y	11 Aug 2009 18:44:12 -0000	1.24
+++ config/bfin-parse.y	1 Sep 2009 07:06:21 -0000
@@ -1623,16 +1623,20 @@ asm_1:   
 	}
 	| CCREG ASSIGN REG LESS_THAN REG iu_or_nothing
 	{
-	  if (REG_CLASS($3) == REG_CLASS($5))
+	  if ((IS_DREG ($3) && IS_DREG ($5))
+	      || (IS_PREG ($3) && IS_PREG ($5)))
 	    {
 	      notethat ("CCflag: CC = dpregs < dpregs\n");
 	      $$ = CCFLAG (&$3, $5.regno & CODE_MASK, $6.r0, 0, IS_PREG ($3) ? 1 : 0);
 	    }
 	  else
-	    return yyerror ("Compare only of same register class");
+	    return yyerror ("Bad register in comparison");
 	}
 	| CCREG ASSIGN REG LESS_THAN expr iu_or_nothing
 	{
+	  if (!IS_DREG ($3) && !IS_PREG ($3))
+	    return yyerror ("Bad register in comparison");
+
 	  if (($6.r0 == 1 && IS_IMM ($5, 3))
 	      || ($6.r0 == 3 && IS_UIMM ($5, 3)))
 	    {
@@ -1644,16 +1648,20 @@ asm_1:   
 	}
 	| CCREG ASSIGN REG _ASSIGN_ASSIGN REG
 	{
-	  if (REG_CLASS($3) == REG_CLASS($5))
+	  if ((IS_DREG ($3) && IS_DREG($5))
+	      || (IS_PREG ($3) && IS_PREG ($3)))
 	    {
 	      notethat ("CCflag: CC = dpregs == dpregs\n");
 	      $$ = CCFLAG (&$3, $5.regno & CODE_MASK, 0, 0, IS_PREG ($3) ? 1 : 0);
 	    }
 	  else
-	    return yyerror ("Compare only of same register class");
+	    return yyerror ("Bad register in comparison");
 	}
 	| CCREG ASSIGN REG _ASSIGN_ASSIGN expr
 	{
+	  if (!IS_DREG ($3) && !IS_PREG ($3))
+	    return yyerror ("Bad register in comparison");
+
 	  if (IS_IMM ($5, 3))
 	    {
 	      notethat ("CCflag: CC = dpregs == imm3\n");
@@ -1674,34 +1682,26 @@ asm_1:   
 	}
 	| CCREG ASSIGN REG _LESS_THAN_ASSIGN REG iu_or_nothing
 	{
-	  if (REG_CLASS($3) == REG_CLASS($5))
+	  if ((IS_DREG ($3) && IS_DREG ($5))
+	      || (IS_PREG ($3) && IS_PREG ($5)))
 	    {
-	      notethat ("CCflag: CC = pregs <= pregs (..)\n");
+	      notethat ("CCflag: CC = dpregs <= dpregs (..)\n");
 	      $$ = CCFLAG (&$3, $5.regno & CODE_MASK,
 			   1 + $6.r0, 0, IS_PREG ($3) ? 1 : 0);
 	    }
 	  else
-	    return yyerror ("Compare only of same register class");
+	    return yyerror ("Bad register in comparison");
 	}
 	| CCREG ASSIGN REG _LESS_THAN_ASSIGN expr iu_or_nothing
 	{
+	  if (!IS_DREG ($3) && !IS_PREG ($3))
+	    return yyerror ("Bad register in comparison");
+
 	  if (($6.r0 == 1 && IS_IMM ($5, 3))
 	      || ($6.r0 == 3 && IS_UIMM ($5, 3)))
 	    {
-	      if (IS_DREG ($3))
-		{
-		  notethat ("CCflag: CC = dregs <= (u)imm3\n");
-		  /*    x       y     opc     I     G   */
-		  $$ = CCFLAG (&$3, imm3 ($5), 1 + $6.r0, 1, 0);
-		}
-	      else if (IS_PREG ($3))
-		{
-		  notethat ("CCflag: CC = pregs <= (u)imm3\n");
-		  /*    x       y     opc     I     G   */
-		  $$ = CCFLAG (&$3, imm3 ($5), 1 + $6.r0, 1, 1);
-		}
-	      else
-		return yyerror ("Dreg or Preg expected");
+	      notethat ("CCflag: CC = dpregs <= (u)imm3\n");
+	      $$ = CCFLAG (&$3, imm3 ($5), 1 + $6.r0, 1, IS_PREG ($3) ? 1 : 0);
 	    }
 	  else
 	    return yyerror ("Bad constant value");
Index: testsuite/gas/bfin/expected_comparison_errors.l
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/bfin/expected_comparison_errors.l,v
retrieving revision 1.1
diff -u -p -r1.1 expected_comparison_errors.l
--- testsuite/gas/bfin/expected_comparison_errors.l	26 Mar 2008 15:18:42 -0000	1.1
+++ testsuite/gas/bfin/expected_comparison_errors.l	1 Sep 2009 07:06:22 -0000
@@ -8,9 +8,14 @@
 .*:7: Error: AREGs are in bad order or same. Input text was a0.
 .*:8: Error: AREGs are in bad order or same. Input text was a1.
 .*:9: Error: AREGs are in bad order or same. Input text was a0.
-.*:10: Error: Compare only of same register class. Input text was P0.
-.*:11: Error: Compare only of same register class.
-.*:12: Error: Compare only of same register class.
-.*:13: Error: Compare only of same register class. Input text was R0.
-.*:14: Error: Compare only of same register class.
-.*:15: Error: Compare only of same register class.
+.*:10: Error: Bad register in comparison. Input text was P0.
+.*:11: Error: Bad register in comparison.
+.*:12: Error: Bad register in comparison.
+.*:14: Error: Bad register in comparison.
+.*:15: Error: Bad register in comparison.
+.*:16: Error: Bad register in comparison.
+.*:17: Error: Bad register in comparison. Input text was I0.
+.*:18: Error: Bad register in comparison.
+.*:19: Error: Bad register in comparison.
+.*:20: Error: Bad register in comparison.
+.*:21: Error: Bad register in comparison.
Index: testsuite/gas/bfin/expected_comparison_errors.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/bfin/expected_comparison_errors.s,v
retrieving revision 1.1
diff -u -p -r1.1 expected_comparison_errors.s
--- testsuite/gas/bfin/expected_comparison_errors.s	26 Mar 2008 15:18:42 -0000	1.1
+++ testsuite/gas/bfin/expected_comparison_errors.s	1 Sep 2009 07:06:22 -0000
@@ -13,3 +13,9 @@
 	CC = P0 == R0;
 	CC = P0 < R0;
 	CC = P0 <= R0;
+	CC = I0 == 0;
+	CC = I0 == I0;
+	CC = I0 < 0;
+	CC = I0 < I0;
+	CC = I0 <= 0;
+	CC = I0 <= I0;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]