Module: wine Branch: master Commit: f2b5f71218e40e9afe87c33a3db47c65bfd10678 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f2b5f71218e40e9afe87c33a3d...
Author: Matteo Bruni mbruni@codeweavers.com Date: Fri Jul 20 16:37:38 2012 +0200
d3dcompiler: Parse unary and prefix operators.
---
dlls/d3dcompiler_43/d3dcompiler_private.h | 8 ++++ dlls/d3dcompiler_43/hlsl.y | 58 +++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 0 deletions(-)
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index 32d378a..769bf74 100644 --- a/dlls/d3dcompiler_43/d3dcompiler_private.h +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h @@ -904,6 +904,14 @@ struct parse_variable_def struct list *initializer; };
+enum parse_unary_op +{ + UNARY_OP_PLUS, + UNARY_OP_MINUS, + UNARY_OP_LOGICNOT, + UNARY_OP_BITNOT, +}; + struct hlsl_parse_ctx { const char **source_files; diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y index c84736b..6cc2150 100644 --- a/dlls/d3dcompiler_43/hlsl.y +++ b/dlls/d3dcompiler_43/hlsl.y @@ -206,6 +206,7 @@ static unsigned int components_count_expr_list(struct list *list) struct hlsl_ir_function_decl *function; struct parse_parameter parameter; struct parse_variable_def *variable_def; + enum parse_unary_op unary_op; }
%token KW_BLENDSTATE @@ -350,6 +351,7 @@ static unsigned int components_count_expr_list(struct list *list) %type <instr> conditional_expr %type <instr> assignment_expr %type <list> expr_statement +%type <unary_op> unary_op %type <modifiers> input_mod %%
@@ -982,6 +984,62 @@ unary_expr: postfix_expr { $$ = $1; } + | OP_INC unary_expr + { + struct hlsl_ir_node *operands[3]; + struct source_location loc; + + operands[0] = $2; + operands[1] = operands[2] = NULL; + set_location(&loc, &@1); + $$ = &new_expr(HLSL_IR_BINOP_PREINC, operands, &loc)->node; + } + | OP_DEC unary_expr + { + struct hlsl_ir_node *operands[3]; + struct source_location loc; + + operands[0] = $2; + operands[1] = operands[2] = NULL; + set_location(&loc, &@1); + $$ = &new_expr(HLSL_IR_BINOP_PREDEC, operands, &loc)->node; + } + | unary_op unary_expr + { + enum hlsl_ir_expr_op ops[] = {0, HLSL_IR_UNOP_NEG, + HLSL_IR_UNOP_LOGIC_NOT, HLSL_IR_UNOP_BIT_NOT}; + struct hlsl_ir_node *operands[3]; + struct source_location loc; + + if ($1 == UNARY_OP_PLUS) + { + $$ = $2; + } + else + { + operands[0] = $2; + operands[1] = operands[2] = NULL; + set_location(&loc, &@1); + $$ = &new_expr(ops[$1], operands, &loc)->node; + } + } + +unary_op: '+' + { + $$ = UNARY_OP_PLUS; + } + | '-' + { + $$ = UNARY_OP_MINUS; + } + | '!' + { + $$ = UNARY_OP_LOGICNOT; + } + | '~' + { + $$ = UNARY_OP_BITNOT; + }
mul_expr: unary_expr {