ir.h revision 471471f83471481db0445e73f8c89e6a9149838e
1986b8f798272d3ae2898617c8fb089156a5941c0Ian Romanick/* -*- c++ -*- */ 2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/* 3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation 4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"), 7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation 8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the 10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions: 11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next 13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the 14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software. 15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE. 23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 250044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h" 2678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h" 270044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick 28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_program { 29a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick void *bong_hits; 30a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_opcodes { 34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_var_decl, 35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_assign, 36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_expression, 37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_dereference, 38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_jump, 39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_label, 40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_constant, 41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_func_sig, 42ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick ir_op_func, 43ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick ir_op_call, 44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions 48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 490044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node { 50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode; 52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 53a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *) = 0; 5578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 57d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick ir_instruction(int mode) 58d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick : mode(mode) 59d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 60d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick /* empty */ 61d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 62a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 63a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprivate: 64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Dummy constructor to catch bad constructors in derived classes. 66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Every derived must use the constructor that sets the instructions 68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * mode. Having the \c void constructor private prevents derived classes 69a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * from accidentally doing the wrong thing. 70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 71a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction(void); 72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 75a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_auto = 0, 77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_uniform, 78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 80a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_inout 81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation { 84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_variable(const struct glsl_type *, const char *); 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 9378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 9478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 9578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 9678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 9778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction { 110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label(const char *label); 112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 11378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 11478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 11578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 11678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 11778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *label; 119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_function_signature(void); 126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 12778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 12878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 12978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 13078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 13178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * List of function parameters stored as ir_variable objects. 141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1420044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Pointer to the label that begins the function definition. 146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label *definition; 148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table 153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_function(void); 157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 15878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 15978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 16078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 16178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 16278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 164471471f83471481db0445e73f8c89e6a9149838eIan Romanick * Find a signature that matches a set of actual parameters. 165471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 166471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *matching_signature(exec_list *actual_param); 167471471f83471481db0445e73f8c89e6a9149838eIan Romanick 168471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 173471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 174471471f83471481db0445e73f8c89e6a9149838eIan Romanick * Set of overloaded functions with this name. 175471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 1760044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression; 181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference; 182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_assignment : public ir_instruction { 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_assignment(ir_instruction *lhs, ir_instruction *rhs, 186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression *condition); 187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 18878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 18978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 19078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 19178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 19278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 195a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_dereference *lhs; 197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This should be either \c ir_op_expression or \c ir_op_deference. 202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *rhs; 204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression *condition; 209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_exp, 220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_log, 221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Binary comparison operators 241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_not, 266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_pow 272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression : public ir_instruction { 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *, ir_instruction *); 278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 27978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 28078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 28178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 28278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 28378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *operands[2]; 286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 289ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 290ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 291ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 292ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickclass ir_call : public ir_instruction { 293ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 294471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call(const ir_function_signature *callee, exec_list *actual_parameters) 295471471f83471481db0445e73f8c89e6a9149838eIan Romanick : ir_instruction(ir_op_call), callee(callee) 296ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 297471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 298ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 299ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 300ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 301ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 302ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 303ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 304ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 305ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 306ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 307ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 308ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick static ir_call *get_error_instruction(); 309ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 310ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 311471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 312471471f83471481db0445e73f8c89e6a9149838eIan Romanick : ir_instruction(ir_op_call), callee(NULL) 313471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 314471471f83471481db0445e73f8c89e6a9149838eIan Romanick /* empty */ 315471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 316471471f83471481db0445e73f8c89e6a9149838eIan Romanick 317471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *callee; 318ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick exec_list actual_parameters; 319ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 320ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 321ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned num_components:2; 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference : public ir_instruction { 342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_dereference(struct ir_instruction *); 344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 34578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 34678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 34778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 34878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 34978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum { 351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_variable, 352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_array, 353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_record 354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Object being dereferenced. 358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Must be either an \c ir_variable or an \c ir_deference. 360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *var; 362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression *array_index; 365a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *field; 366a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct ir_swizzle_mask swizzle; 367a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } selector; 368a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 369a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 370a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 371a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_constant : public ir_instruction { 372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_constant(const struct glsl_type *type, const void *data); 374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 37578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 37678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 37778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 37878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 37978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 380a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned u[16]; 389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int i[16]; 390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float f[16]; 391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool b[16]; 392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } value; 393a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 394a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 395adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 396adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 397adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 398adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 399