vkd3d-shader/hlsl: Rename hlsl_ir_expr_op members.

For the sake of simplicity and clarity, especially in the interest of allowing
us to have expressions with larger numbers of terms.

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura
2021-08-12 19:36:13 -05:00
committed by Alexandre Julliard
parent b65789e74a
commit 7960f9e373
5 changed files with 134 additions and 146 deletions

View File

@@ -439,7 +439,7 @@ struct hlsl_ir_expr *hlsl_new_cast(struct hlsl_ctx *ctx, struct hlsl_ir_node *no
{ {
struct hlsl_ir_node *cast; struct hlsl_ir_node *cast;
cast = hlsl_new_unary_expr(ctx, HLSL_IR_UNOP_CAST, node, *loc); cast = hlsl_new_unary_expr(ctx, HLSL_OP1_CAST, node, *loc);
if (cast) if (cast)
cast->data_type = type; cast->data_type = type;
return hlsl_ir_expr(cast); return hlsl_ir_expr(cast);
@@ -1035,51 +1035,51 @@ static const char *debug_expr_op(const struct hlsl_ir_expr *expr)
{ {
static const char *const op_names[] = static const char *const op_names[] =
{ {
[HLSL_IR_UNOP_ABS] = "abs", [HLSL_OP1_ABS] = "abs",
[HLSL_IR_UNOP_BIT_NOT] = "~", [HLSL_OP1_BIT_NOT] = "~",
[HLSL_IR_UNOP_CAST] = "cast", [HLSL_OP1_CAST] = "cast",
[HLSL_IR_UNOP_COS] = "cos", [HLSL_OP1_COS] = "cos",
[HLSL_IR_UNOP_COS_REDUCED] = "cos_reduced", [HLSL_OP1_COS_REDUCED] = "cos_reduced",
[HLSL_IR_UNOP_DSX] = "dsx", [HLSL_OP1_DSX] = "dsx",
[HLSL_IR_UNOP_DSY] = "dsy", [HLSL_OP1_DSY] = "dsy",
[HLSL_IR_UNOP_EXP2] = "exp2", [HLSL_OP1_EXP2] = "exp2",
[HLSL_IR_UNOP_FRACT] = "fract", [HLSL_OP1_FRACT] = "fract",
[HLSL_IR_UNOP_LOG2] = "log2", [HLSL_OP1_LOG2] = "log2",
[HLSL_IR_UNOP_LOGIC_NOT] = "!", [HLSL_OP1_LOGIC_NOT] = "!",
[HLSL_IR_UNOP_NEG] = "-", [HLSL_OP1_NEG] = "-",
[HLSL_IR_UNOP_NRM] = "nrm", [HLSL_OP1_NRM] = "nrm",
[HLSL_IR_UNOP_RCP] = "rcp", [HLSL_OP1_RCP] = "rcp",
[HLSL_IR_UNOP_RSQ] = "rsq", [HLSL_OP1_RSQ] = "rsq",
[HLSL_IR_UNOP_SAT] = "sat", [HLSL_OP1_SAT] = "sat",
[HLSL_IR_UNOP_SIGN] = "sign", [HLSL_OP1_SIGN] = "sign",
[HLSL_IR_UNOP_SIN] = "sin", [HLSL_OP1_SIN] = "sin",
[HLSL_IR_UNOP_SIN_REDUCED] = "sin_reduced", [HLSL_OP1_SIN_REDUCED] = "sin_reduced",
[HLSL_IR_UNOP_SQRT] = "sqrt", [HLSL_OP1_SQRT] = "sqrt",
[HLSL_IR_BINOP_ADD] = "+", [HLSL_OP2_ADD] = "+",
[HLSL_IR_BINOP_BIT_AND] = "&", [HLSL_OP2_BIT_AND] = "&",
[HLSL_IR_BINOP_BIT_OR] = "|", [HLSL_OP2_BIT_OR] = "|",
[HLSL_IR_BINOP_BIT_XOR] = "^", [HLSL_OP2_BIT_XOR] = "^",
[HLSL_IR_BINOP_CRS] = "crs", [HLSL_OP2_CRS] = "crs",
[HLSL_IR_BINOP_DIV] = "/", [HLSL_OP2_DIV] = "/",
[HLSL_IR_BINOP_DOT] = "dot", [HLSL_OP2_DOT] = "dot",
[HLSL_IR_BINOP_EQUAL] = "==", [HLSL_OP2_EQUAL] = "==",
[HLSL_IR_BINOP_GEQUAL] = ">=", [HLSL_OP2_GEQUAL] = ">=",
[HLSL_IR_BINOP_GREATER] = ">", [HLSL_OP2_GREATER] = ">",
[HLSL_IR_BINOP_LEQUAL] = "<=", [HLSL_OP2_LEQUAL] = "<=",
[HLSL_IR_BINOP_LESS] = "<", [HLSL_OP2_LESS] = "<",
[HLSL_IR_BINOP_LOGIC_AND] = "&&", [HLSL_OP2_LOGIC_AND] = "&&",
[HLSL_IR_BINOP_LOGIC_OR] = "||", [HLSL_OP2_LOGIC_OR] = "||",
[HLSL_IR_BINOP_LSHIFT] = "<<", [HLSL_OP2_LSHIFT] = "<<",
[HLSL_IR_BINOP_MAX] = "max", [HLSL_OP2_MAX] = "max",
[HLSL_IR_BINOP_MIN] = "min", [HLSL_OP2_MIN] = "min",
[HLSL_IR_BINOP_MOD] = "%", [HLSL_OP2_MOD] = "%",
[HLSL_IR_BINOP_MUL] = "*", [HLSL_OP2_MUL] = "*",
[HLSL_IR_BINOP_NEQUAL] = "!=", [HLSL_OP2_NEQUAL] = "!=",
[HLSL_IR_BINOP_POW] = "pow", [HLSL_OP2_POW] = "pow",
[HLSL_IR_BINOP_RSHIFT] = ">>", [HLSL_OP2_RSHIFT] = ">>",
[HLSL_IR_TEROP_LERP] = "lerp", [HLSL_OP3_LERP] = "lerp",
}; };
return op_names[expr->op]; return op_names[expr->op];

View File

@@ -275,62 +275,51 @@ struct hlsl_ir_loop
enum hlsl_ir_expr_op enum hlsl_ir_expr_op
{ {
HLSL_IR_UNOP_BIT_NOT = 0, HLSL_OP1_ABS,
HLSL_IR_UNOP_LOGIC_NOT, HLSL_OP1_BIT_NOT,
HLSL_IR_UNOP_NEG, HLSL_OP1_CAST,
HLSL_IR_UNOP_ABS, HLSL_OP1_COS,
HLSL_IR_UNOP_SIGN, HLSL_OP1_COS_REDUCED, /* Reduced range [-pi, pi] */
HLSL_IR_UNOP_RCP, HLSL_OP1_DSX,
HLSL_IR_UNOP_RSQ, HLSL_OP1_DSY,
HLSL_IR_UNOP_SQRT, HLSL_OP1_EXP2,
HLSL_IR_UNOP_NRM, HLSL_OP1_FRACT,
HLSL_IR_UNOP_EXP2, HLSL_OP1_LOG2,
HLSL_IR_UNOP_LOG2, HLSL_OP1_LOGIC_NOT,
HLSL_OP1_NEG,
HLSL_OP1_NRM,
HLSL_OP1_RCP,
HLSL_OP1_RSQ,
HLSL_OP1_SAT,
HLSL_OP1_SIGN,
HLSL_OP1_SIN,
HLSL_OP1_SIN_REDUCED, /* Reduced range [-pi, pi] */
HLSL_OP1_SQRT,
HLSL_IR_UNOP_CAST, HLSL_OP2_ADD,
HLSL_OP2_BIT_AND,
HLSL_OP2_BIT_OR,
HLSL_OP2_BIT_XOR,
HLSL_OP2_CRS,
HLSL_OP2_DIV,
HLSL_OP2_DOT,
HLSL_OP2_EQUAL,
HLSL_OP2_GEQUAL,
HLSL_OP2_GREATER,
HLSL_OP2_LEQUAL,
HLSL_OP2_LESS,
HLSL_OP2_LOGIC_AND,
HLSL_OP2_LOGIC_OR,
HLSL_OP2_LSHIFT,
HLSL_OP2_MAX,
HLSL_OP2_MIN,
HLSL_OP2_MOD,
HLSL_OP2_MUL,
HLSL_OP2_NEQUAL,
HLSL_OP2_POW,
HLSL_OP2_RSHIFT,
HLSL_IR_UNOP_FRACT, HLSL_OP3_LERP,
HLSL_IR_UNOP_SIN,
HLSL_IR_UNOP_COS,
HLSL_IR_UNOP_SIN_REDUCED, /* Reduced range [-pi, pi] */
HLSL_IR_UNOP_COS_REDUCED, /* Reduced range [-pi, pi] */
HLSL_IR_UNOP_DSX,
HLSL_IR_UNOP_DSY,
HLSL_IR_UNOP_SAT,
HLSL_IR_BINOP_ADD,
HLSL_IR_BINOP_MUL,
HLSL_IR_BINOP_DIV,
HLSL_IR_BINOP_MOD,
HLSL_IR_BINOP_LESS,
HLSL_IR_BINOP_GREATER,
HLSL_IR_BINOP_LEQUAL,
HLSL_IR_BINOP_GEQUAL,
HLSL_IR_BINOP_EQUAL,
HLSL_IR_BINOP_NEQUAL,
HLSL_IR_BINOP_LOGIC_AND,
HLSL_IR_BINOP_LOGIC_OR,
HLSL_IR_BINOP_LSHIFT,
HLSL_IR_BINOP_RSHIFT,
HLSL_IR_BINOP_BIT_AND,
HLSL_IR_BINOP_BIT_OR,
HLSL_IR_BINOP_BIT_XOR,
HLSL_IR_BINOP_DOT,
HLSL_IR_BINOP_CRS,
HLSL_IR_BINOP_MIN,
HLSL_IR_BINOP_MAX,
HLSL_IR_BINOP_POW,
HLSL_IR_TEROP_LERP,
}; };
struct hlsl_ir_expr struct hlsl_ir_expr

View File

@@ -324,7 +324,7 @@ static bool append_conditional_break(struct hlsl_ctx *ctx, struct list *cond_lis
return true; return true;
condition = node_from_list(cond_list); condition = node_from_list(cond_list);
if (!(not = hlsl_new_unary_expr(ctx, HLSL_IR_UNOP_LOGIC_NOT, condition, condition->loc))) if (!(not = hlsl_new_unary_expr(ctx, HLSL_OP1_LOGIC_NOT, condition, condition->loc)))
return false; return false;
list_add_tail(cond_list, &not->entry); list_add_tail(cond_list, &not->entry);
@@ -535,7 +535,7 @@ static struct hlsl_ir_load *add_load(struct hlsl_ctx *ctx, struct list *instrs,
var = src->var; var = src->var;
if (src->offset.node) if (src->offset.node)
{ {
if (!(add = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_ADD, src->offset.node, offset))) if (!(add = hlsl_new_binary_expr(ctx, HLSL_OP2_ADD, src->offset.node, offset)))
return NULL; return NULL;
list_add_tail(instrs, &add->entry); list_add_tail(instrs, &add->entry);
offset = add; offset = add;
@@ -604,7 +604,7 @@ static struct hlsl_ir_load *add_array_load(struct hlsl_ctx *ctx, struct list *in
if (!(c = hlsl_new_uint_constant(ctx, data_type->reg_size, loc))) if (!(c = hlsl_new_uint_constant(ctx, data_type->reg_size, loc)))
return NULL; return NULL;
list_add_tail(instrs, &c->node.entry); list_add_tail(instrs, &c->node.entry);
if (!(mul = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_MUL, index, &c->node))) if (!(mul = hlsl_new_binary_expr(ctx, HLSL_OP2_MUL, index, &c->node)))
return NULL; return NULL;
list_add_tail(instrs, &mul->entry); list_add_tail(instrs, &mul->entry);
index = mul; index = mul;
@@ -1117,16 +1117,16 @@ static enum hlsl_ir_expr_op op_from_assignment(enum parse_assign_op op)
static const enum hlsl_ir_expr_op ops[] = static const enum hlsl_ir_expr_op ops[] =
{ {
0, 0,
HLSL_IR_BINOP_ADD, HLSL_OP2_ADD,
0, 0,
HLSL_IR_BINOP_MUL, HLSL_OP2_MUL,
HLSL_IR_BINOP_DIV, HLSL_OP2_DIV,
HLSL_IR_BINOP_MOD, HLSL_OP2_MOD,
HLSL_IR_BINOP_LSHIFT, HLSL_OP2_LSHIFT,
HLSL_IR_BINOP_RSHIFT, HLSL_OP2_RSHIFT,
HLSL_IR_BINOP_BIT_AND, HLSL_OP2_BIT_AND,
HLSL_IR_BINOP_BIT_OR, HLSL_OP2_BIT_OR,
HLSL_IR_BINOP_BIT_XOR, HLSL_OP2_BIT_XOR,
}; };
return ops[op]; return ops[op];
@@ -1181,7 +1181,7 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct list *in
struct hlsl_ir_node *args[3] = {rhs}; struct hlsl_ir_node *args[3] = {rhs};
struct hlsl_ir_expr *expr; struct hlsl_ir_expr *expr;
if (!(expr = add_expr(ctx, instrs, HLSL_IR_UNOP_NEG, args, &rhs->loc))) if (!(expr = add_expr(ctx, instrs, HLSL_OP1_NEG, args, &rhs->loc)))
return NULL; return NULL;
rhs = &expr->node; rhs = &expr->node;
assign_op = ASSIGN_OP_ADD; assign_op = ASSIGN_OP_ADD;
@@ -1211,7 +1211,7 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct list *in
while (lhs->type != HLSL_IR_LOAD) while (lhs->type != HLSL_IR_LOAD)
{ {
if (lhs->type == HLSL_IR_EXPR && hlsl_ir_expr(lhs)->op == HLSL_IR_UNOP_CAST) if (lhs->type == HLSL_IR_EXPR && hlsl_ir_expr(lhs)->op == HLSL_OP1_CAST)
{ {
FIXME("Cast on the lhs.\n"); FIXME("Cast on the lhs.\n");
vkd3d_free(store); vkd3d_free(store);
@@ -2835,8 +2835,7 @@ unary_expr:
} }
| unary_op unary_expr | unary_op unary_expr
{ {
enum hlsl_ir_expr_op ops[] = {0, HLSL_IR_UNOP_NEG, static const enum hlsl_ir_expr_op ops[] = {0, HLSL_OP1_NEG, HLSL_OP1_LOGIC_NOT, HLSL_OP1_BIT_NOT};
HLSL_IR_UNOP_LOGIC_NOT, HLSL_IR_UNOP_BIT_NOT};
if ($1 == UNARY_OP_PLUS) if ($1 == UNARY_OP_PLUS)
$$ = $2; $$ = $2;
@@ -2901,31 +2900,31 @@ mul_expr:
unary_expr unary_expr
| mul_expr '*' unary_expr | mul_expr '*' unary_expr
{ {
$$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_MUL, @2); $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_MUL, @2);
} }
| mul_expr '/' unary_expr | mul_expr '/' unary_expr
{ {
$$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_DIV, @2); $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_DIV, @2);
} }
| mul_expr '%' unary_expr | mul_expr '%' unary_expr
{ {
$$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_MOD, @2); $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_MOD, @2);
} }
add_expr: add_expr:
mul_expr mul_expr
| add_expr '+' mul_expr | add_expr '+' mul_expr
{ {
$$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_ADD, @2); $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_ADD, @2);
} }
| add_expr '-' mul_expr | add_expr '-' mul_expr
{ {
struct hlsl_ir_node *neg; struct hlsl_ir_node *neg;
if (!(neg = hlsl_new_unary_expr(ctx, HLSL_IR_UNOP_NEG, node_from_list($3), @2))) if (!(neg = hlsl_new_unary_expr(ctx, HLSL_OP1_NEG, node_from_list($3), @2)))
YYABORT; YYABORT;
list_add_tail($3, &neg->entry); list_add_tail($3, &neg->entry);
$$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_ADD, @2); $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_ADD, @2);
} }
shift_expr: shift_expr:
@@ -2943,30 +2942,30 @@ relational_expr:
shift_expr shift_expr
| relational_expr '<' shift_expr | relational_expr '<' shift_expr
{ {
$$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_LESS, @2); $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_LESS, @2);
} }
| relational_expr '>' shift_expr | relational_expr '>' shift_expr
{ {
$$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_GREATER, @2); $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_GREATER, @2);
} }
| relational_expr OP_LE shift_expr | relational_expr OP_LE shift_expr
{ {
$$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_LEQUAL, @2); $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_LEQUAL, @2);
} }
| relational_expr OP_GE shift_expr | relational_expr OP_GE shift_expr
{ {
$$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_GEQUAL, @2); $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_GEQUAL, @2);
} }
equality_expr: equality_expr:
relational_expr relational_expr
| equality_expr OP_EQ relational_expr | equality_expr OP_EQ relational_expr
{ {
$$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_EQUAL, @2); $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_EQUAL, @2);
} }
| equality_expr OP_NE relational_expr | equality_expr OP_NE relational_expr
{ {
$$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_NEQUAL, @2); $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_NEQUAL, @2);
} }
bitand_expr: bitand_expr:

View File

@@ -250,7 +250,7 @@ static bool fold_redundant_casts(struct hlsl_ctx *ctx, struct hlsl_ir_node *inst
const struct hlsl_type *src_type = expr->operands[0].node->data_type; const struct hlsl_type *src_type = expr->operands[0].node->data_type;
const struct hlsl_type *dst_type = expr->node.data_type; const struct hlsl_type *dst_type = expr->node.data_type;
if (expr->op != HLSL_IR_UNOP_CAST) if (expr->op != HLSL_OP1_CAST)
return false; return false;
if (hlsl_types_are_equal(src_type, dst_type) if (hlsl_types_are_equal(src_type, dst_type)
@@ -297,7 +297,7 @@ static bool split_struct_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr
offset = &c->node; offset = &c->node;
if (rhs_load->src.offset.node) if (rhs_load->src.offset.node)
{ {
if (!(add = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_ADD, rhs_load->src.offset.node, &c->node))) if (!(add = hlsl_new_binary_expr(ctx, HLSL_OP2_ADD, rhs_load->src.offset.node, &c->node)))
return false; return false;
list_add_before(&instr->entry, &add->entry); list_add_before(&instr->entry, &add->entry);
offset = add; offset = add;
@@ -309,7 +309,7 @@ static bool split_struct_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr
offset = &c->node; offset = &c->node;
if (store->lhs.offset.node) if (store->lhs.offset.node)
{ {
if (!(add = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_ADD, store->lhs.offset.node, &c->node))) if (!(add = hlsl_new_binary_expr(ctx, HLSL_OP2_ADD, store->lhs.offset.node, &c->node)))
return false; return false;
list_add_before(&instr->entry, &add->entry); list_add_before(&instr->entry, &add->entry);
offset = add; offset = add;
@@ -358,7 +358,7 @@ static bool fold_constants(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, voi
{ {
switch (expr->op) switch (expr->op)
{ {
case HLSL_IR_UNOP_CAST: case HLSL_OP1_CAST:
if (instr->data_type->dimx != arg1->node.data_type->dimx if (instr->data_type->dimx != arg1->node.data_type->dimx
|| instr->data_type->dimy != arg1->node.data_type->dimy) || instr->data_type->dimy != arg1->node.data_type->dimy)
{ {
@@ -400,17 +400,17 @@ static bool fold_constants(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, voi
{ {
switch (expr->op) switch (expr->op)
{ {
case HLSL_IR_UNOP_NEG: case HLSL_OP1_NEG:
for (i = 0; i < instr->data_type->dimx; ++i) for (i = 0; i < instr->data_type->dimx; ++i)
res->value.u[i] = -arg1->value.u[i]; res->value.u[i] = -arg1->value.u[i];
break; break;
case HLSL_IR_BINOP_ADD: case HLSL_OP2_ADD:
for (i = 0; i < instr->data_type->dimx; ++i) for (i = 0; i < instr->data_type->dimx; ++i)
res->value.u[i] = arg1->value.u[i] + arg2->value.u[i]; res->value.u[i] = arg1->value.u[i] + arg2->value.u[i];
break; break;
case HLSL_IR_BINOP_MUL: case HLSL_OP2_MUL:
for (i = 0; i < instr->data_type->dimx; ++i) for (i = 0; i < instr->data_type->dimx; ++i)
res->value.u[i] = arg1->value.u[i] * arg2->value.u[i]; res->value.u[i] = arg1->value.u[i] * arg2->value.u[i];
break; break;
@@ -443,13 +443,13 @@ static bool lower_division(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, voi
if (instr->type != HLSL_IR_EXPR) if (instr->type != HLSL_IR_EXPR)
return false; return false;
expr = hlsl_ir_expr(instr); expr = hlsl_ir_expr(instr);
if (expr->op != HLSL_IR_BINOP_DIV) if (expr->op != HLSL_OP2_DIV)
return false; return false;
if (!(rcp = hlsl_new_unary_expr(ctx, HLSL_IR_UNOP_RCP, expr->operands[1].node, instr->loc))) if (!(rcp = hlsl_new_unary_expr(ctx, HLSL_OP1_RCP, expr->operands[1].node, instr->loc)))
return false; return false;
list_add_before(&expr->node.entry, &rcp->entry); list_add_before(&expr->node.entry, &rcp->entry);
expr->op = HLSL_IR_BINOP_MUL; expr->op = HLSL_OP2_MUL;
hlsl_src_remove(&expr->operands[1]); hlsl_src_remove(&expr->operands[1]);
hlsl_src_from_node(&expr->operands[1], rcp); hlsl_src_from_node(&expr->operands[1], rcp);
return true; return true;

View File

@@ -612,19 +612,11 @@ static void write_sm1_expr(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b
switch (expr->op) switch (expr->op)
{ {
case HLSL_IR_BINOP_ADD: case HLSL_OP1_NEG:
write_sm1_binary_op(ctx, buffer, D3DSIO_ADD, &instr->reg, &arg1->reg, &arg2->reg);
break;
case HLSL_IR_BINOP_MUL:
write_sm1_binary_op(ctx, buffer, D3DSIO_MUL, &instr->reg, &arg1->reg, &arg2->reg);
break;
case HLSL_IR_UNOP_NEG:
write_sm1_unary_op(ctx, buffer, D3DSIO_MOV, &instr->reg, &arg1->reg, D3DSPSM_NEG); write_sm1_unary_op(ctx, buffer, D3DSIO_MOV, &instr->reg, &arg1->reg, D3DSPSM_NEG);
break; break;
case HLSL_IR_UNOP_RCP: case HLSL_OP1_RCP:
for (i = 0; i < instr->data_type->dimx; ++i) for (i = 0; i < instr->data_type->dimx; ++i)
{ {
struct hlsl_reg src = arg1->reg, dst = instr->reg; struct hlsl_reg src = arg1->reg, dst = instr->reg;
@@ -635,6 +627,14 @@ static void write_sm1_expr(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b
} }
break; break;
case HLSL_OP2_ADD:
write_sm1_binary_op(ctx, buffer, D3DSIO_ADD, &instr->reg, &arg1->reg, &arg2->reg);
break;
case HLSL_OP2_MUL:
write_sm1_binary_op(ctx, buffer, D3DSIO_MUL, &instr->reg, &arg1->reg, &arg2->reg);
break;
default: default:
FIXME("Unhandled op %u.\n", expr->op); FIXME("Unhandled op %u.\n", expr->op);
break; break;