From cd772d5687584891c568446630ec175079f870ab Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Mon, 8 Mar 2021 19:10:24 +0100 Subject: [PATCH] ir3/parser: Fix parsing of "0.0" in @const line Trying to specify a floating-point value in a @const line would result in it getting interpreted as a FLUT value and failing parsing. Fix this by making the various FLUT tokens include the surrounding parentheses. Part-of: --- src/freedreno/ir3/ir3_lexer.l | 26 +++++++++++++------------- src/freedreno/ir3/ir3_parser.y | 11 +++++------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/freedreno/ir3/ir3_lexer.l b/src/freedreno/ir3/ir3_lexer.l index 8bad625..7d11ef4 100644 --- a/src/freedreno/ir3/ir3_lexer.l +++ b/src/freedreno/ir3/ir3_lexer.l @@ -89,18 +89,18 @@ static int parse_w(const char *str) "\n" yylineno++; [ \t] ; /* ignore whitespace */ ";"[^\n]*"\n" yylineno++; /* ignore comments */ -"0.0" ir3_yylval.num = 0; return T_FLUT_0_0; -"0.5" ir3_yylval.num = 1; return T_FLUT_0_5; -"1.0" ir3_yylval.num = 2; return T_FLUT_1_0; -"2.0" ir3_yylval.num = 3; return T_FLUT_2_0; -"e" ir3_yylval.num = 4; return T_FLUT_E; -"pi" ir3_yylval.num = 5; return T_FLUT_PI; -"1/pi" ir3_yylval.num = 6; return T_FLUT_INV_PI; -"1/log2(e)" ir3_yylval.num = 7; return T_FLUT_INV_LOG2_E; -"log2(e)" ir3_yylval.num = 8; return T_FLUT_LOG2_E; -"1/log2(10)" ir3_yylval.num = 9; return T_FLUT_INV_LOG2_10; -"log2(10)" ir3_yylval.num = 10; return T_FLUT_LOG2_10; -"4.0" ir3_yylval.num = 11; return T_FLUT_4_0; +"(0.0)" ir3_yylval.num = 0; return T_FLUT_0_0; +"(0.5)" ir3_yylval.num = 1; return T_FLUT_0_5; +"(1.0)" ir3_yylval.num = 2; return T_FLUT_1_0; +"(2.0)" ir3_yylval.num = 3; return T_FLUT_2_0; +"(e)" ir3_yylval.num = 4; return T_FLUT_E; +"(pi)" ir3_yylval.num = 5; return T_FLUT_PI; +"(1/pi)" ir3_yylval.num = 6; return T_FLUT_INV_PI; +"(1/log2(e))" ir3_yylval.num = 7; return T_FLUT_INV_LOG2_E; +"(log2(e))" ir3_yylval.num = 8; return T_FLUT_LOG2_E; +"(1/log2(10))" ir3_yylval.num = 9; return T_FLUT_INV_LOG2_10; +"(log2(10))" ir3_yylval.num = 10; return T_FLUT_LOG2_10; +"(4.0)" ir3_yylval.num = 11; return T_FLUT_4_0; [0-9]+"."[0-9]+ ir3_yylval.flt = strtod(yytext, NULL); return T_FLOAT; [0-9]* ir3_yylval.num = strtoul(yytext, NULL, 0); return T_INT; "0x"[0-9a-fA-F]* ir3_yylval.num = strtoul(yytext, NULL, 0); return T_HEX; @@ -374,7 +374,7 @@ static int parse_w(const char *str) "nonuniform" return T_NONUNIFORM; "imm" return T_IMM; -"h(" return TOKEN(T_HP); +"h" return 'h'; "=" return '='; "(" return '('; ")" return ')'; diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y index 1ad4d14..2766822 100644 --- a/src/freedreno/ir3/ir3_parser.y +++ b/src/freedreno/ir3/ir3_parser.y @@ -289,7 +289,6 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_HR %token T_HC -%token T_HP /* dst register flags */ %token T_EVEN @@ -1119,16 +1118,16 @@ relative: relative_gpr immediate_cat1: integer { new_reg(0, IR3_REG_IMMED)->iim_val = type_size(instr->cat1.src_type) < 32 ? $1 & 0xffff : $1; } | '(' integer ')' { new_reg(0, IR3_REG_IMMED)->fim_val = $2; } | '(' float ')' { new_reg(0, IR3_REG_IMMED)->fim_val = $2; } -| T_HP integer ')' { new_reg(0, IR3_REG_IMMED | IR3_REG_HALF)->iim_val = $2 & 0xffff; } -| T_HP float ')' { new_reg(0, IR3_REG_IMMED | IR3_REG_HALF)->uim_val = _mesa_float_to_half($2); } +| 'h' '(' integer ')' { new_reg(0, IR3_REG_IMMED | IR3_REG_HALF)->iim_val = $3 & 0xffff; } +| 'h' '(' float ')' { new_reg(0, IR3_REG_IMMED | IR3_REG_HALF)->uim_val = _mesa_float_to_half($3); } | '(' T_NAN ')' { new_reg(0, IR3_REG_IMMED)->fim_val = NAN; } | '(' T_INF ')' { new_reg(0, IR3_REG_IMMED)->fim_val = INFINITY; } immediate: integer { new_reg(0, IR3_REG_IMMED)->iim_val = $1; } | '(' integer ')' { new_reg(0, IR3_REG_IMMED)->fim_val = $2; } -| '(' flut_immed ')' { new_reg(0, IR3_REG_IMMED)->uim_val = $2; } -| T_HP integer ')' { new_reg(0, IR3_REG_IMMED | IR3_REG_HALF)->iim_val = $2; } -| T_HP flut_immed ')' { new_reg(0, IR3_REG_IMMED | IR3_REG_HALF)->uim_val = $2; } +| flut_immed { new_reg(0, IR3_REG_IMMED)->uim_val = $1; } +| 'h' '(' integer ')' { new_reg(0, IR3_REG_IMMED | IR3_REG_HALF)->iim_val = $3; } +| 'h' flut_immed { new_reg(0, IR3_REG_IMMED | IR3_REG_HALF)->uim_val = $2; } /* Float LUT values accepted as immed: */ flut_immed: T_FLUT_0_0 -- 2.7.4