summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assembler/gram.y11
-rw-r--r--assembler/lex.l12
2 files changed, 13 insertions, 10 deletions
diff --git a/assembler/gram.y b/assembler/gram.y
index f2120855..aadc5022 100644
--- a/assembler/gram.y
+++ b/assembler/gram.y
@@ -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;
}
;
diff --git a/assembler/lex.l b/assembler/lex.l
index 5deb3c95..e971360d 100644
--- a/assembler/lex.l
+++ b/assembler/lex.l
@@ -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]+ {