ir.h revision 70fe8b66632f4afd87ebb12a450b1e639428e88f
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" 318895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick#include "ir_hierarchical_visitor.h" 320044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick 33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_program { 34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick void *bong_hits; 35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions 39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 400044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node { 41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 43a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 441cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick class ir_constant *constant_expression_value(); 4578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *) = 0; 468895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0; 4778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 4844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /** 4944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \name IR instruction downcast functions 5044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * 5144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * These functions either cast the object to a derived class or return 5244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \c NULL if the object's type does not match the specified derived class. 5344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * Additional downcast functions will be added as needed. 5444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke */ 5544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@{*/ 5644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_variable * as_variable() { return NULL; } 576202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual class ir_function * as_function() { return NULL; } 5844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_dereference * as_dereference() { return NULL; } 59fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual class ir_rvalue * as_rvalue() { return NULL; } 607d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual class ir_label * as_label() { return NULL; } 6101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual class ir_loop * as_loop() { return NULL; } 62cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_assignment * as_assignment() { return NULL; } 63cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_call * as_call() { return NULL; } 64cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_return * as_return() { return NULL; } 655ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual class ir_if * as_if() { return NULL; } 667d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual class ir_swizzle * as_swizzle() { return NULL; } 675c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual class ir_constant * as_constant() { return NULL; } 6844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@}*/ 6944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 7144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke ir_instruction() 72d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 73d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick /* empty */ 74d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 75a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 78fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction { 79fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic: 80fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue * as_rvalue() 81fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 82fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return this; 83fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 84fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 85fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual bool is_lvalue() 86fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 87fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return false; 88fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 89fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 902b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 912b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 922b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 932b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick virtual ir_variable *variable_referenced() 942b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick { 952b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick return NULL; 962b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick } 972b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 98fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected: 99b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick ir_rvalue() 100b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick { 101b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick /* empty */ 102b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick } 103fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke}; 104fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 105fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_auto = 0, 108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_uniform, 109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_inout 112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation { 115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 120fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_variable(const struct glsl_type *, const char *); 124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 12544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_variable *as_variable() 12644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 12744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 12844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 12944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 13078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 13178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 13278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 13378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 13478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 1358895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1372d394d4877794d19756c3760d711524dca89f772Ian Romanick /** 1382d394d4877794d19756c3760d711524dca89f772Ian Romanick * Duplicate an IR variable 1392d394d4877794d19756c3760d711524dca89f772Ian Romanick * 1402d394d4877794d19756c3760d711524dca89f772Ian Romanick * \note 1412d394d4877794d19756c3760d711524dca89f772Ian Romanick * This will probably be made \c virtual and moved to the base class 1422d394d4877794d19756c3760d711524dca89f772Ian Romanick * eventually. 1432d394d4877794d19756c3760d711524dca89f772Ian Romanick */ 1442d394d4877794d19756c3760d711524dca89f772Ian Romanick ir_variable *clone() const 1452d394d4877794d19756c3760d711524dca89f772Ian Romanick { 1462d394d4877794d19756c3760d711524dca89f772Ian Romanick ir_variable *var = new ir_variable(type, name); 1472d394d4877794d19756c3760d711524dca89f772Ian Romanick 148b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick var->max_array_access = this->max_array_access; 1492d394d4877794d19756c3760d711524dca89f772Ian Romanick var->read_only = this->read_only; 1502d394d4877794d19756c3760d711524dca89f772Ian Romanick var->centroid = this->centroid; 1512d394d4877794d19756c3760d711524dca89f772Ian Romanick var->invariant = this->invariant; 1522d394d4877794d19756c3760d711524dca89f772Ian Romanick var->mode = this->mode; 1532d394d4877794d19756c3760d711524dca89f772Ian Romanick var->interpolation = this->interpolation; 1542d394d4877794d19756c3760d711524dca89f772Ian Romanick 1552d394d4877794d19756c3760d711524dca89f772Ian Romanick return var; 1562d394d4877794d19756c3760d711524dca89f772Ian Romanick } 1572d394d4877794d19756c3760d711524dca89f772Ian Romanick 158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 160b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick /** 161b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Highest element accessed with a constant expression array index 162b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * 163b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Not used for non-array variables. 164b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick */ 165b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick unsigned max_array_access; 166b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 17071df19f5ef6e78beb5160801f81468184b75447eEric Anholt /** If the variable is initialized outside of the scope of the shader */ 17171df19f5ef6e78beb5160801f81468184b75447eEric Anholt unsigned shader_in:1; 17271df19f5ef6e78beb5160801f81468184b75447eEric Anholt /** 17371df19f5ef6e78beb5160801f81468184b75447eEric Anholt * If the variable value is later used outside of the scope of the shader. 17471df19f5ef6e78beb5160801f81468184b75447eEric Anholt */ 17571df19f5ef6e78beb5160801f81468184b75447eEric Anholt unsigned shader_out:1; 176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 1799d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick 1809d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick /** 1819d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * Flag that the whole array is assignable 1829d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * 1839d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * In GLSL 1.20 and later whole arrays are assignable (and comparable for 1849d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * equality). This flag enables this behavior. 1859d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick */ 1869d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick unsigned array_lvalue:1; 187326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt 188326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt /** 189c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick * Emit a warning if this variable is accessed. 190c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick */ 191c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick const char *warn_extension; 192c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick 193c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick /** 194326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt * Value assigned in the initializer of a variable declared "const" 195326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt */ 196326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt ir_constant *constant_value; 197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 2019fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/** 2029fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or 2039fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype. 2049fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */ 205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 206894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /* An ir_function_signature will be part of the list of signatures in 207894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt * an ir_function. 208894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt */ 209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 210e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick ir_function_signature(const glsl_type *return_type); 211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 21278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 21378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 21478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 21578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 21678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 2178895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2188895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 2200f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick * Get the name of the function for which this is a signature 2210f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick */ 2220f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick const char *function_name() const; 2230f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 2240f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick /** 225abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * Check whether the qualifiers match between this signature's parameters 226abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * and the supplied parameter list. If not, returns the name of the first 227abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * parameter with mismatched qualifiers (for use in error messages). 228abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke */ 229abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke const char *qualifiers_match(exec_list *params); 230abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke 231abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke /** 232bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * Replace the current parameter list with the given one. This is useful 233bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * if the current information came from a prototype, and either has invalid 234bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * or missing parameter names. 235bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke */ 236bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke void replace_parameters(exec_list *new_params); 237bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke 238bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke /** 239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 246f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_variable of function parameters. 247f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * 248f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * This represents the storage. The paramaters passed in a particular 249f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * call will be in ir_call::actual_paramaters. 250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 2510044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2539fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke /** Whether or not this function has a body (which may be empty). */ 2549fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke unsigned is_defined:1; 2556a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 256894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /** Body of instructions in the function. */ 257894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt struct exec_list body; 258894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt 2596a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate: 2606a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick /** Function of which this signature is one overload. */ 2616a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick class ir_function *function; 2626a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 2636a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick friend class ir_function; 264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 2689fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name. 2699fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the 2709fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions. 271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 274882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick ir_function(const char *name); 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2766202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual ir_function *as_function() 2776202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke { 2786202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke return this; 2796202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke } 2806202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke 28178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 28278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 28378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 28478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 28578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 2868895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2878895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 2886a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick void add_signature(ir_function_signature *sig) 2896a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick { 2906a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick sig->function = this; 2916a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick signatures.push_tail(sig); 2926a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick } 2936a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 29595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick * Get an iterator for the set of function signatures 29695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick */ 29795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick exec_list_iterator iterator() 29895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick { 29995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick return signatures.iterator(); 30095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick } 30195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick 30295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick /** 3030d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that matches a set of actual parameters, taking implicit 3040d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * conversions into account. 305471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 306471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *matching_signature(exec_list *actual_param); 307471471f83471481db0445e73f8c89e6a9149838eIan Romanick 308471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 3090d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that exactly matches a set of actual parameters without 3100d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * any implicit type conversions. 3110d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke */ 3120d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke ir_function_signature *exact_matching_signature(exec_list *actual_ps); 3130d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke 3140d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke /** 315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 319a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate: 320471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 321f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_function_signature for each overloaded function with this name. 322471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 3230044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 3250f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 3260f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const 3270f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{ 3280f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return function->name; 3290f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick} 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3333c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/** 3343c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements 3353c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 3363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction { 3373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic: 3383c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_if(ir_rvalue *condition) 3393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick : condition(condition) 3403c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 3413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick /* empty */ 3423c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 3433c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3445ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual ir_if *as_if() 3455ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt { 3465ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt return this; 3475ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt } 3485ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt 3493c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual void accept(ir_visitor *v) 3503c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 3513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick v->visit(this); 3523c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 3533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3548895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 3558895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 3563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *condition; 357f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the then branch */ 3583c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list then_instructions; 359f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the else branch */ 3603c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list else_instructions; 3613c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}; 3623c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3633c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 364fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/** 365fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure. 366fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 367fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction { 368fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic: 369fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL) 370fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 371fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /* empty */ 372fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 373fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 374fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick virtual void accept(ir_visitor *v) 375fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 376fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick v->visit(this); 377fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 378fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 3798895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 3808895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 38101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual ir_loop *as_loop() 38201f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick { 38301f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick return this; 38401f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick } 38501f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick 386fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 387fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * Get an iterator for the instructions of the loop body 388fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 389fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list_iterator iterator() 390fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 391fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick return body_instructions.iterator(); 392fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 393fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 394f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction that make up the body of the loop. */ 395fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list body_instructions; 396fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 397fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 398fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * \name Loop counter and controls 399fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 400fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@{*/ 401fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *from; 402fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *to; 403fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *increment; 404fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_variable *counter; 405fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@}*/ 406fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick}; 407fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 408fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 409fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue { 410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 411fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition); 412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 41378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 41478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 41578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 41678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 41778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 4188895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 4198895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 420cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_assignment * as_assignment() 421cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 422cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 423cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 424cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 428fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *lhs; 429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 433fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *rhs; 434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 438fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *condition; 439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4413b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when 442160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list. 4433b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 449a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke ir_unop_sign, 450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 45244d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt ir_unop_sqrt, 453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_exp, 454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_log, 45501665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_exp2, 45601665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_log2, 457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 459dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_f2b, /**< Float-to-boolean conversion */ 460dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_b2f, /**< Boolean-to-float conversion */ 461c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_i2b, /**< int-to-boolean conversion */ 462c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_b2i, /**< Boolean-to-int conversion */ 4636c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick ir_unop_u2f, /**< Unsigned-to-float conversion. */ 464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 471a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 47457e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /** 47557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke * \name Trigonometric operations. 47657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke */ 47757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@{*/ 47857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_sin, 47957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_cos, 48057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@}*/ 48157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke 482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Binary comparison operators 490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_pow 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 522fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue { 523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 525fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *, ir_rvalue *); 526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5277dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke static unsigned int get_num_operands(ir_expression_operation); 5287dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke unsigned int get_num_operands() 5297dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke { 5307dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke return get_num_operands(operation); 5317dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke } 532160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt 5333b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 5343b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Return a string representing this expression's operator. 5353b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 5363b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke const char *operator_string(); 5373b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 5383b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 5393b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Do a reverse-lookup to translate the given string into an operator. 5403b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 5413b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke static ir_expression_operation get_operator(const char *); 5423b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 54378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 54478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 54578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 54678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 54778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 5488895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 5498895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 550cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_expression *clone(); 551cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 553fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *operands[2]; 554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 557ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 558ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 559ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 560fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue { 561ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 562471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call(const ir_function_signature *callee, exec_list *actual_parameters) 563b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(callee) 564ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 5659e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick assert(callee->return_type != NULL); 5669e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick type = callee->return_type; 567471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 568ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 569ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 570cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_call *as_call() 571cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 572cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 573cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 574cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 575ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 576ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 577ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 578ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 579ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 5808895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 5818895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 582ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 583ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 584ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 585ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick static ir_call *get_error_instruction(); 586ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 5879878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick /** 5889878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick * Get an iterator for the set of acutal parameters 5899878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick */ 5909878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick exec_list_iterator iterator() 5919878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick { 5929878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick return actual_parameters.iterator(); 5939878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick } 5949878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick 59593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /** 59693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick * Get the name of the function being called. 59793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick */ 59893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick const char *callee_name() const 59993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick { 6000f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return callee->function_name(); 60193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick } 60293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick 603cad9766118d269725ef33b4e9588d674d5225010Eric Anholt const ir_function_signature *get_callee() 604cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 605cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return callee; 606cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 607cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 608cad9766118d269725ef33b4e9588d674d5225010Eric Anholt /** 609cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * Generates an inline version of the function before @ir, 610cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * returning the return value of the function. 611cad9766118d269725ef33b4e9588d674d5225010Eric Anholt */ 612cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_rvalue *generate_inline(ir_instruction *ir); 613cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 614ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 615471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 616b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(NULL) 617471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 618471471f83471481db0445e73f8c89e6a9149838eIan Romanick /* empty */ 619471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 620471471f83471481db0445e73f8c89e6a9149838eIan Romanick 621471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *callee; 622f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt 623f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /* List of ir_rvalue of paramaters passed in this call. */ 624ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick exec_list actual_parameters; 625ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 626ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 627ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 6289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 6299578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 6309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 6319578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 6329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 6339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 6349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 6359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 6369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 6379578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 6399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 6419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 6429578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 6439578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 6449578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 6459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 6469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 6489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 650fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_return(ir_rvalue *value) 6519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 6529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 6549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6559578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 656cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_return *as_return() 657cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 658cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 659cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 660cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 661fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *get_value() const 6629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6639578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 6649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 6669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 6679578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 6699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 6718895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 6728895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 6739578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate: 674fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *value; 6759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 676f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 677f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 678f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/** 679f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops 680f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 681f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue. The \c break within a loop is 682f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement. 683f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 684f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump 685f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */ 686f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump { 687f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic: 688f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode { 689f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_break, 690f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_continue 691f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick }; 692f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 693f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick ir_loop_jump(ir_loop *loop, jump_mode mode) 694f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick : loop(loop), mode(mode) 695f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 696f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /* empty */ 697f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 698f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 699f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick virtual void accept(ir_visitor *v) 700f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 701f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick v->visit(this); 702f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 703f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 7048895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 7058895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 706f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_break() const 707f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 708f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_break; 709f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 710f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 711f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_continue() const 712f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 713f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_continue; 714f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 715f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 716f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickprivate: 717f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Loop containing this break instruction. */ 718f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick ir_loop *loop; 719f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 720f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Mode selector for the jump instruction. */ 721f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode mode; 722f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick}; 7239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 7249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 7259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 726a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 727a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 728a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 729a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 730a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 731a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 732a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 733a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 734a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 735f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke unsigned num_components:3; 736a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 737a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 738a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 740a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 741a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 742a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 743a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 744a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 745affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 746affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue { 747affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic: 748affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 749affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke unsigned count); 75005a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask); 751cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 7527d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual ir_swizzle *as_swizzle() 7537d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt { 7547d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt return this; 7557d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt } 7567d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt 757cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_swizzle *clone() 758cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 759cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return new ir_swizzle(this->val, this->mask); 760cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 761cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 762affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke /** 763affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke * Construct an ir_swizzle from the textual representation. Can fail. 764affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke */ 765affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 766affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 767affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke virtual void accept(ir_visitor *v) 768affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 769affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke v->visit(this); 770affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 771affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 7728895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 7738895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 774affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke bool is_lvalue() 775affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 776a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt return val->is_lvalue() && !mask.has_duplicates; 777affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 778affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 7792b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 7802b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 7812b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 7822b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick virtual ir_variable *variable_referenced(); 7832b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 784affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_rvalue *val; 785affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle_mask mask; 786affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}; 787affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 788affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 789fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue { 790a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 79144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_dereference *as_dereference() 79244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 79344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 79444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 79544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 79678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 79778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 79878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 79978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 80078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 8018895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 8028895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 803c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt bool is_lvalue(); 804fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 8052b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 8062b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 8072b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 80870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() = 0; 8092b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 81070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick enum ir_deref_mode { 811a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_variable, 812a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_array, 813a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_record 814a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 815a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 816a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 817a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Object being dereferenced. 818a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 819fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke * Must be either an \c ir_variable or an \c ir_rvalue. 820a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 821a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *var; 822a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 823a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 824fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *array_index; 825a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *field; 826a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } selector; 82770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 82870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprotected: 82970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference(ir_deref_mode mode) 83070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick : mode(mode) 83170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 83270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /* empty */ 83370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 83470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 83570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 83670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 83770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference { 83870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 83970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_variable(ir_variable *var); 84070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 84170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 84270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 84370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 84470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 84570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 84670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick return (ir_variable *) this->var; 84770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 84870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 84970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 85070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 85170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference { 85270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 85370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index); 85470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 85570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_variable *var, ir_rvalue *array_index); 85670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 85770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 85870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 85970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 86070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 86170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 86270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick return ((ir_rvalue *) this->var)->variable_referenced(); 86370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 86470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 86570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 86670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate: 86770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick void set_array(ir_rvalue *value); 86870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 86970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 87070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 87170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference { 87270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 87370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_rvalue *value, const char *field); 87470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 87570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_variable *var, const char *field); 87670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 87770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 87870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 87970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 88070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 88170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 88270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick return ((ir_rvalue *) this->var)->variable_referenced(); 88370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 884a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 885a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 886a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 887fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue { 888a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 889a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_constant(const struct glsl_type *type, const void *data); 8903c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(bool b); 8913c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(unsigned int u); 8923c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(int i); 8933c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(float f); 894a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 8955c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual ir_constant *as_constant() 8965c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt { 8975c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt return this; 8985c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt } 8995c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt 90078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 90178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 90278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 90378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 90478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 9058895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 9068895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 907cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_constant *clone() 908cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 909cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return new ir_constant(this->type, &this->value); 910cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 911cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 912a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 913a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 914a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 915a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 916a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 917a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 918a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 919a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 920a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned u[16]; 921a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int i[16]; 922a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float f[16]; 923a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool b[16]; 924a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } value; 925a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 926a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 92770b74928a220aff024664714877defb0caedf33fEric Anholtvoid 92870b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor); 929adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 930adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 931adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 932adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 933e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 934c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void 935c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions, 936c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt struct _mesa_glsl_parse_state *state); 937c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt 938e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 939