ir.h revision 7f1ab834d7aa901ce0e12f40db23d7d9891eae59
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; } 59b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual class ir_dereference_array * as_dereference_array() { return NULL; } 60fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual class ir_rvalue * as_rvalue() { 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 98b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 99b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /** 100b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * If an r-value is a reference to a whole variable, get that variable 101b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * 102b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * \return 103b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * Pointer to a variable that is completely dereferenced by the r-value. If 104b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * the r-value is not a dereference or the dereference does not access the 105b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * entire variable (i.e., it's just one array element, struct field), \c NULL 106b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * is returned. 107b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 108b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 109b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 110b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return NULL; 111b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 112b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 113fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected: 114b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick ir_rvalue() 115b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick { 116b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick /* empty */ 117b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick } 118fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke}; 119fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 120fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_auto = 0, 123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_uniform, 124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_inout 127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation { 130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 135fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_variable(const struct glsl_type *, const char *); 139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 14044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_variable *as_variable() 14144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 14244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 14344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 14444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 14578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 14678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 14778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 14878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 14978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 1508895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1518895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1522d394d4877794d19756c3760d711524dca89f772Ian Romanick /** 1532d394d4877794d19756c3760d711524dca89f772Ian Romanick * Duplicate an IR variable 1542d394d4877794d19756c3760d711524dca89f772Ian Romanick * 1552d394d4877794d19756c3760d711524dca89f772Ian Romanick * \note 1562d394d4877794d19756c3760d711524dca89f772Ian Romanick * This will probably be made \c virtual and moved to the base class 1572d394d4877794d19756c3760d711524dca89f772Ian Romanick * eventually. 1582d394d4877794d19756c3760d711524dca89f772Ian Romanick */ 1592d394d4877794d19756c3760d711524dca89f772Ian Romanick ir_variable *clone() const 1602d394d4877794d19756c3760d711524dca89f772Ian Romanick { 1612d394d4877794d19756c3760d711524dca89f772Ian Romanick ir_variable *var = new ir_variable(type, name); 1622d394d4877794d19756c3760d711524dca89f772Ian Romanick 163b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick var->max_array_access = this->max_array_access; 1642d394d4877794d19756c3760d711524dca89f772Ian Romanick var->read_only = this->read_only; 1652d394d4877794d19756c3760d711524dca89f772Ian Romanick var->centroid = this->centroid; 1662d394d4877794d19756c3760d711524dca89f772Ian Romanick var->invariant = this->invariant; 1672d394d4877794d19756c3760d711524dca89f772Ian Romanick var->mode = this->mode; 1682d394d4877794d19756c3760d711524dca89f772Ian Romanick var->interpolation = this->interpolation; 1692d394d4877794d19756c3760d711524dca89f772Ian Romanick 1702d394d4877794d19756c3760d711524dca89f772Ian Romanick return var; 1712d394d4877794d19756c3760d711524dca89f772Ian Romanick } 1722d394d4877794d19756c3760d711524dca89f772Ian Romanick 173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 175b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick /** 176b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Highest element accessed with a constant expression array index 177b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * 178b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Not used for non-array variables. 179b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick */ 180b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick unsigned max_array_access; 181b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 18571df19f5ef6e78beb5160801f81468184b75447eEric Anholt /** If the variable is initialized outside of the scope of the shader */ 18671df19f5ef6e78beb5160801f81468184b75447eEric Anholt unsigned shader_in:1; 18771df19f5ef6e78beb5160801f81468184b75447eEric Anholt /** 18871df19f5ef6e78beb5160801f81468184b75447eEric Anholt * If the variable value is later used outside of the scope of the shader. 18971df19f5ef6e78beb5160801f81468184b75447eEric Anholt */ 19071df19f5ef6e78beb5160801f81468184b75447eEric Anholt unsigned shader_out:1; 191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 1949d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick 1959d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick /** 1969d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * Flag that the whole array is assignable 1979d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * 1989d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * In GLSL 1.20 and later whole arrays are assignable (and comparable for 1999d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * equality). This flag enables this behavior. 2009d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick */ 2019d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick unsigned array_lvalue:1; 202326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt 203326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt /** 204c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick * Emit a warning if this variable is accessed. 205c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick */ 206c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick const char *warn_extension; 207c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick 208c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick /** 209326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt * Value assigned in the initializer of a variable declared "const" 210326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt */ 211326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt ir_constant *constant_value; 212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 2169fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/** 2179fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or 2189fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype. 2199fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */ 220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 221894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /* An ir_function_signature will be part of the list of signatures in 222894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt * an ir_function. 223894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt */ 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 225e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick ir_function_signature(const glsl_type *return_type); 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 22778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 22878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 22978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 23078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 23178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 2328895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2338895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 2350f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick * Get the name of the function for which this is a signature 2360f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick */ 2370f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick const char *function_name() const; 2380f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 2390f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick /** 240abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * Check whether the qualifiers match between this signature's parameters 241abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * and the supplied parameter list. If not, returns the name of the first 242abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * parameter with mismatched qualifiers (for use in error messages). 243abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke */ 244abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke const char *qualifiers_match(exec_list *params); 245abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke 246abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke /** 247bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * Replace the current parameter list with the given one. This is useful 248bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * if the current information came from a prototype, and either has invalid 249bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * or missing parameter names. 250bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke */ 251bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke void replace_parameters(exec_list *new_params); 252bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke 253bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke /** 254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 261f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_variable of function parameters. 262f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * 263f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * This represents the storage. The paramaters passed in a particular 264f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * call will be in ir_call::actual_paramaters. 265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 2660044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2689fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke /** Whether or not this function has a body (which may be empty). */ 2699fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke unsigned is_defined:1; 2706a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 271894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /** Body of instructions in the function. */ 272894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt struct exec_list body; 273894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt 2746a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate: 2756a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick /** Function of which this signature is one overload. */ 2766a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick class ir_function *function; 2776a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 2786a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick friend class ir_function; 279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 2839fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name. 2849fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the 2859fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions. 286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 289882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick ir_function(const char *name); 290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2916202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual ir_function *as_function() 2926202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke { 2936202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke return this; 2946202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke } 2956202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke 29678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 29778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 29878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 29978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 30078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 3018895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 3028895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 3036a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick void add_signature(ir_function_signature *sig) 3046a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick { 3056a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick sig->function = this; 3066a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick signatures.push_tail(sig); 3076a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick } 3086a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 31095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick * Get an iterator for the set of function signatures 31195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick */ 31295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick exec_list_iterator iterator() 31395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick { 31495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick return signatures.iterator(); 31595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick } 31695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick 31795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick /** 3180d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that matches a set of actual parameters, taking implicit 3190d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * conversions into account. 320471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 321471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *matching_signature(exec_list *actual_param); 322471471f83471481db0445e73f8c89e6a9149838eIan Romanick 323471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 3240d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that exactly matches a set of actual parameters without 3250d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * any implicit type conversions. 3260d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke */ 3270d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke ir_function_signature *exact_matching_signature(exec_list *actual_ps); 3280d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke 3290d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke /** 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 334a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate: 335471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 336f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_function_signature for each overloaded function with this name. 337471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 3380044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 3400f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 3410f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const 3420f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{ 3430f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return function->name; 3440f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick} 345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3483c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/** 3493c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements 3503c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 3513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction { 3523c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic: 3533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_if(ir_rvalue *condition) 3543c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick : condition(condition) 3553c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 3563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick /* empty */ 3573c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 3583c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3595ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual ir_if *as_if() 3605ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt { 3615ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt return this; 3625ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt } 3635ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt 3643c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual void accept(ir_visitor *v) 3653c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 3663c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick v->visit(this); 3673c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 3683c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 3708895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 3713c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *condition; 372f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the then branch */ 3733c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list then_instructions; 374f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the else branch */ 3753c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list else_instructions; 3763c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}; 3773c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3783c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 379fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/** 380fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure. 381fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 382fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction { 383fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic: 384fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL) 385fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 386fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /* empty */ 387fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 388fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 389fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick virtual void accept(ir_visitor *v) 390fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 391fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick v->visit(this); 392fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 393fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 3948895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 3958895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 39601f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual ir_loop *as_loop() 39701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick { 39801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick return this; 39901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick } 40001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick 401fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 402fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * Get an iterator for the instructions of the loop body 403fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 404fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list_iterator iterator() 405fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 406fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick return body_instructions.iterator(); 407fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 408fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 409f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction that make up the body of the loop. */ 410fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list body_instructions; 411fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 412fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 413fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * \name Loop counter and controls 414fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 415fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@{*/ 416fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *from; 417fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *to; 418fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *increment; 419fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_variable *counter; 420fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@}*/ 421fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick}; 422fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 423fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 424fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue { 425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 426fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition); 427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 42878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 42978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 43078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 43178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 43278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 4338895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 4348895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 435cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_assignment * as_assignment() 436cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 437cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 438cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 439cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 443fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *lhs; 444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 448fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *rhs; 449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 453fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *condition; 454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4563b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when 457160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list. 4583b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 461a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 464a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke ir_unop_sign, 465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 46744d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt ir_unop_sqrt, 468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_exp, 469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_log, 47001665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_exp2, 47101665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_log2, 472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 474dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_f2b, /**< Float-to-boolean conversion */ 475dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_b2f, /**< Boolean-to-float conversion */ 476c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_i2b, /**< int-to-boolean conversion */ 477c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_b2i, /**< Boolean-to-int conversion */ 4786c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick ir_unop_u2f, /**< Unsigned-to-float conversion. */ 479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 48957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /** 49057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke * \name Trigonometric operations. 49157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke */ 49257e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@{*/ 49357e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_sin, 49457e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_cos, 49557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@}*/ 49657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke 497b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /** 498b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke * \name Partial derivatives. 499b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke */ 500b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@{*/ 501b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdx, 502b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdy, 503b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@}*/ 504b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke 505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Binary comparison operators 513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 537a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 538a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 539a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 540a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 541a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_pow 543a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 545fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue { 546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 548fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *, ir_rvalue *); 549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5507dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke static unsigned int get_num_operands(ir_expression_operation); 5517dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke unsigned int get_num_operands() 5527dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke { 5537dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke return get_num_operands(operation); 5547dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke } 555160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt 5563b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 5573b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Return a string representing this expression's operator. 5583b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 5593b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke const char *operator_string(); 5603b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 5613b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 5623b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Do a reverse-lookup to translate the given string into an operator. 5633b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 5643b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke static ir_expression_operation get_operator(const char *); 5653b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 56678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 56778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 56878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 56978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 57078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 5718895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 5728895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 573cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_expression *clone(); 574cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 576fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *operands[2]; 577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 580ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 581ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 582ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 583fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue { 584ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 585471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call(const ir_function_signature *callee, exec_list *actual_parameters) 586b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(callee) 587ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 5889e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick assert(callee->return_type != NULL); 5899e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick type = callee->return_type; 590471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 591ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 592ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 593cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_call *as_call() 594cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 595cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 596cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 597cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 598ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 599ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 600ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 601ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 602ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 6038895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 6048895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 605ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 606ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 607ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 608ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick static ir_call *get_error_instruction(); 609ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 6109878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick /** 6119878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick * Get an iterator for the set of acutal parameters 6129878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick */ 6139878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick exec_list_iterator iterator() 6149878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick { 6159878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick return actual_parameters.iterator(); 6169878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick } 6179878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick 61893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /** 61993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick * Get the name of the function being called. 62093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick */ 62193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick const char *callee_name() const 62293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick { 6230f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return callee->function_name(); 62493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick } 62593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick 626cad9766118d269725ef33b4e9588d674d5225010Eric Anholt const ir_function_signature *get_callee() 627cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 628cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return callee; 629cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 630cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 631cad9766118d269725ef33b4e9588d674d5225010Eric Anholt /** 632cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * Generates an inline version of the function before @ir, 633cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * returning the return value of the function. 634cad9766118d269725ef33b4e9588d674d5225010Eric Anholt */ 635cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_rvalue *generate_inline(ir_instruction *ir); 636cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 637ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 638471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 639b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(NULL) 640471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 641471471f83471481db0445e73f8c89e6a9149838eIan Romanick /* empty */ 642471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 643471471f83471481db0445e73f8c89e6a9149838eIan Romanick 644471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *callee; 645f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt 646f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /* List of ir_rvalue of paramaters passed in this call. */ 647ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick exec_list actual_parameters; 648ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 649ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 650ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 6519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 6529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 6539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 6549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 6559578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 6569578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 6579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 6589578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 6599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 6609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6619578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 6629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6639578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 6649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 6659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 6669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 6679578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 6689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 6699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 6719578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6729578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 673fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_return(ir_rvalue *value) 6749578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 6759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6769578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 6779578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6789578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 679cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_return *as_return() 680cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 681cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 682cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 683cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 684fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *get_value() const 6859578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6869578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 6879578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6889578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 6899578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 6909578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 6919578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 6929578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 6939578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 6948895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 6958895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 696fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *value; 6979578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 698f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 699f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 700f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/** 701f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops 702f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 703f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue. The \c break within a loop is 704f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement. 705f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 706f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump 707f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */ 708f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump { 709f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic: 710f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode { 711f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_break, 712f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_continue 713f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick }; 714f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 715f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick ir_loop_jump(ir_loop *loop, jump_mode mode) 716f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick : loop(loop), mode(mode) 717f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 718f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /* empty */ 719f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 720f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 721f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick virtual void accept(ir_visitor *v) 722f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 723f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick v->visit(this); 724f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 725f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 7268895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 7278895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 728f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_break() const 729f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 730f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_break; 731f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 732f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 733f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_continue() const 734f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 735f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_continue; 736f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 737f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 738f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickprivate: 739f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Loop containing this break instruction. */ 740f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick ir_loop *loop; 741f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 742f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Mode selector for the jump instruction. */ 743f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode mode; 744f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick}; 7459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 7469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 7479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 74881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 74981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture 75081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 75181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode { 75281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_tex, /* Regular texture look-up */ 75381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txb, /* Texture look-up with LOD bias */ 75481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txl, /* Texture look-up with explicit LOD */ 75581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txd, /* Texture look-up with partial derivatvies */ 75681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txf /* Texel fetch with explicit LOD */ 75781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 75881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 75981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 76081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 76181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture 76281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 76381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value 76481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes. In the printed IR, these will 76581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as: 76681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 76781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texel offset 76881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | Projection divisor 76981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | | Shadow comparitor 77081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | | | 77181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * v v v 77281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (tex (sampler) (coordinate) (0 0 0) (1) ( )) 77381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias)) 77481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod)) 77581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy)) 77681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txf (sampler) (coordinate) (0 0 0) (lod)) 77781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 77881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue { 77981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic: 78081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_texture(enum ir_texture_opcode op) 781b97efa5db5fce2e0d9a4c61a939c85b240c89170Kenneth Graunke : op(op), projector(NULL), shadow_comparitor(NULL) 78281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick { 78381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /* empty */ 78481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } 78581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 78626d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual void accept(ir_visitor *v) 78726d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke { 78826d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke v->visit(this); 78926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke } 79026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 79126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 79226d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 793c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 794c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Return a string representing the ir_texture_opcode. 795c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 796c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke const char *opcode_string(); 797c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 79856d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke /** Set the sampler and infer the type. */ 79956d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke void set_sampler(ir_dereference *sampler); 80056d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke 801c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 802c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Do a reverse-lookup to translate a string into an ir_texture_opcode. 803c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 804c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke static ir_texture_opcode get_opcode(const char *); 805c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 80681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick enum ir_texture_opcode op; 80781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 80881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Sampler to use for the texture access. */ 80981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_dereference *sampler; 81081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 81181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Texture coordinate to sample */ 81281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *coordinate; 81381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 81481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 81581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Value used for projective divide. 81681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 81781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no projective divide (the common case), this will be 81881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c NULL. Optimization passes should check for this to point to a constant 81981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * of 1.0 and replace that with \c NULL. 82081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 82181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *projector; 82281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 82381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 82481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Coordinate used for comparison on shadow look-ups. 82581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 82681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no shadow comparison, this will be \c NULL. For the 82781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c ir_txf opcode, this *must* be \c NULL. 82881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 82981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *shadow_comparitor; 83081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 83181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Explicit texel offsets. */ 83281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick signed char offsets[3]; 83381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 83481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick union { 83581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *lod; /**< Floating point LOD */ 83681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *bias; /**< Floating point LOD bias */ 83781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick struct { 83881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdx; /**< Partial derivative of coordinate wrt X */ 83981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdy; /**< Partial derivative of coordinate wrt Y */ 84081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } grad; 84181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } lod_info; 84281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 84381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 84481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 845a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 846a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 847a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 848a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 849a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 850a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 851a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 852a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 853a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 854f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke unsigned num_components:3; 855a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 856a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 857a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 858a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 859a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 860a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 861a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 862a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 863a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 864affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 865affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue { 866affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic: 867affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 868affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke unsigned count); 86905a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask); 870cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 8717d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual ir_swizzle *as_swizzle() 8727d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt { 8737d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt return this; 8747d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt } 8757d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt 876cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_swizzle *clone() 877cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 878cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return new ir_swizzle(this->val, this->mask); 879cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 880cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 881affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke /** 882affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke * Construct an ir_swizzle from the textual representation. Can fail. 883affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke */ 884affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 885affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 886affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke virtual void accept(ir_visitor *v) 887affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 888affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke v->visit(this); 889affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 890affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 8918895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 8928895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 893affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke bool is_lvalue() 894affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 895a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt return val->is_lvalue() && !mask.has_duplicates; 896affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 897affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 8982b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 8992b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 9002b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 9012b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick virtual ir_variable *variable_referenced(); 9022b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 903affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_rvalue *val; 904affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle_mask mask; 905affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}; 906affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 907affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 908fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue { 909a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 91044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_dereference *as_dereference() 91144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 91244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 91344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 91444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 915c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt bool is_lvalue(); 916fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 9172b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 9182b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 9192b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 92070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() = 0; 92170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 92270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 92370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 92470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference { 92570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 92670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_variable(ir_variable *var); 92770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 92870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 92970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 93070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 93170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 93270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 93336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->var; 93470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 935f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 936b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 937b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 938b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /* ir_dereference_variable objects always dereference the entire 939b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * variable. However, if this dereference is dereferenced by anything 940b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * else, the complete deferefernce chain is not a whole-variable 941b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * dereference. This method should only be called on the top most 942b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * ir_rvalue in a dereference chain. 943b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 944b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return this->var; 945b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 946b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 947c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 948c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 949c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 950c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 951c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 952f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 95336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 95436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick /** 95536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick * Object being dereferenced. 95636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick */ 95736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_variable *var; 95870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 95970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 96070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 96170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference { 96270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 96370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index); 96470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 96570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_variable *var, ir_rvalue *array_index); 96670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 967b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual ir_dereference_array *as_dereference_array() 968b145e903694fa932ab1e0d955e889555193ab604Eric Anholt { 969b145e903694fa932ab1e0d955e889555193ab604Eric Anholt return this; 970b145e903694fa932ab1e0d955e889555193ab604Eric Anholt } 971b145e903694fa932ab1e0d955e889555193ab604Eric Anholt 97270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 97370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 97470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 97570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 97670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 97736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->array->variable_referenced(); 97870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 97970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 980c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 981c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 982c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 983c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 984c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 985f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 98670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 98736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array; 98836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array_index; 98936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 99070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate: 99170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick void set_array(ir_rvalue *value); 99270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 99370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 99470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 99570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference { 99670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 99770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_rvalue *value, const char *field); 99870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 99970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_variable *var, const char *field); 100070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 100170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 100270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 100370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 100470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 100570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 100636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->record->variable_referenced(); 100770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 1008f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 1009c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1010c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1011c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1012c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1013c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1014f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 101536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 101636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *record; 101736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick const char *field; 1018a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1019a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1020a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1021fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue { 1022a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 1023a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_constant(const struct glsl_type *type, const void *data); 10243c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(bool b); 10253c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(unsigned int u); 10263c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(int i); 10273c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(float f); 1028a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1029989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick /** 1030756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick * Construct an ir_constant from a list of ir_constant values 1031756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick */ 1032756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick ir_constant(const struct glsl_type *type, exec_list *values); 1033756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick 1034756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick /** 1035989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * Construct an ir_constant from a scalar component of another ir_constant 1036989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1037989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * The new \c ir_constant inherits the type of the component from the 1038989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * source constant. 1039989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1040989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * \note 1041989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * In the case of a matrix constant, the new constant is a scalar, \b not 1042989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * a vector. 1043989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick */ 1044989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick ir_constant(const ir_constant *c, unsigned i); 1045989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick 10465c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual ir_constant *as_constant() 10475c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt { 10485c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt return this; 10495c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt } 10505c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt 105178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 105278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 105378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 105478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 105578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 10568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 10578895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1058cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_constant *clone() 1059cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 1060cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return new ir_constant(this->type, &this->value); 1061cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 1062cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 1063a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 106431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * Get a particular component of a constant as a specific type 106531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * 106631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * This is useful, for example, to get a value from an integer constant 106731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * as a float or bool. This appears frequently when constructors are 106831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * called with all constant parameters. 106931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick */ 107031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@{*/ 107131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick bool get_bool_component(unsigned i) const; 107231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick float get_float_component(unsigned i) const; 107331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick int get_int_component(unsigned i) const; 107431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick unsigned get_uint_component(unsigned i) const; 107531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@}*/ 107631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick 107731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /** 1078a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 1079a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1080a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 1081a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 1082a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 1083a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1084a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 1085a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned u[16]; 1086a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int i[16]; 1087a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float f[16]; 1088a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool b[16]; 1089a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } value; 10907f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick 10917f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick exec_list components; 1092a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1093a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 109470b74928a220aff024664714877defb0caedf33fEric Anholtvoid 109570b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor); 1096adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 1097adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 1098adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 1099adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 1100e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 1101c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void 1102c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions, 1103c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt struct _mesa_glsl_parse_state *state); 1104c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt 1105e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 1106