summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2013-09-03 11:52:40 -0700
committerKenneth Graunke <[email protected]>2013-09-09 11:52:22 -0700
commit7f0f60cd840fc88f01b8f6e46cad36c36709d813 (patch)
tree98b193c077baebd74715af2e6fdcacd4e2642030
parent183f7a3e6f45a3351b86eb4c25313efe140e9793 (diff)
glsl: Add an ir_expression triop constructor with type inference.
We already have ir_expression constructors for unary and binary operations, which automatically infer the type based on the opcode and operand types. These are convenient and also required for ir_builder support. Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Matt Turner <[email protected]> Reviewed-by: Paul Berry <[email protected]>
-rw-r--r--src/glsl/ir.cpp31
-rw-r--r--src/glsl/ir.h5
2 files changed, 36 insertions, 0 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index a92d454d4bf..69e20333d02 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -413,6 +413,37 @@ ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1)
}
}
+ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1,
+ ir_rvalue *op2)
+{
+ this->ir_type = ir_type_expression;
+
+ this->operation = ir_expression_operation(op);
+ this->operands[0] = op0;
+ this->operands[1] = op1;
+ this->operands[2] = op2;
+ this->operands[3] = NULL;
+
+ assert(op > ir_last_binop && op <= ir_last_triop);
+
+ switch (this->operation) {
+ case ir_triop_fma:
+ case ir_triop_lrp:
+ case ir_triop_bitfield_extract:
+ case ir_triop_vector_insert:
+ this->type = op0->type;
+ break;
+
+ case ir_triop_bfi:
+ this->type = op1->type;
+ break;
+
+ default:
+ assert(!"not reached: missing automatic type setup for ir_expression");
+ this->type = glsl_type::float_type;
+ }
+}
+
unsigned int
ir_expression::get_num_operands(ir_expression_operation op)
{
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index de41858764c..0646e6d754c 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -1252,6 +1252,11 @@ public:
*/
ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1);
+ /**
+ * Constructor for ternary operation expressions
+ */
+ ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1, ir_rvalue *op2);
+
virtual ir_expression *as_expression()
{
return this;