ir.h revision bff6013d469b3d4e54cdc5731801c56994a523ec
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; } 556202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual class ir_function * as_function() { return NULL; } 5644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_dereference * as_dereference() { return NULL; } 57fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual class ir_rvalue * as_rvalue() { return NULL; } 587d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual class ir_label * as_label() { return NULL; } 5901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual class ir_loop * as_loop() { return NULL; } 60cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_assignment * as_assignment() { return NULL; } 61cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_call * as_call() { return NULL; } 62cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_return * as_return() { return NULL; } 635ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual class ir_if * as_if() { return NULL; } 647d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual class ir_swizzle * as_swizzle() { return NULL; } 6544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@}*/ 6644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 6844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke ir_instruction() 69d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 70d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick /* empty */ 71d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 75fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction { 76fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic: 77fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue * as_rvalue() 78fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 79fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return this; 80fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 81fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 82fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual bool is_lvalue() 83fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 84fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return false; 85fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 86fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 87fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected: 88b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick ir_rvalue() 89b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick { 90b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick /* empty */ 91b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick } 92fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke}; 93fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 94fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_auto = 0, 97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_uniform, 98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_inout 101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation { 104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 109fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_variable(const struct glsl_type *, const char *); 113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 11444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_variable *as_variable() 11544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 11644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 11744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 11844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 11978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 12078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 12178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 12278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 12378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 1242d394d4877794d19756c3760d711524dca89f772Ian Romanick /** 1252d394d4877794d19756c3760d711524dca89f772Ian Romanick * Duplicate an IR variable 1262d394d4877794d19756c3760d711524dca89f772Ian Romanick * 1272d394d4877794d19756c3760d711524dca89f772Ian Romanick * \note 1282d394d4877794d19756c3760d711524dca89f772Ian Romanick * This will probably be made \c virtual and moved to the base class 1292d394d4877794d19756c3760d711524dca89f772Ian Romanick * eventually. 1302d394d4877794d19756c3760d711524dca89f772Ian Romanick */ 1312d394d4877794d19756c3760d711524dca89f772Ian Romanick ir_variable *clone() const 1322d394d4877794d19756c3760d711524dca89f772Ian Romanick { 1332d394d4877794d19756c3760d711524dca89f772Ian Romanick ir_variable *var = new ir_variable(type, name); 1342d394d4877794d19756c3760d711524dca89f772Ian Romanick 135b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick var->max_array_access = this->max_array_access; 1362d394d4877794d19756c3760d711524dca89f772Ian Romanick var->read_only = this->read_only; 1372d394d4877794d19756c3760d711524dca89f772Ian Romanick var->centroid = this->centroid; 1382d394d4877794d19756c3760d711524dca89f772Ian Romanick var->invariant = this->invariant; 1392d394d4877794d19756c3760d711524dca89f772Ian Romanick var->mode = this->mode; 1402d394d4877794d19756c3760d711524dca89f772Ian Romanick var->interpolation = this->interpolation; 1412d394d4877794d19756c3760d711524dca89f772Ian Romanick 1422d394d4877794d19756c3760d711524dca89f772Ian Romanick return var; 1432d394d4877794d19756c3760d711524dca89f772Ian Romanick } 1442d394d4877794d19756c3760d711524dca89f772Ian Romanick 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 147b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick /** 148b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Highest element accessed with a constant expression array index 149b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * 150b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Not used for non-array variables. 151b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick */ 152b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick unsigned max_array_access; 153b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 15771df19f5ef6e78beb5160801f81468184b75447eEric Anholt /** If the variable is initialized outside of the scope of the shader */ 15871df19f5ef6e78beb5160801f81468184b75447eEric Anholt unsigned shader_in:1; 15971df19f5ef6e78beb5160801f81468184b75447eEric Anholt /** 16071df19f5ef6e78beb5160801f81468184b75447eEric Anholt * If the variable value is later used outside of the scope of the shader. 16171df19f5ef6e78beb5160801f81468184b75447eEric Anholt */ 16271df19f5ef6e78beb5160801f81468184b75447eEric Anholt unsigned shader_out:1; 163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 1669d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick 1679d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick /** 1689d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * Flag that the whole array is assignable 1699d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * 1709d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * In GLSL 1.20 and later whole arrays are assignable (and comparable for 1719d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * equality). This flag enables this behavior. 1729d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick */ 1739d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick unsigned array_lvalue:1; 174326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt 175326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt /** 176c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick * Emit a warning if this variable is accessed. 177c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick */ 178c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick const char *warn_extension; 179c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick 180c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick /** 181326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt * Value assigned in the initializer of a variable declared "const" 182326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt */ 183326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt ir_constant *constant_value; 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 1889fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/** 1899fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or 1909fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype. 1919fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */ 192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 193894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /* An ir_function_signature will be part of the list of signatures in 194894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt * an ir_function. 195894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt */ 196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 197e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick ir_function_signature(const glsl_type *return_type); 198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 19978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 20078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 20178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 20278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 20378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 2050f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick * Get the name of the function for which this is a signature 2060f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick */ 2070f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick const char *function_name() const; 2080f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 2090f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick /** 210abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * Check whether the qualifiers match between this signature's parameters 211abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * and the supplied parameter list. If not, returns the name of the first 212abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * parameter with mismatched qualifiers (for use in error messages). 213abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke */ 214abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke const char *qualifiers_match(exec_list *params); 215abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke 216abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke /** 217bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * Replace the current parameter list with the given one. This is useful 218bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * if the current information came from a prototype, and either has invalid 219bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * or missing parameter names. 220bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke */ 221bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke void replace_parameters(exec_list *new_params); 222bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke 223bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke /** 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 231f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_variable of function parameters. 232f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * 233f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * This represents the storage. The paramaters passed in a particular 234f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * call will be in ir_call::actual_paramaters. 235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 2360044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2389fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke /** Whether or not this function has a body (which may be empty). */ 2399fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke unsigned is_defined:1; 2406a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 241894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /** Body of instructions in the function. */ 242894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt struct exec_list body; 243894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt 2446a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate: 2456a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick /** Function of which this signature is one overload. */ 2466a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick class ir_function *function; 2476a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 2486a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick friend class ir_function; 249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 2539fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name. 2549fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the 2559fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions. 256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 259882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick ir_function(const char *name); 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2616202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual ir_function *as_function() 2626202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke { 2636202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke return this; 2646202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke } 2656202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke 26678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 26778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 26878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 26978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 27078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 2716a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick void add_signature(ir_function_signature *sig) 2726a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick { 2736a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick sig->function = this; 2746a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick signatures.push_tail(sig); 2756a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick } 2766a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 27895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick * Get an iterator for the set of function signatures 27995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick */ 28095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick exec_list_iterator iterator() 28195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick { 28295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick return signatures.iterator(); 28395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick } 28495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick 28595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick /** 2860d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that matches a set of actual parameters, taking implicit 2870d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * conversions into account. 288471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 289471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *matching_signature(exec_list *actual_param); 290471471f83471481db0445e73f8c89e6a9149838eIan Romanick 291471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 2920d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that exactly matches a set of actual parameters without 2930d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * any implicit type conversions. 2940d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke */ 2950d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke ir_function_signature *exact_matching_signature(exec_list *actual_ps); 2960d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke 2970d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke /** 298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 302a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate: 303471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 304f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_function_signature for each overloaded function with this name. 305471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 3060044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 3080f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 3090f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const 3100f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{ 3110f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return function->name; 3120f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick} 313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3163c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/** 3173c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements 3183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 3193c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction { 3203c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic: 3213c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_if(ir_rvalue *condition) 3223c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick : condition(condition) 3233c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 3243c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick /* empty */ 3253c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 3263c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3275ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual ir_if *as_if() 3285ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt { 3295ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt return this; 3305ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt } 3315ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt 3323c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual void accept(ir_visitor *v) 3333c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 3343c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick v->visit(this); 3353c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 3363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *condition; 338f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the then branch */ 3393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list then_instructions; 340f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the else branch */ 3413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list else_instructions; 3423c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}; 3433c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3443c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 345fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/** 346fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure. 347fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 348fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction { 349fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic: 350fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL) 351fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 352fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /* empty */ 353fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 354fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 355fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick virtual void accept(ir_visitor *v) 356fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 357fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick v->visit(this); 358fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 359fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 36001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual ir_loop *as_loop() 36101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick { 36201f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick return this; 36301f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick } 36401f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick 365fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 366fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * Get an iterator for the instructions of the loop body 367fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 368fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list_iterator iterator() 369fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 370fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick return body_instructions.iterator(); 371fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 372fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 373f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction that make up the body of the loop. */ 374fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list body_instructions; 375fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 376fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 377fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * \name Loop counter and controls 378fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 379fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@{*/ 380fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *from; 381fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *to; 382fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *increment; 383fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_variable *counter; 384fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@}*/ 385fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick}; 386fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 387fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 388fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue { 389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 390fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition); 391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 39278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 39378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 39478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 39578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 39678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 397cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_assignment * as_assignment() 398cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 399cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 400cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 401cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 405fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *lhs; 406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 410fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *rhs; 411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 415fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *condition; 416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 418160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt/* Update ir_expression::num_operands() and ir_print_visitor.cpp when 419160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list. 420160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt*/ 421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 42844d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt ir_unop_sqrt, 429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_exp, 430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_log, 43101665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_exp2, 43201665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_log2, 433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 435dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_f2b, /**< Float-to-boolean conversion */ 436dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_b2f, /**< Boolean-to-float conversion */ 437c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_i2b, /**< int-to-boolean conversion */ 438c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_b2i, /**< Boolean-to-int conversion */ 4396c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick ir_unop_u2f, /**< Unsigned-to-float conversion. */ 440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Binary comparison operators 458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 461a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 471a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 474a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 475a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_pow 488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 490fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue { 491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 493fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *, ir_rvalue *); 494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4957dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke static unsigned int get_num_operands(ir_expression_operation); 4967dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke unsigned int get_num_operands() 4977dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke { 4987dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke return get_num_operands(operation); 4997dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke } 500160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt 50178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 50278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 50378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 50478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 50578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 506cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_expression *clone(); 507cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 509fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *operands[2]; 510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 513ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 514ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 515ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 516fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue { 517ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 518471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call(const ir_function_signature *callee, exec_list *actual_parameters) 519b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(callee) 520ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 5219e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick assert(callee->return_type != NULL); 5229e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick type = callee->return_type; 523471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 524ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 525ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 526cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_call *as_call() 527cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 528cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 529cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 530cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 531ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 532ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 533ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 534ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 535ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 536ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 537ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 538ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 539ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick static ir_call *get_error_instruction(); 540ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 5419878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick /** 5429878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick * Get an iterator for the set of acutal parameters 5439878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick */ 5449878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick exec_list_iterator iterator() 5459878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick { 5469878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick return actual_parameters.iterator(); 5479878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick } 5489878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick 54993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /** 55093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick * Get the name of the function being called. 55193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick */ 55293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick const char *callee_name() const 55393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick { 5540f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return callee->function_name(); 55593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick } 55693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick 557cad9766118d269725ef33b4e9588d674d5225010Eric Anholt const ir_function_signature *get_callee() 558cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 559cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return callee; 560cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 561cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 562cad9766118d269725ef33b4e9588d674d5225010Eric Anholt /** 563cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * Generates an inline version of the function before @ir, 564cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * returning the return value of the function. 565cad9766118d269725ef33b4e9588d674d5225010Eric Anholt */ 566cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_rvalue *generate_inline(ir_instruction *ir); 567cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 568ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 569471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 570b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(NULL) 571471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 572471471f83471481db0445e73f8c89e6a9149838eIan Romanick /* empty */ 573471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 574471471f83471481db0445e73f8c89e6a9149838eIan Romanick 575471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *callee; 576f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt 577f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /* List of ir_rvalue of paramaters passed in this call. */ 578ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick exec_list actual_parameters; 579ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 580ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 581ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 5829578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 5839578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 5849578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 5859578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 5869578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 5879578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 5889578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 5899578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 5909578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 5919578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 5929578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 5939578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 5949578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 5959578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 5969578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 5979578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 5989578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 5999578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 6009578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6019578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 6029578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6039578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 604fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_return(ir_rvalue *value) 6059578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 6069578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6079578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 6089578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 610cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_return *as_return() 611cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 612cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 613cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 614cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 615fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *get_value() const 6169578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6179578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 6189578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6199578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 6209578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 6219578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6229578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 6239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 6259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate: 626fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *value; 6279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 628f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 629f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 630f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/** 631f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops 632f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 633f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue. The \c break within a loop is 634f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement. 635f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 636f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump 637f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */ 638f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump { 639f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic: 640f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode { 641f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_break, 642f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_continue 643f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick }; 644f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 645f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick ir_loop_jump(ir_loop *loop, jump_mode mode) 646f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick : loop(loop), mode(mode) 647f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 648f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /* empty */ 649f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 650f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 651f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick virtual void accept(ir_visitor *v) 652f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 653f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick v->visit(this); 654f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 655f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 656f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_break() const 657f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 658f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_break; 659f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 660f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 661f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_continue() const 662f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 663f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_continue; 664f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 665f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 666f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickprivate: 667f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Loop containing this break instruction. */ 668f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick ir_loop *loop; 669f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 670f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Mode selector for the jump instruction. */ 671f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode mode; 672f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick}; 6739578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 6749578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 6759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 676a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 677a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 678a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 679a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 680a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 681a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 683a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 685f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke unsigned num_components:3; 686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 687a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 689a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 691a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 695affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 696affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue { 697affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic: 698affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 699affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke unsigned count); 700cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask) 701cad9766118d269725ef33b4e9588d674d5225010Eric Anholt : val(val), mask(mask) 702cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 703cad9766118d269725ef33b4e9588d674d5225010Eric Anholt /* empty */ 704cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 705cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 7067d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual ir_swizzle *as_swizzle() 7077d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt { 7087d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt return this; 7097d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt } 7107d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt 711cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_swizzle *clone() 712cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 713cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return new ir_swizzle(this->val, this->mask); 714cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 715cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 716affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke /** 717affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke * Construct an ir_swizzle from the textual representation. Can fail. 718affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke */ 719affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 720affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 721affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke virtual void accept(ir_visitor *v) 722affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 723affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke v->visit(this); 724affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 725affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 726affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke bool is_lvalue() 727affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 728a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt return val->is_lvalue() && !mask.has_duplicates; 729affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 730affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 731affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_rvalue *val; 732affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle_mask mask; 733affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}; 734affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 735affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 736fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue { 737a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 738a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_dereference(struct ir_instruction *); 739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 740fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_dereference(ir_instruction *variable, ir_rvalue *array_index); 741954699773681842dac9f8f0d9ba4629513232196Ian Romanick 74244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_dereference *as_dereference() 74344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 74444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 74544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 74644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 74778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 74878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 74978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 75078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 75178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 752c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt bool is_lvalue(); 753fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 754a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum { 755a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_variable, 756a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_array, 757a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_record 758a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 759a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 760a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 761a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Object being dereferenced. 762a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 763fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke * Must be either an \c ir_variable or an \c ir_rvalue. 764a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 765a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *var; 766a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 767a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 768fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *array_index; 769a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *field; 770a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } selector; 771a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 772a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 773a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 774fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue { 775a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 776a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_constant(const struct glsl_type *type, const void *data); 7773c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(bool b); 7783c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(unsigned int u); 7793c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(int i); 7803c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(float f); 781a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 78278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 78378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 78478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 78578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 78678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 787cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_constant *clone() 788cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 789cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return new ir_constant(this->type, &this->value); 790cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 791cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 792a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 793a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 794a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 795a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 796a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 797a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 798a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 799a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 800a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned u[16]; 801a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int i[16]; 802a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float f[16]; 803a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool b[16]; 804a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } value; 805a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 806a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 80770b74928a220aff024664714877defb0caedf33fEric Anholtvoid 80870b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor); 809adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 810adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 811adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 812adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 813e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 814c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void 815c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions, 816c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt struct _mesa_glsl_parse_state *state); 817c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt 818e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 819