From 6c92d78c8c48bfd2ffb2ccdc863597dce1bb75a6 Mon Sep 17 00:00:00 2001 From: Matteo Bruni Date: Wed, 18 Jul 2012 16:25:15 +0200 Subject: [PATCH] d3dcompiler: Parse relational operators, stub out more rules. --- dlls/d3dcompiler_43/d3dcompiler_private.h | 12 ++++ dlls/d3dcompiler_43/hlsl.y | 74 +++++++++++++++++++++ dlls/d3dcompiler_43/utils.c | 78 +++++++++++++++++++++++ 3 files changed, 164 insertions(+) diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index 32d9c9d1582..32d378a6431 100644 --- a/dlls/d3dcompiler_43/d3dcompiler_private.h +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h @@ -984,6 +984,18 @@ struct hlsl_ir_expr *hlsl_add(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2 struct source_location *loc) DECLSPEC_HIDDEN; struct hlsl_ir_expr *hlsl_sub(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, struct source_location *loc) DECLSPEC_HIDDEN; +struct hlsl_ir_expr *hlsl_lt(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) DECLSPEC_HIDDEN; +struct hlsl_ir_expr *hlsl_gt(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) DECLSPEC_HIDDEN; +struct hlsl_ir_expr *hlsl_le(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) DECLSPEC_HIDDEN; +struct hlsl_ir_expr *hlsl_ge(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) DECLSPEC_HIDDEN; +struct hlsl_ir_expr *hlsl_eq(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) DECLSPEC_HIDDEN; +struct hlsl_ir_expr *hlsl_ne(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) DECLSPEC_HIDDEN; struct hlsl_ir_deref *new_var_deref(struct hlsl_ir_var *var) DECLSPEC_HIDDEN; void push_scope(struct hlsl_parse_ctx *ctx) DECLSPEC_HIDDEN; BOOL pop_scope(struct hlsl_parse_ctx *ctx) DECLSPEC_HIDDEN; diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y index 799aa12c588..8dd2e703cff 100644 --- a/dlls/d3dcompiler_43/hlsl.y +++ b/dlls/d3dcompiler_43/hlsl.y @@ -1012,46 +1012,120 @@ shift_expr: add_expr { $$ = $1; } + | shift_expr OP_LEFTSHIFT add_expr + { + FIXME("Left shift\n"); + } + | shift_expr OP_RIGHTSHIFT add_expr + { + FIXME("Right shift\n"); + } relational_expr: shift_expr { $$ = $1; } + | relational_expr '<' shift_expr + { + struct source_location loc; + + set_location(&loc, &@2); + $$ = &hlsl_lt($1, $3, &loc)->node; + } + | relational_expr '>' shift_expr + { + struct source_location loc; + + set_location(&loc, &@2); + $$ = &hlsl_gt($1, $3, &loc)->node; + } + | relational_expr OP_LE shift_expr + { + struct source_location loc; + + set_location(&loc, &@2); + $$ = &hlsl_le($1, $3, &loc)->node; + } + | relational_expr OP_GE shift_expr + { + struct source_location loc; + + set_location(&loc, &@2); + $$ = &hlsl_ge($1, $3, &loc)->node; + } equality_expr: relational_expr { $$ = $1; } + | equality_expr OP_EQ relational_expr + { + struct source_location loc; + + set_location(&loc, &@2); + $$ = &hlsl_eq($1, $3, &loc)->node; + } + | equality_expr OP_NE relational_expr + { + struct source_location loc; + + set_location(&loc, &@2); + $$ = &hlsl_ne($1, $3, &loc)->node; + } bitand_expr: equality_expr { $$ = $1; } + | bitand_expr '&' equality_expr + { + FIXME("bitwise AND\n"); + } bitxor_expr: bitand_expr { $$ = $1; } + | bitxor_expr '^' bitand_expr + { + FIXME("bitwise XOR\n"); + } bitor_expr: bitxor_expr { $$ = $1; } + | bitor_expr '|' bitxor_expr + { + FIXME("bitwise OR\n"); + } logicand_expr: bitor_expr { $$ = $1; } + | logicand_expr OP_AND bitor_expr + { + FIXME("logic AND\n"); + } logicor_expr: logicand_expr { $$ = $1; } + | logicor_expr OP_OR logicand_expr + { + FIXME("logic OR\n"); + } conditional_expr: logicor_expr { $$ = $1; } + | logicor_expr '?' expr ':' assignment_expr + { + FIXME("ternary operator\n"); + } assignment_expr: conditional_expr { diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c index f10d6a60942..afb441cc804 100644 --- a/dlls/d3dcompiler_43/utils.c +++ b/dlls/d3dcompiler_43/utils.c @@ -1246,6 +1246,84 @@ struct hlsl_ir_expr *hlsl_sub(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2 return expr; } +struct hlsl_ir_expr *hlsl_lt(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) +{ + struct hlsl_ir_expr *expr; + struct hlsl_ir_node *ops[3]; + + ops[0] = op1; + ops[1] = op2; + ops[2] = NULL; + expr = new_expr(HLSL_IR_BINOP_LESS, ops, loc); + return expr; +} + +struct hlsl_ir_expr *hlsl_gt(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) +{ + struct hlsl_ir_expr *expr; + struct hlsl_ir_node *ops[3]; + + ops[0] = op1; + ops[1] = op2; + ops[2] = NULL; + expr = new_expr(HLSL_IR_BINOP_GREATER, ops, loc); + return expr; +} + +struct hlsl_ir_expr *hlsl_le(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) +{ + struct hlsl_ir_expr *expr; + struct hlsl_ir_node *ops[3]; + + ops[0] = op1; + ops[1] = op2; + ops[2] = NULL; + expr = new_expr(HLSL_IR_BINOP_LEQUAL, ops, loc); + return expr; +} + +struct hlsl_ir_expr *hlsl_ge(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) +{ + struct hlsl_ir_expr *expr; + struct hlsl_ir_node *ops[3]; + + ops[0] = op1; + ops[1] = op2; + ops[2] = NULL; + expr = new_expr(HLSL_IR_BINOP_GEQUAL, ops, loc); + return expr; +} + +struct hlsl_ir_expr *hlsl_eq(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) +{ + struct hlsl_ir_expr *expr; + struct hlsl_ir_node *ops[3]; + + ops[0] = op1; + ops[1] = op2; + ops[2] = NULL; + expr = new_expr(HLSL_IR_BINOP_EQUAL, ops, loc); + return expr; +} + +struct hlsl_ir_expr *hlsl_ne(struct hlsl_ir_node *op1, struct hlsl_ir_node *op2, + struct source_location *loc) +{ + struct hlsl_ir_expr *expr; + struct hlsl_ir_node *ops[3]; + + ops[0] = op1; + ops[1] = op2; + ops[2] = NULL; + expr = new_expr(HLSL_IR_BINOP_NEQUAL, ops, loc); + return expr; +} + struct hlsl_ir_deref *new_var_deref(struct hlsl_ir_var *var) { struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref));