ir.h revision 9578c87ce23a98472d52f15b0a7063f4df036c4d
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 25e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#pragma once 26e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#ifndef IR_H 27e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#define IR_H 28e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 290044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h" 3078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h" 310044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick 32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_program { 33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick void *bong_hits; 34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_opcodes { 38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_var_decl, 39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_assign, 40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_expression, 41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_dereference, 42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_jump, 43a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_label, 44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_constant, 45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_op_func_sig, 46ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick ir_op_func, 47ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick ir_op_call, 48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions 52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 530044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node { 54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 55a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode; 56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 57a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *) = 0; 5978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 60a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 61d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick ir_instruction(int mode) 62d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick : mode(mode) 63d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 64d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick /* empty */ 65d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprivate: 68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 69a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Dummy constructor to catch bad constructors in derived classes. 70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 71a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Every derived must use the constructor that sets the instructions 72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * mode. Having the \c void constructor private prevents derived classes 73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * from accidentally doing the wrong thing. 74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 75a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction(void); 76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 80a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_auto = 0, 81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_uniform, 82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_inout 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation { 88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_variable(const struct glsl_type *, const char *); 96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 9778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 9878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 9978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 10078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 10178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction { 114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label(const char *label); 116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 11778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 11878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 11978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 12078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 12178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *label; 123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_function_signature(void); 130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 13178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 13278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 13378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 13478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 13578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * List of function parameters stored as ir_variable objects. 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1460044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Pointer to the label that begins the function definition. 150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label *definition; 152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table 157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_function(void); 161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 16278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 16378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 16478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 16578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 16678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 168471471f83471481db0445e73f8c89e6a9149838eIan Romanick * Find a signature that matches a set of actual parameters. 169471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 170471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *matching_signature(exec_list *actual_param); 171471471f83471481db0445e73f8c89e6a9149838eIan Romanick 172471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 177471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 178471471f83471481db0445e73f8c89e6a9149838eIan Romanick * Set of overloaded functions with this name. 179471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 1800044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression; 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference; 186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_assignment : public ir_instruction { 188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 189a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_assignment(ir_instruction *lhs, ir_instruction *rhs, 190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression *condition); 191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 19278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 19378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 19478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 19578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 19678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_dereference *lhs; 201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * This should be either \c ir_op_expression or \c ir_op_deference. 206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *rhs; 208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression *condition; 213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_exp, 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_log, 225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Binary comparison operators 245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_not, 270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_pow 276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression : public ir_instruction { 279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *, ir_instruction *); 282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 28378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 28478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 28578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 28678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 28778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *operands[2]; 290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 293ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 294ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 295ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 296ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickclass ir_call : public ir_instruction { 297ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 298471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call(const ir_function_signature *callee, exec_list *actual_parameters) 299471471f83471481db0445e73f8c89e6a9149838eIan Romanick : ir_instruction(ir_op_call), callee(callee) 300ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 301471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 302ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 303ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 304ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 305ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 306ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 307ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 308ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 309ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 310ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 311ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 312ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick static ir_call *get_error_instruction(); 313ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 314ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 315471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 316471471f83471481db0445e73f8c89e6a9149838eIan Romanick : ir_instruction(ir_op_call), callee(NULL) 317471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 318471471f83471481db0445e73f8c89e6a9149838eIan Romanick /* empty */ 319471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 320471471f83471481db0445e73f8c89e6a9149838eIan Romanick 321471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *callee; 322ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick exec_list actual_parameters; 323ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 324ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 325ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 3269578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 3279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 3289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 3299578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 3309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 3319578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 3329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 3339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 3349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 3359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : ir_instruction(ir_op_jump) 3369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 3379578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 3389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 3399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 3409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 3419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 3429578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 3439578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 3449578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 3459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 3469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 3479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 3489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 3499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return(ir_expression *value) 3509578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 3519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 3529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 3539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 3549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 3559578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_expression *get_value() const 3569578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 3579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 3589578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 3599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 3609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 3619578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 3629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 3639578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 3649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 3659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate: 3669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_expression *value; 3679578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 3689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 3699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 3709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 371a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 375a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 376a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 377a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 378a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 379a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 380a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned num_components:2; 381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference : public ir_instruction { 391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_dereference(struct ir_instruction *); 393a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 39478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 39578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 39678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 39778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 39878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum { 400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_variable, 401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_array, 402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_record 403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 405a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Object being dereferenced. 407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Must be either an \c ir_variable or an \c ir_deference. 409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *var; 411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression *array_index; 414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *field; 415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct ir_swizzle_mask swizzle; 416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } selector; 417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 418a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 419a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 420a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_constant : public ir_instruction { 421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_constant(const struct glsl_type *type, const void *data); 423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 42478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 42578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 42678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 42778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 42878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned u[16]; 438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int i[16]; 439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float f[16]; 440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool b[16]; 441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } value; 442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 444adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 445adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 446adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 447adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 448e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 449e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 450