From 7f0f60cd840fc88f01b8f6e46cad36c36709d813 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 3 Sep 2013 11:52:40 -0700 Subject: [PATCH] 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 Reviewed-by: Matt Turner Reviewed-by: Paul Berry --- src/glsl/ir.cpp | 31 +++++++++++++++++++++++++++++++ src/glsl/ir.h | 5 +++++ 2 files changed, 36 insertions(+) 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; -- 2.30.2