From 8323868b2c70dbbd6d6002e13ce3d5f339a851bb Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Thu, 28 Nov 2024 21:14:35 +0900 Subject: [PATCH] [qfcc] Add an opcode for outer products I'm not sure what it's useful for, but GLSL has a function for it thus I decided to add the instruction to the VM, so this is part of the compiler side. --- tools/qfcc/source/glsl-parse.y | 2 +- tools/qfcc/source/qc-parse.y | 4 +++- tools/qfcc/source/statements.c | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/qfcc/source/glsl-parse.y b/tools/qfcc/source/glsl-parse.y index 8b83637c2..48a01eeaa 100644 --- a/tools/qfcc/source/glsl-parse.y +++ b/tools/qfcc/source/glsl-parse.y @@ -139,7 +139,7 @@ int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); %left SHL SHR %left '+' '-' %left '*' '/' '%' MOD SCALE GEOMETRIC QMUL QVMUL VQMUL -%left HADAMARD CROSS DOT WEDGE REGRESSIVE +%left HADAMARD CROSS DOT OUTER WEDGE REGRESSIVE %right SIZEOF UNARY INCOP REVERSE STAR DUAL UNDUAL %left HYPERUNARY %left '.' '(' '[' diff --git a/tools/qfcc/source/qc-parse.y b/tools/qfcc/source/qc-parse.y index 97d5e992a..ecc3fc693 100644 --- a/tools/qfcc/source/qc-parse.y +++ b/tools/qfcc/source/qc-parse.y @@ -139,7 +139,7 @@ int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); %left SHL SHR %left '+' '-' %left '*' '/' '%' MOD SCALE GEOMETRIC QMUL QVMUL VQMUL -%left HADAMARD CROSS DOT WEDGE REGRESSIVE +%left HADAMARD CROSS DOT OUTER WEDGE REGRESSIVE %right SIZEOF UNARY INCOP REVERSE STAR DUAL UNDUAL %left HYPERUNARY %left '.' '(' '[' @@ -2101,6 +2101,7 @@ expr | expr HADAMARD expr { $$ = binary_expr (QC_HADAMARD, $1, $3); } | expr CROSS expr { $$ = binary_expr (QC_CROSS, $1, $3); } | expr DOT expr { $$ = binary_expr (QC_DOT, $1, $3); } + | expr OUTER expr { $$ = binary_expr (QC_OUTER, $1, $3); } | expr WEDGE expr { $$ = binary_expr (QC_WEDGE, $1, $3); } | expr REGRESSIVE expr { $$ = binary_expr (QC_REGRESSIVE, $1, $3); } ; @@ -2921,6 +2922,7 @@ static keyword_t qf_keywords[] = { {"@hadamard", QC_HADAMARD, }, {"@cross", QC_CROSS, }, {"@dot", QC_DOT, }, + {"@outer", QC_OUTER, }, {"@wedge", QC_WEDGE, }, {"@regressive", QC_REGRESSIVE, }, {"@geometric", QC_GEOMETRIC, }, diff --git a/tools/qfcc/source/statements.c b/tools/qfcc/source/statements.c index 7a8ea7065..fdbb88541 100644 --- a/tools/qfcc/source/statements.c +++ b/tools/qfcc/source/statements.c @@ -607,6 +607,7 @@ convert_op (int op) case QC_CROSS: return "cross"; case QC_WEDGE: return "wedge"; case QC_DOT: return "dot"; + case QC_OUTER: return "outer"; case QC_HADAMARD: return "mul"; case QC_SCALE: return "scale"; case QC_QMUL: return "qmul";