Commit f2b5f712 authored by Matteo Bruni's avatar Matteo Bruni Committed by Alexandre Julliard

d3dcompiler: Parse unary and prefix operators.

parent e851bf21
...@@ -904,6 +904,14 @@ struct parse_variable_def ...@@ -904,6 +904,14 @@ struct parse_variable_def
struct list *initializer; struct list *initializer;
}; };
enum parse_unary_op
{
UNARY_OP_PLUS,
UNARY_OP_MINUS,
UNARY_OP_LOGICNOT,
UNARY_OP_BITNOT,
};
struct hlsl_parse_ctx struct hlsl_parse_ctx
{ {
const char **source_files; const char **source_files;
......
...@@ -206,6 +206,7 @@ static unsigned int components_count_expr_list(struct list *list) ...@@ -206,6 +206,7 @@ static unsigned int components_count_expr_list(struct list *list)
struct hlsl_ir_function_decl *function; struct hlsl_ir_function_decl *function;
struct parse_parameter parameter; struct parse_parameter parameter;
struct parse_variable_def *variable_def; struct parse_variable_def *variable_def;
enum parse_unary_op unary_op;
} }
%token KW_BLENDSTATE %token KW_BLENDSTATE
...@@ -350,6 +351,7 @@ static unsigned int components_count_expr_list(struct list *list) ...@@ -350,6 +351,7 @@ static unsigned int components_count_expr_list(struct list *list)
%type <instr> conditional_expr %type <instr> conditional_expr
%type <instr> assignment_expr %type <instr> assignment_expr
%type <list> expr_statement %type <list> expr_statement
%type <unary_op> unary_op
%type <modifiers> input_mod %type <modifiers> input_mod
%% %%
...@@ -982,6 +984,62 @@ unary_expr: postfix_expr ...@@ -982,6 +984,62 @@ unary_expr: postfix_expr
{ {
$$ = $1; $$ = $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 mul_expr: unary_expr
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment