ir_print_visitor.cpp revision a87ac255cf7ef0672b4de865d82e6a40c93b57d
1a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/* 2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation 3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"), 6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation 7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the 9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions: 10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next 12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the 13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software. 14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE. 22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_program { 25a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick void *bong_hits; 26a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 27a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 29a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_opcodes { 30a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_var_decl, 31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_assign, 32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_expression, 33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_dereference, 34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_jump, 35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_label, 36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_constant, 37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_func_sig, 38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_func 39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions 43a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_instruction : public simple_node { 45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode; 47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction(int mode); 51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprivate: 53a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Dummy constructor to catch bad constructors in derived classes. 55a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Every derived must use the constructor that sets the instructions 57a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * mode. Having the \c void constructor private prevents derived classes 58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * from accidentally doing the wrong thing. 59a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 60a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction(void); 61a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 62a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 63a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_auto = 0, 66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_uniform, 67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 69a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_inout 70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 71a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation { 73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 75a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 80a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_variable(const struct glsl_type *, const char *); 81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction { 94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label(const char *label); 96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *label; 98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_function_signature(void); 105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * List of function parameters stored as ir_variable objects. 115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node parameters; 117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Pointer to the label that begins the function definition. 120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label *definition; 122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table 127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_function(void); 131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node signatures; 138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression; 142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference; 143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_assignment : public ir_instruction { 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_assignment(ir_instruction *lhs, ir_instruction *rhs, 147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression *condition); 148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_dereference *lhs; 153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This should be either \c ir_op_expression or \c ir_op_deference. 158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *rhs; 160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression *condition; 165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_exp, 176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_log, 177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 189a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 195a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Binary comparison operators 197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_not, 222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_pow 228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression : public ir_instruction { 231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *, ir_instruction *); 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *operands[2]; 237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned num_components:2; 250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference : public ir_instruction { 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_dereference(struct ir_instruction *); 262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum { 264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_variable, 265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_array, 266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_record 267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Object being dereferenced. 271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Must be either an \c ir_variable or an \c ir_deference. 273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *var; 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression *array_index; 278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *field; 279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct ir_swizzle_mask swizzle; 280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } selector; 281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_constant : public ir_instruction { 285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_constant(const struct glsl_type *type, const void *data); 287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned u[16]; 297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int i[16]; 298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float f[16]; 299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool b[16]; 300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } value; 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 303