Avoid shift/reduce conflict in predicate by making flagreg and subreg 1 token.
authorEric Anholt <eric@anholt.net>
Tue, 29 Aug 2006 16:30:32 +0000 (09:30 -0700)
committerDamien Lespiau <damien.lespiau@intel.com>
Mon, 4 Mar 2013 15:54:23 +0000 (15:54 +0000)
Thanks to keithp for pointing out where the conflict was.

assembler/gram.y
assembler/lex.l

index f212085..aadc502 100644 (file)
@@ -651,16 +651,11 @@ accreg:           ACCREG subregnum
                }
 ;
 
-flagreg:       FLAGREG subregnum
+flagreg:       FLAGREG
                {
-                 if ($1 > 0) {
-                   fprintf(stderr,
-                           "flag register number %d out of range", $1);
-                   YYERROR;
-                 }
                  $$.reg_file = BRW_ARCHITECTURE_REGISTER_FILE;
-                 $$.reg_nr = BRW_ARF_FLAG | $1;
-                 $$.subreg_nr = $2;
+                 $$.reg_nr = BRW_ARF_FLAG | 0;
+                 $$.subreg_nr = $1;
                }
 ;
 
index 5deb3c9..e971360 100644 (file)
@@ -136,8 +136,16 @@ int saved_state = INITIAL;
        yylval.integer = atoi(yytext + 1);
        return NOTIFYREG;
 }
-"f"[0-9]+ {
-       yylval.integer = atoi(yytext + 1);
+ /* Unlike other registers, flagreg returns the subreg number in the lvalue
+  * rather than the reg number, to avoid a shift/reduce conflict in the
+  * predicate control.
+  */
+"f0.[0-9]+" {
+       yylval.integer = atoi(yytext + 3);
+       return FLAGREG;
+}
+"f0" {
+       yylval.integer = 0;
        return FLAGREG;
 }
 [gr][0-9]+ {