ir.h revision 8a1f186cc55979bb9df0a88b48da8d81460c3e7c
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 29ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt#include <cstdio> 30ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt#include <cstdlib> 31ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt 32f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worthextern "C" { 33f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worth#include <talloc.h> 34f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worth} 35f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worth 360044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h" 3778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h" 388895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick#include "ir_hierarchical_visitor.h" 390044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick 40829e0a8eff0e657c85fa7fc53a4b456375b434ccEric Anholt#ifndef ARRAY_SIZE 41829e0a8eff0e657c85fa7fc53a4b456375b434ccEric Anholt#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) 42829e0a8eff0e657c85fa7fc53a4b456375b434ccEric Anholt#endif 43829e0a8eff0e657c85fa7fc53a4b456375b434ccEric Anholt 44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_program { 45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick void *bong_hits; 46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions 50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 510044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node { 52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 53a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 551cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick class ir_constant *constant_expression_value(); 56e46a454305af64710ce8deadafc718f75363ac7eEric Anholt 57e46a454305af64710ce8deadafc718f75363ac7eEric Anholt /** ir_print_visitor helper for debugging. */ 584b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt void print(void) const; 59e46a454305af64710ce8deadafc718f75363ac7eEric Anholt 6078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *) = 0; 618895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0; 624b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *ht) const = 0; 6378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 6444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /** 6544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \name IR instruction downcast functions 6644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * 6744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * These functions either cast the object to a derived class or return 6844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \c NULL if the object's type does not match the specified derived class. 6944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * Additional downcast functions will be added as needed. 7044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke */ 7144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@{*/ 7244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_variable * as_variable() { return NULL; } 736202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual class ir_function * as_function() { return NULL; } 7444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_dereference * as_dereference() { return NULL; } 75b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual class ir_dereference_array * as_dereference_array() { return NULL; } 76d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt virtual class ir_dereference_variable *as_dereference_variable() { return NULL; } 77fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual class ir_rvalue * as_rvalue() { return NULL; } 7801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual class ir_loop * as_loop() { return NULL; } 79cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_assignment * as_assignment() { return NULL; } 80cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_call * as_call() { return NULL; } 81cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_return * as_return() { return NULL; } 825ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual class ir_if * as_if() { return NULL; } 837d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual class ir_swizzle * as_swizzle() { return NULL; } 845c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual class ir_constant * as_constant() { return NULL; } 8544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@}*/ 8644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 8844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke ir_instruction() 89d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 90d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick /* empty */ 91d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 95fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction { 96fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic: 97fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue * as_rvalue() 98fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 99fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return this; 100fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 101fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 102fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual bool is_lvalue() 103fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 104fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return false; 105fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 106fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 1072b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 1082b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 1092b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 1102b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick virtual ir_variable *variable_referenced() 1112b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick { 1122b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick return NULL; 1132b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick } 1142b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 115b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 116b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /** 117b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * If an r-value is a reference to a whole variable, get that variable 118b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * 119b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * \return 120b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * Pointer to a variable that is completely dereferenced by the r-value. If 121b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * the r-value is not a dereference or the dereference does not access the 122b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * entire variable (i.e., it's just one array element, struct field), \c NULL 123b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * is returned. 124b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 125b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 126b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 127b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return NULL; 128b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 129b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 130fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected: 131b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick ir_rvalue() 132b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick { 133b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick /* empty */ 134b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick } 135fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke}; 136fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 137fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_auto = 0, 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_uniform, 141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_inout 144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 146a22426dc4c934673e8f0af5c70a67505a4de7aadCarl Worthenum ir_variable_interpolation { 147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 152fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_variable(const struct glsl_type *, const char *); 156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1574b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *ht) const; 1584b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 15944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_variable *as_variable() 16044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 16144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 16244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 16344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 16478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 16578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 16678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 16778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 16878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 1698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1708895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1712d394d4877794d19756c3760d711524dca89f772Ian Romanick 172950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick /** 173950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * Get the string value for the interpolation qualifier 174950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * 175950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * \return 176950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * If none of \c shader_in or \c shader_out is set, an empty string will 177950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * be returned. Otherwise the string that would be used in a shader to 178950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * specify \c mode will be returned. 179950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick */ 180950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick const char *interpolation_string() const; 181950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick 1828b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick /** 1838b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * Calculate the number of slots required to hold this variable 1848b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * 1858b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * This is used to determine how many uniform or varying locations a variable 1868b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * occupies. The count is in units of floating point components. 1878b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick */ 1888b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick unsigned component_slots() const; 1898b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick 190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 192b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick /** 193b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Highest element accessed with a constant expression array index 194b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * 195b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Not used for non-array variables. 196b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick */ 197b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick unsigned max_array_access; 198b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 20271df19f5ef6e78beb5160801f81468184b75447eEric Anholt /** If the variable is initialized outside of the scope of the shader */ 20371df19f5ef6e78beb5160801f81468184b75447eEric Anholt unsigned shader_in:1; 20471df19f5ef6e78beb5160801f81468184b75447eEric Anholt /** 20571df19f5ef6e78beb5160801f81468184b75447eEric Anholt * If the variable value is later used outside of the scope of the shader. 20671df19f5ef6e78beb5160801f81468184b75447eEric Anholt */ 20771df19f5ef6e78beb5160801f81468184b75447eEric Anholt unsigned shader_out:1; 208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 2119d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick 2129d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick /** 2139d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * Flag that the whole array is assignable 2149d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * 2159d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * In GLSL 1.20 and later whole arrays are assignable (and comparable for 2169d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * equality). This flag enables this behavior. 2179d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick */ 2189d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick unsigned array_lvalue:1; 219326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt 220326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt /** 22169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * Storage location of the base of this variable 22269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 22369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * The precise meaning of this field depends on the nature of the variable. 22469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 22569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Vertex shader input: one of the values from \c gl_vert_attrib. 22669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Vertex shader output: one of the values from \c gl_vert_result. 22769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Fragment shader input: one of the values from \c gl_frag_attrib. 22869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Fragment shader output: one of the values from \c gl_frag_result. 22969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Uniforms: Per-stage uniform slot number. 23069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Other: This field is not currently used. 23169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 23269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * If the variable is a uniform, shader input, or shader output, and the 23369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * slot has not been assigned, the value will be -1. 23469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick */ 23569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick int location; 23669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick 23769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick /** 238c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick * Emit a warning if this variable is accessed. 239c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick */ 240c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick const char *warn_extension; 241c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick 242c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick /** 243326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt * Value assigned in the initializer of a variable declared "const" 244326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt */ 245326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt ir_constant *constant_value; 246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 2509fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/** 2519fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or 2529fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype. 2539fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */ 254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 255894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /* An ir_function_signature will be part of the list of signatures in 256894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt * an ir_function. 257894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt */ 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 259e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick ir_function_signature(const glsl_type *return_type); 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2614b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *ht) const; 2624b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 26378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 26478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 26578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 26678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 26778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 2688895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 2710f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick * Get the name of the function for which this is a signature 2720f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick */ 2730f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick const char *function_name() const; 2740f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 2750f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick /** 276abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * Check whether the qualifiers match between this signature's parameters 277abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * and the supplied parameter list. If not, returns the name of the first 278abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * parameter with mismatched qualifiers (for use in error messages). 279abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke */ 280abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke const char *qualifiers_match(exec_list *params); 281abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke 282abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke /** 283bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * Replace the current parameter list with the given one. This is useful 284bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * if the current information came from a prototype, and either has invalid 285bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * or missing parameter names. 286bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke */ 287bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke void replace_parameters(exec_list *new_params); 288bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke 289bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke /** 290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 297f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_variable of function parameters. 298f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * 299f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * This represents the storage. The paramaters passed in a particular 300f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * call will be in ir_call::actual_paramaters. 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 3020044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3049fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke /** Whether or not this function has a body (which may be empty). */ 3059fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke unsigned is_defined:1; 3066a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 307894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /** Body of instructions in the function. */ 308894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt struct exec_list body; 309894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt 3106a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate: 3116a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick /** Function of which this signature is one overload. */ 3126a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick class ir_function *function; 3136a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 3146a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick friend class ir_function; 315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 3199fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name. 3209fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the 3219fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions. 322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 325882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick ir_function(const char *name); 326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3274b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *ht) const; 3284b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 3296202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual ir_function *as_function() 3306202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke { 3316202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke return this; 3326202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke } 3336202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke 33478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 33578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 33678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 33778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 33878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 3398895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 3408895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 3416a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick void add_signature(ir_function_signature *sig) 3426a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick { 3436a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick sig->function = this; 3446a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick signatures.push_tail(sig); 3456a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick } 3466a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 34895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick * Get an iterator for the set of function signatures 34995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick */ 35095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick exec_list_iterator iterator() 35195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick { 35295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick return signatures.iterator(); 35395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick } 35495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick 35595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick /** 3560d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that matches a set of actual parameters, taking implicit 3570d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * conversions into account. 358471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 359471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *matching_signature(exec_list *actual_param); 360471471f83471481db0445e73f8c89e6a9149838eIan Romanick 361471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 3620d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that exactly matches a set of actual parameters without 3630d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * any implicit type conversions. 3640d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke */ 3650d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke ir_function_signature *exact_matching_signature(exec_list *actual_ps); 3660d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke 3670d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke /** 368a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 369a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 370a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 371a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 372a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate: 373471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 374f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_function_signature for each overloaded function with this name. 375471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 3760044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 377a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 3780f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 3790f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const 3800f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{ 3810f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return function->name; 3820f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick} 383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3863c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/** 3873c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements 3883c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 3893c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction { 3903c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic: 3913c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_if(ir_rvalue *condition) 3923c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick : condition(condition) 3933c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 3943c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick /* empty */ 3953c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 3963c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3974b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *ht) const; 3984b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 3995ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual ir_if *as_if() 4005ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt { 4015ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt return this; 4025ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt } 4035ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt 4043c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual void accept(ir_visitor *v) 4053c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 4063c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick v->visit(this); 4073c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 4083c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 4098895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 4108895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 4113c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *condition; 412f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the then branch */ 4133c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list then_instructions; 414f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the else branch */ 4153c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list else_instructions; 4163c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}; 4173c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 4183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 419fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/** 420fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure. 421fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 422fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction { 423fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic: 424fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL) 425fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 426fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /* empty */ 427fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 428fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 4294b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *ht) const; 4304b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 431fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick virtual void accept(ir_visitor *v) 432fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 433fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick v->visit(this); 434fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 435fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 4368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 4378895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 43801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual ir_loop *as_loop() 43901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick { 44001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick return this; 44101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick } 44201f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick 443fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 444fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * Get an iterator for the instructions of the loop body 445fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 446fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list_iterator iterator() 447fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 448fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick return body_instructions.iterator(); 449fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 450fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 451f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction that make up the body of the loop. */ 452fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list body_instructions; 453fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 454fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 455fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * \name Loop counter and controls 456fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 457fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@{*/ 458fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *from; 459fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *to; 460fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *increment; 461fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_variable *counter; 462fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@}*/ 463fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick}; 464fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 465fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 466fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue { 467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 468fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition); 469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4704b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *ht) const; 4714b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 47278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 47378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 47478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 47578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 47678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 4778895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 4788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 479cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_assignment * as_assignment() 480cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 481cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 482cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 483cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 487fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *lhs; 488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 492fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *rhs; 493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 497fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *condition; 498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5003b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when 501160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list. 5023b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 508a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke ir_unop_sign, 509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 51144d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt ir_unop_sqrt, 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_exp, 513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_log, 51401665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_exp2, 51501665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_log2, 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 518dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_f2b, /**< Float-to-boolean conversion */ 519dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_b2f, /**< Boolean-to-float conversion */ 520c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_i2b, /**< int-to-boolean conversion */ 521c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_b2i, /**< Boolean-to-int conversion */ 5226c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick ir_unop_u2f, /**< Unsigned-to-float conversion. */ 523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 531d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt ir_unop_fract, 532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 53457e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /** 53557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke * \name Trigonometric operations. 53657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke */ 53757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@{*/ 53857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_sin, 53957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_cos, 54057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@}*/ 54157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke 542b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /** 543b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke * \name Partial derivatives. 544b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke */ 545b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@{*/ 546b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdx, 547b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdy, 548b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@}*/ 549b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke 550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 5548a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt 5558a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt /** 5568a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * Takes one of two combinations of arguments: 5578a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * 5588a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * - mod(vecN, vecN) 5598a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * - mod(vecN, float) 5608a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * 5618a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * Does not take integer types. 5628a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt */ 563a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 565a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 566a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Binary comparison operators 567a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 568a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 573a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 576a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 581a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 594a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_pow 597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 599fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue { 600a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 601a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 602fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *, ir_rvalue *); 603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 6044b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *ht) const; 6054b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 6067dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke static unsigned int get_num_operands(ir_expression_operation); 6074b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt unsigned int get_num_operands() const 6087dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke { 6097dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke return get_num_operands(operation); 6107dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke } 611160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt 6123b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 6133b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Return a string representing this expression's operator. 6143b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 6153b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke const char *operator_string(); 6163b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 6173b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 6183b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Do a reverse-lookup to translate the given string into an operator. 6193b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 6203b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke static ir_expression_operation get_operator(const char *); 6213b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 62278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 62378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 62478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 62578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 62678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 6278895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 6288895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 630fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *operands[2]; 631a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 634ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 635ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 636ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 637fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue { 638ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 639471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call(const ir_function_signature *callee, exec_list *actual_parameters) 640b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(callee) 641ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 6429e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick assert(callee->return_type != NULL); 6439e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick type = callee->return_type; 644471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 645ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 646ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 6474b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *ht) const; 6484b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 649cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_call *as_call() 650cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 651cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 652cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 653cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 654ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 655ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 656ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 657ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 658ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 6598895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 6608895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 661ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 662ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 663e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth * 664e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth * Any allocation will be performed with 'ctx' as talloc owner. 665ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 666e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth static ir_call *get_error_instruction(void *ctx); 667ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 6689878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick /** 6699878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick * Get an iterator for the set of acutal parameters 6709878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick */ 6719878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick exec_list_iterator iterator() 6729878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick { 6739878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick return actual_parameters.iterator(); 6749878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick } 6759878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick 67693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /** 67793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick * Get the name of the function being called. 67893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick */ 67993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick const char *callee_name() const 68093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick { 6810f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return callee->function_name(); 68293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick } 68393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick 684cad9766118d269725ef33b4e9588d674d5225010Eric Anholt const ir_function_signature *get_callee() 685cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 686cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return callee; 687cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 688cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 689cad9766118d269725ef33b4e9588d674d5225010Eric Anholt /** 690cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * Generates an inline version of the function before @ir, 691cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * returning the return value of the function. 692cad9766118d269725ef33b4e9588d674d5225010Eric Anholt */ 693cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_rvalue *generate_inline(ir_instruction *ir); 694cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 695ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 696471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 697b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(NULL) 698471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 699471471f83471481db0445e73f8c89e6a9149838eIan Romanick /* empty */ 700471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 701471471f83471481db0445e73f8c89e6a9149838eIan Romanick 702471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *callee; 703f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt 704f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /* List of ir_rvalue of paramaters passed in this call. */ 705ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick exec_list actual_parameters; 706ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 707ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 708ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 7099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 7109578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 7119578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 7129578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 7139578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 7149578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 7159578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 7169578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 7179578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 7189578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 7199578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 7209578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 7219578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 7229578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 7239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 7249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 7259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 7269578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 7279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 7289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 7299578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 7309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 731fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_return(ir_rvalue *value) 7329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 7339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 7349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 7359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 7369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 7374b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *) const; 7384b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 739cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_return *as_return() 740cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 741cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 742cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 743cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 744fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *get_value() const 7459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 7469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 7479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 7489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 7499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 7509578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 7519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 7529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 7539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 7548895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 7558895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 756fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *value; 7579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 758f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 759f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 760f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/** 761f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops 762f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 763f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue. The \c break within a loop is 764f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement. 765f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 766f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump 767f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */ 768f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump { 769f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic: 770f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode { 771f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_break, 772f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_continue 773f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick }; 774f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 7754b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt ir_loop_jump(jump_mode mode) 776f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 7770c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt this->mode = mode; 7780c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt this->loop = loop; 779f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 780f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 7814b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *) const; 7824b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 783f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick virtual void accept(ir_visitor *v) 784f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 785f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick v->visit(this); 786f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 787f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 7888895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 7898895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 790f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_break() const 791f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 792f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_break; 793f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 794f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 795f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_continue() const 796f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 797f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_continue; 798f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 799f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 800f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Mode selector for the jump instruction. */ 801f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode mode; 8020c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholtprivate: 8030c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt /** Loop containing this break instruction. */ 8040c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt ir_loop *loop; 805f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick}; 80616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 80716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke/** 80816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke * IR instruction representing discard statements. 80916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke */ 81016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeclass ir_discard : public ir_jump { 81116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkepublic: 81216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_discard() 81316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 81416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke this->condition = NULL; 81516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 81616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 81716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_discard(ir_rvalue *cond) 81816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 81916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke this->condition = cond; 82016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 82116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 82216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual ir_instruction *clone(struct hash_table *ht) const; 82316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 82416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual void accept(ir_visitor *v) 82516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 82616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke v->visit(this); 82716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 82816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 82916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 83016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 83116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_rvalue *condition; 83216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke}; 8339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 8349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 8359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 83681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 83781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture 83881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 83981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode { 84081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_tex, /* Regular texture look-up */ 84181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txb, /* Texture look-up with LOD bias */ 84281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txl, /* Texture look-up with explicit LOD */ 84381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txd, /* Texture look-up with partial derivatvies */ 84481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txf /* Texel fetch with explicit LOD */ 84581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 84681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 84781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 84881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 84981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture 85081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 85181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value 85281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes. In the printed IR, these will 85381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as: 85481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 85581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texel offset 85681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | Projection divisor 85781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | | Shadow comparitor 85881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | | | 85981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * v v v 86081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (tex (sampler) (coordinate) (0 0 0) (1) ( )) 86181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias)) 86281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod)) 86381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy)) 86481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txf (sampler) (coordinate) (0 0 0) (lod)) 86581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 86681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue { 86781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic: 86881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_texture(enum ir_texture_opcode op) 869b97efa5db5fce2e0d9a4c61a939c85b240c89170Kenneth Graunke : op(op), projector(NULL), shadow_comparitor(NULL) 87081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick { 87181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /* empty */ 87281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } 87381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 8744b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *) const; 8754b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 87626d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual void accept(ir_visitor *v) 87726d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke { 87826d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke v->visit(this); 87926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke } 88026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 88126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 88226d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 883c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 884c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Return a string representing the ir_texture_opcode. 885c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 886c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke const char *opcode_string(); 887c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 88856d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke /** Set the sampler and infer the type. */ 88956d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke void set_sampler(ir_dereference *sampler); 89056d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke 891c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 892c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Do a reverse-lookup to translate a string into an ir_texture_opcode. 893c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 894c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke static ir_texture_opcode get_opcode(const char *); 895c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 89681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick enum ir_texture_opcode op; 89781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 89881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Sampler to use for the texture access. */ 89981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_dereference *sampler; 90081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 90181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Texture coordinate to sample */ 90281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *coordinate; 90381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 90481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 90581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Value used for projective divide. 90681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 90781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no projective divide (the common case), this will be 90881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c NULL. Optimization passes should check for this to point to a constant 90981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * of 1.0 and replace that with \c NULL. 91081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 91181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *projector; 91281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 91381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 91481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Coordinate used for comparison on shadow look-ups. 91581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 91681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no shadow comparison, this will be \c NULL. For the 91781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c ir_txf opcode, this *must* be \c NULL. 91881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 91981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *shadow_comparitor; 92081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 92181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Explicit texel offsets. */ 92281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick signed char offsets[3]; 92381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 92481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick union { 92581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *lod; /**< Floating point LOD */ 92681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *bias; /**< Floating point LOD bias */ 92781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick struct { 92881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdx; /**< Partial derivative of coordinate wrt X */ 92981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdy; /**< Partial derivative of coordinate wrt Y */ 93081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } grad; 93181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } lod_info; 93281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 93381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 93481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 935a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 936a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 937a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 938a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 939a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 940a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 941a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 942a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 943a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 944f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke unsigned num_components:3; 945a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 946a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 947a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 948a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 949a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 950a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 951a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 952a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 953a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 954affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 955affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue { 956affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic: 957affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 958affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke unsigned count); 9596315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 9606315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count); 9616315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 96205a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask); 963cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 9644b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *) const; 9654b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 9667d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual ir_swizzle *as_swizzle() 9677d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt { 9687d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt return this; 9697d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt } 9707d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt 971affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke /** 972affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke * Construct an ir_swizzle from the textual representation. Can fail. 973affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke */ 974affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 975affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 976affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke virtual void accept(ir_visitor *v) 977affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 978affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke v->visit(this); 979affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 980affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 9818895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 9828895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 983affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke bool is_lvalue() 984affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 985a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt return val->is_lvalue() && !mask.has_duplicates; 986affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 987affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 9882b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 9892b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 9902b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 9912b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick virtual ir_variable *variable_referenced(); 9922b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 993affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_rvalue *val; 994affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle_mask mask; 9956315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 9966315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanickprivate: 9976315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick /** 9986315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * Initialize the mask component of a swizzle 9996315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * 10006315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * This is used by the \c ir_swizzle constructors. 10016315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick */ 10026315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick void init_mask(const unsigned *components, unsigned count); 1003affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}; 1004affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1005affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1006fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue { 1007a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 100844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_dereference *as_dereference() 100944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 101044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 101144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 101244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 1013c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt bool is_lvalue(); 1014fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 10152b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 10162b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 10172b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 101870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() = 0; 101970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 102070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 102170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 102270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference { 102370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 102470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_variable(ir_variable *var); 102570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 10264b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *) const; 10274b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1028d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt virtual ir_dereference_variable *as_dereference_variable() 1029d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt { 1030d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt return this; 1031d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt } 1032d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 103370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 103470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 103570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 103670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 103770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 103836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->var; 103970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 1040f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 1041b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 1042b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 1043b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /* ir_dereference_variable objects always dereference the entire 1044b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * variable. However, if this dereference is dereferenced by anything 1045b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * else, the complete deferefernce chain is not a whole-variable 1046b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * dereference. This method should only be called on the top most 1047b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * ir_rvalue in a dereference chain. 1048b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 1049b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return this->var; 1050b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 1051b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 1052c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1053c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1054c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1055c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1056c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1057f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 105836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 105936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick /** 106036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick * Object being dereferenced. 106136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick */ 106236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_variable *var; 106370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 106470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 106570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 106670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference { 106770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 106870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index); 106970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 107070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_variable *var, ir_rvalue *array_index); 107170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 10724b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *) const; 10734b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1074b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual ir_dereference_array *as_dereference_array() 1075b145e903694fa932ab1e0d955e889555193ab604Eric Anholt { 1076b145e903694fa932ab1e0d955e889555193ab604Eric Anholt return this; 1077b145e903694fa932ab1e0d955e889555193ab604Eric Anholt } 1078b145e903694fa932ab1e0d955e889555193ab604Eric Anholt 107970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 108070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 108170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 108270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 108370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 108436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->array->variable_referenced(); 108570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 108670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 1087c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1088c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1089c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1090c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1091c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1092f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 109370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 109436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array; 109536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array_index; 109636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 109770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate: 109870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick void set_array(ir_rvalue *value); 109970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 110070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 110170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 110270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference { 110370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 110470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_rvalue *value, const char *field); 110570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 110670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_variable *var, const char *field); 110770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 11084b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *) const; 11094b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 111070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 111170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 111270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 111370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 111470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 111536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->record->variable_referenced(); 111670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 1117f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 1118c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1119c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1120c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1121c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1122c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1123f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 112436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 112536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *record; 112636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick const char *field; 1127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1130be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/** 1131be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick * Data stored in an ir_constant 1132be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick */ 1133be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanickunion ir_constant_data { 1134be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick unsigned u[16]; 1135be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick int i[16]; 1136be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick float f[16]; 1137be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick bool b[16]; 1138be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick}; 1139be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick 1140be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick 1141fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue { 1142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 1143824b659d917a5f14a1f66b891d25036ef9f9adc6Ian Romanick ir_constant(const struct glsl_type *type, const ir_constant_data *data); 11443c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(bool b); 11453c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(unsigned int u); 11463c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(int i); 11473c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(float f); 1148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1149989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick /** 1150756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick * Construct an ir_constant from a list of ir_constant values 1151756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick */ 1152756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick ir_constant(const struct glsl_type *type, exec_list *values); 1153756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick 1154756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick /** 1155989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * Construct an ir_constant from a scalar component of another ir_constant 1156989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1157989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * The new \c ir_constant inherits the type of the component from the 1158989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * source constant. 1159989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1160989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * \note 1161989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * In the case of a matrix constant, the new constant is a scalar, \b not 1162989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * a vector. 1163989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick */ 1164989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick ir_constant(const ir_constant *c, unsigned i); 1165989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick 11664b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt virtual ir_instruction *clone(struct hash_table *) const; 11674b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 11685c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual ir_constant *as_constant() 11695c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt { 11705c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt return this; 11715c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt } 11725c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt 117378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 117478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 117578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 117678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 117778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 11788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 11798895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 118131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * Get a particular component of a constant as a specific type 118231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * 118331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * This is useful, for example, to get a value from an integer constant 118431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * as a float or bool. This appears frequently when constructors are 118531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * called with all constant parameters. 118631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick */ 118731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@{*/ 118831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick bool get_bool_component(unsigned i) const; 118931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick float get_float_component(unsigned i) const; 119031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick int get_int_component(unsigned i) const; 119131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick unsigned get_uint_component(unsigned i) const; 119231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@}*/ 119331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick 1194b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick ir_constant *get_record_field(const char *name); 1195b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick 119631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /** 11971e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick * Determine whether a constant has the same value as another constant 11981e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick */ 11991e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick bool has_value(const ir_constant *) const; 12001e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick 12011e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick /** 1202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 1203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 1205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 1206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 1207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1208be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick union ir_constant_data value; 12097f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick 12107f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick exec_list components; 1211710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick 1212710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanickprivate: 1213710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick /** 1214710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick * Parameterless constructor only used by the clone method 1215710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick */ 1216710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick ir_constant(void); 1217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 121970b74928a220aff024664714877defb0caedf33fEric Anholtvoid 122070b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor); 1221adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 122253cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholtvoid validate_ir_tree(exec_list *instructions); 122353cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholt 1224adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 1225adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 1226adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 1227e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 1228c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void 1229c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions, 1230c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt struct _mesa_glsl_parse_state *state); 1231c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt 1232e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 1233