ir.h revision a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8
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 Romanick * Base class of all IR instructions 38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 390044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node { 40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *) = 0; 4478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 4544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /** 4644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \name IR instruction downcast functions 4744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * 4844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * These functions either cast the object to a derived class or return 4944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \c NULL if the object's type does not match the specified derived class. 5044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * Additional downcast functions will be added as needed. 5144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke */ 5244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@{*/ 5344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_variable * as_variable() { return NULL; } 5444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_dereference * as_dereference() { return NULL; } 55fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual class ir_rvalue * as_rvalue() { return NULL; } 5644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@}*/ 5744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 5944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke ir_instruction() 60d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 61d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick /* empty */ 62d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 63a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 66fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction { 67fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic: 68fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue * as_rvalue() 69fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 70fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return this; 71fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 72fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 73fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual bool is_lvalue() 74fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 75fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return false; 76fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 77fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 78fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected: 79fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue() : ir_instruction() { } 80fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke}; 81fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 82fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_auto = 0, 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_uniform, 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_inout 89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation { 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 97fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_variable(const struct glsl_type *, const char *); 101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 10244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_variable *as_variable() 10344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 10444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 10544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 10644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 10778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 10878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 10978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 11078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 11178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction { 124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label(const char *label); 126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 12778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 12878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 12978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 13078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 13178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *label; 133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 139e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick ir_function_signature(const glsl_type *return_type); 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 14178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 14278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 14378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 14478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 14578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * List of function parameters stored as ir_variable objects. 155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1560044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Pointer to the label that begins the function definition. 160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label *definition; 162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table 167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 170882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick ir_function(const char *name); 171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 17278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 17378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 17478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 17578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 17678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 178471471f83471481db0445e73f8c89e6a9149838eIan Romanick * Find a signature that matches a set of actual parameters. 179471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 180471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *matching_signature(exec_list *actual_param); 181471471f83471481db0445e73f8c89e6a9149838eIan Romanick 182471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 187471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 188471471f83471481db0445e73f8c89e6a9149838eIan Romanick * Set of overloaded functions with this name. 189471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 1900044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 195fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue { 196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 197fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition); 198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 19978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 20078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 20178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 20278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 20378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 207fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *lhs; 208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 212fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *rhs; 213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 217fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *condition; 218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 220e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt/* Update ir_print_visitor.cpp when updating this list. */ 221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 22844d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt ir_unop_sqrt, 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_exp, 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_log, 23101665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_exp2, 23201665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_log2, 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 2356c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick ir_unop_u2f, /**< Unsigned-to-float conversion. */ 236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Binary comparison operators 254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_not, 279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_pow 285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 287fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue { 288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 290fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *, ir_rvalue *); 291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 29278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 29378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 29478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 29578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 29678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 298fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *operands[2]; 299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 302ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 303ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 304ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 305fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue { 306ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 307471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call(const ir_function_signature *callee, exec_list *actual_parameters) 308fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke : ir_rvalue(), callee(callee) 309ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 3109e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick assert(callee->return_type != NULL); 3119e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick type = callee->return_type; 312471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 313ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 314ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 315ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 316ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 317ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 318ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 319ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 320ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 321ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 322ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 323ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick static ir_call *get_error_instruction(); 324ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 3259878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick /** 3269878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick * Get an iterator for the set of acutal parameters 3279878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick */ 3289878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick exec_list_iterator iterator() 3299878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick { 3309878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick return actual_parameters.iterator(); 3319878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick } 3329878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick 33393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /** 33493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick * Get the name of the function being called. 33593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick */ 33693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick const char *callee_name() const 33793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick { 33893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /* FINISHME: This only works for functions that have definitions. */ 33993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick return callee->definition->label; 34093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick } 34193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick 342ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 343471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 344fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke : ir_rvalue(), callee(NULL) 345471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 346471471f83471481db0445e73f8c89e6a9149838eIan Romanick /* empty */ 347471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 348471471f83471481db0445e73f8c89e6a9149838eIan Romanick 349471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *callee; 350ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick exec_list actual_parameters; 351ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 352ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 353ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 3549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 3559578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 3569578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 3579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 3589578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 3599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 3609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 3619578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 3629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 36344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke : ir_instruction() 3649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 3659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 3669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 3679578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 3689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 3699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 3709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 3719578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 3729578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 3739578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 3749578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 3759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 3769578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 377fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_return(ir_rvalue *value) 3789578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 3799578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 3809578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 3819578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 3829578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 383fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *get_value() const 3849578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 3859578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 3869578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 3879578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 3889578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 3899578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 3909578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 3919578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 3929578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 3939578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate: 394fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *value; 3959578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 3969578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 3979578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 3989578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 405a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 408f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke unsigned num_components:3; 409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 418affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 419affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue { 420affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic: 421affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 422affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke unsigned count); 423affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke /** 424affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke * Construct an ir_swizzle from the textual representation. Can fail. 425affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke */ 426affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 427affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 428affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke virtual void accept(ir_visitor *v) 429affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 430affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke v->visit(this); 431affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 432affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 433affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke bool is_lvalue() 434affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 435a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt return val->is_lvalue() && !mask.has_duplicates; 436affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 437affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 438affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_rvalue *val; 439affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle_mask mask; 440affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}; 441affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 442affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 443fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue { 444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_dereference(struct ir_instruction *); 446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 447fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_dereference(ir_instruction *variable, ir_rvalue *array_index); 448954699773681842dac9f8f0d9ba4629513232196Ian Romanick 44944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_dereference *as_dereference() 45044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 45144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 45244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 45344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 45478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 45578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 45678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 45778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 45878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 459fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke bool is_lvalue() 460fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 461c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt ir_variable *as_var; 462c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt 463c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt if (var == NULL) 464c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt return NULL; 465c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt 466c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt as_var = var->as_variable(); 467c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt 468c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt if (as_var == NULL) 469c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt return NULL; 470c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt 471c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt return !as_var->read_only; 472fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 473fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 474a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum { 475a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_variable, 476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_array, 477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_record 478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Object being dereferenced. 482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 483fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke * Must be either an \c ir_variable or an \c ir_rvalue. 484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *var; 486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 488fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *array_index; 489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *field; 490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } selector; 491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 494fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue { 495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_constant(const struct glsl_type *type, const void *data); 4973c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(bool b); 4983c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(unsigned int u); 4993c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(int i); 5003c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(float f); 501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 50278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 50378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 50478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 50578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 50678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned u[16]; 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int i[16]; 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float f[16]; 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool b[16]; 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } value; 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 522adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 523adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 524adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 525adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 526e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 527c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void 528c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions, 529c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt struct _mesa_glsl_parse_state *state); 530c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt 531e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 532