Module: Mesa
Branch: master
Commit: cd772d5687584891c568446630ec175079f870ab
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=cd772d5687584891c568446630ec175079f870ab

Author: Connor Abbott <[email protected]>
Date:   Mon Mar  8 19:10:24 2021 +0100

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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9463>

---

 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 8bad625a549..7d11ef4902f 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 1ad4d140e5d..2766822a36f 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 <tok> T_HR
 %token <tok> T_HC
-%token <tok> T_HP
 
 /* dst register flags */
 %token <tok> 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

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to