Module: wine Branch: master Commit: 6c92d78c8c48bfd2ffb2ccdc863597dce1bb75a6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6c92d78c8c48bfd2ffb2ccdc86...
Author: Matteo Bruni mbruni@codeweavers.com Date: Wed Jul 18 16:25:15 2012 +0200
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(+), 0 deletions(-)
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index 32d9c9d..32d378a 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 799aa12..8dd2e70 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 f10d6a6..afb441c 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));