ir.h revision 2d394d4877794d19756c3760d711524dca89f772
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 431cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick class ir_constant *constant_expression_value(); 4478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *) = 0; 4578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 4644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /** 4744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \name IR instruction downcast functions 4844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * 4944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * These functions either cast the object to a derived class or return 5044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \c NULL if the object's type does not match the specified derived class. 5144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * Additional downcast functions will be added as needed. 5244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke */ 5344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@{*/ 5444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_variable * as_variable() { return NULL; } 5544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_dereference * as_dereference() { return NULL; } 56fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual class ir_rvalue * as_rvalue() { return NULL; } 5744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@}*/ 5844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 59a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 6044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke ir_instruction() 61d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 62d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick /* empty */ 63d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 67fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction { 68fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic: 69fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue * as_rvalue() 70fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 71fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return this; 72fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 73fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 74fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual bool is_lvalue() 75fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 76fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return false; 77fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 78fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 79fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected: 80fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue() : ir_instruction() { } 81fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke}; 82fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 83fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_auto = 0, 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_uniform, 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_inout 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation { 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 98fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_variable(const struct glsl_type *, const char *); 102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 10344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_variable *as_variable() 10444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 10544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 10644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 10744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 10878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 10978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 11078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 11178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 11278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 1132d394d4877794d19756c3760d711524dca89f772Ian Romanick /** 1142d394d4877794d19756c3760d711524dca89f772Ian Romanick * Duplicate an IR variable 1152d394d4877794d19756c3760d711524dca89f772Ian Romanick * 1162d394d4877794d19756c3760d711524dca89f772Ian Romanick * \note 1172d394d4877794d19756c3760d711524dca89f772Ian Romanick * This will probably be made \c virtual and moved to the base class 1182d394d4877794d19756c3760d711524dca89f772Ian Romanick * eventually. 1192d394d4877794d19756c3760d711524dca89f772Ian Romanick */ 1202d394d4877794d19756c3760d711524dca89f772Ian Romanick ir_variable *clone() const 1212d394d4877794d19756c3760d711524dca89f772Ian Romanick { 1222d394d4877794d19756c3760d711524dca89f772Ian Romanick ir_variable *var = new ir_variable(type, name); 1232d394d4877794d19756c3760d711524dca89f772Ian Romanick 1242d394d4877794d19756c3760d711524dca89f772Ian Romanick var->read_only = this->read_only; 1252d394d4877794d19756c3760d711524dca89f772Ian Romanick var->centroid = this->centroid; 1262d394d4877794d19756c3760d711524dca89f772Ian Romanick var->invariant = this->invariant; 1272d394d4877794d19756c3760d711524dca89f772Ian Romanick var->mode = this->mode; 1282d394d4877794d19756c3760d711524dca89f772Ian Romanick var->interpolation = this->interpolation; 1292d394d4877794d19756c3760d711524dca89f772Ian Romanick 1302d394d4877794d19756c3760d711524dca89f772Ian Romanick return var; 1312d394d4877794d19756c3760d711524dca89f772Ian Romanick } 1322d394d4877794d19756c3760d711524dca89f772Ian Romanick 133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction { 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label(const char *label); 147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 14878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 14978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 15078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 15178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 15278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *label; 154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 160e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick ir_function_signature(const glsl_type *return_type); 161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 16278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 16378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 16478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 16578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 16678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 1680f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick * Get the name of the function for which this is a signature 1690f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick */ 1700f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick const char *function_name() const; 1710f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 1720f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick /** 173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * List of function parameters stored as ir_variable objects. 181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1820044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Pointer to the label that begins the function definition. 186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label *definition; 1886a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 1896a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate: 1906a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick /** Function of which this signature is one overload. */ 1916a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick class ir_function *function; 1926a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 1936a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick friend class ir_function; 194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 195a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table 199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 202882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick ir_function(const char *name); 203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 20478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 20578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 20678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 20778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 20878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 2096a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick void add_signature(ir_function_signature *sig) 2106a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick { 2116a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick sig->function = this; 2126a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick signatures.push_tail(sig); 2136a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick } 2146a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 21695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick * Get an iterator for the set of function signatures 21795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick */ 21895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick exec_list_iterator iterator() 21995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick { 22095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick return signatures.iterator(); 22195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick } 22295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick 22395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick /** 224471471f83471481db0445e73f8c89e6a9149838eIan Romanick * Find a signature that matches a set of actual parameters. 225471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 226471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *matching_signature(exec_list *actual_param); 227471471f83471481db0445e73f8c89e6a9149838eIan Romanick 228471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 233a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate: 234471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 235471471f83471481db0445e73f8c89e6a9149838eIan Romanick * Set of overloaded functions with this name. 236471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 2370044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 2390f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 2400f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const 2410f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{ 2420f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return function->name; 2430f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick} 244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2473c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/** 2483c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements 2493c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 2503c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction { 2513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic: 2523c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_if(ir_rvalue *condition) 2533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick : condition(condition) 2543c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 2553c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick /* empty */ 2563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 2573c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 2583c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual void accept(ir_visitor *v) 2593c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 2603c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick v->visit(this); 2613c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 2623c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 2633c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *condition; 2643c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list then_instructions; 2653c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list else_instructions; 2663c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}; 2673c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 2683c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 269fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue { 270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 271fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition); 272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 27378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 27478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 27578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 27678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 27778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 281fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *lhs; 282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 286fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *rhs; 287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 291fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *condition; 292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 294e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt/* Update ir_print_visitor.cpp when updating this list. */ 295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 30244d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt ir_unop_sqrt, 303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_exp, 304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_log, 30501665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_exp2, 30601665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_log2, 307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 3096c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick ir_unop_u2f, /**< Unsigned-to-float conversion. */ 310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Binary comparison operators 328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 348a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 349a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_not, 353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_pow 359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 361fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue { 362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 364fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *, ir_rvalue *); 365a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 36678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 36778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 36878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 36978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 37078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 371a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 372fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *operands[2]; 373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 375a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 376ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 377ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 378ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 379fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue { 380ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 381471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call(const ir_function_signature *callee, exec_list *actual_parameters) 382fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke : ir_rvalue(), callee(callee) 383ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 3849e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick assert(callee->return_type != NULL); 3859e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick type = callee->return_type; 386471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 387ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 388ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 389ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 390ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 391ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 392ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 393ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 394ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 395ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 396ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 397ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick static ir_call *get_error_instruction(); 398ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 3999878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick /** 4009878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick * Get an iterator for the set of acutal parameters 4019878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick */ 4029878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick exec_list_iterator iterator() 4039878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick { 4049878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick return actual_parameters.iterator(); 4059878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick } 4069878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick 40793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /** 40893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick * Get the name of the function being called. 40993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick */ 41093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick const char *callee_name() const 41193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick { 4120f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return callee->function_name(); 41393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick } 41493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick 415ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 416471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 417fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke : ir_rvalue(), callee(NULL) 418471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 419471471f83471481db0445e73f8c89e6a9149838eIan Romanick /* empty */ 420471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 421471471f83471481db0445e73f8c89e6a9149838eIan Romanick 422471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *callee; 423ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick exec_list actual_parameters; 424ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 425ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 426ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 4279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 4289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 4299578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 4309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 4319578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 4329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 4339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 4349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 4359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 43644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke : ir_instruction() 4379578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 4389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 4399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 4409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 4419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 4429578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 4439578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 4449578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 4459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 4469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 4479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 4489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 4499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 450fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_return(ir_rvalue *value) 4519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 4529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 4539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 4549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 4559578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 456fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *get_value() const 4579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 4589578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 4599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 4609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 4619578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 4629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 4639578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 4649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 4659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 4669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate: 467fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *value; 4689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 4699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 4709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 4719578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 474a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 475a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 481f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke unsigned num_components:3; 482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 491affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 492affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue { 493affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic: 494affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 495affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke unsigned count); 496affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke /** 497affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke * Construct an ir_swizzle from the textual representation. Can fail. 498affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke */ 499affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 500affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 501affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke virtual void accept(ir_visitor *v) 502affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 503affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke v->visit(this); 504affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 505affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 506affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke bool is_lvalue() 507affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 508a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt return val->is_lvalue() && !mask.has_duplicates; 509affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 510affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 511affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_rvalue *val; 512affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle_mask mask; 513affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}; 514affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 515affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 516fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue { 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_dereference(struct ir_instruction *); 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 520fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_dereference(ir_instruction *variable, ir_rvalue *array_index); 521954699773681842dac9f8f0d9ba4629513232196Ian Romanick 52244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_dereference *as_dereference() 52344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 52444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 52544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 52644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 52778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 52878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 52978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 53078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 53178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 532fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke bool is_lvalue() 533fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 534c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt if (var == NULL) 535521c2983b43570ece73d9377f812baa6bcaf94d3Ian Romanick return false; 536c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt 537521c2983b43570ece73d9377f812baa6bcaf94d3Ian Romanick ir_variable *const as_var = var->as_variable(); 538c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt if (as_var == NULL) 539521c2983b43570ece73d9377f812baa6bcaf94d3Ian Romanick return false; 540c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt 541c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt return !as_var->read_only; 542fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 543fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum { 545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_variable, 546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_array, 547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_record 548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Object being dereferenced. 552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 553fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke * Must be either an \c ir_variable or an \c ir_rvalue. 554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *var; 556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 557a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 558fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *array_index; 559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *field; 560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } selector; 561a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 562a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 563a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 564fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue { 565a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 566a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_constant(const struct glsl_type *type, const void *data); 5673c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(bool b); 5683c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(unsigned int u); 5693c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(int i); 5703c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(float f); 571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 57278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 57378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 57478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 57578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 57678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 581a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned u[16]; 586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int i[16]; 587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float f[16]; 588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool b[16]; 589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } value; 590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 592adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 593adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 594adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 595adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 596e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 597c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void 598c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions, 599c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt struct _mesa_glsl_parse_state *state); 600c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt 601e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 602