ir.h revision 3b85f1cc6cb12e9d4931e12cf29adde578f389fd
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 44d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholtenum ir_node_type { 45d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_unset, 46d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_variable, 47d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_assignment, 48d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_call, 49d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_constant, 50d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_array, 51d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_record, 52d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_variable, 53d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_discard, 54d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_expression, 55d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_function, 56d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_function_signature, 57d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_if, 58d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_loop, 59d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_loop_jump, 60d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_return, 61d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_swizzle, 62d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_texture, 636dc89d221d43fad5f3edbb903997160af071bec0Brian Paul ir_type_max /**< maximum ir_type enum number, for validation */ 64d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt}; 65d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt 66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions 68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 690044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node { 70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 71d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt enum ir_node_type ir_type; 72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 74e46a454305af64710ce8deadafc718f75363ac7eEric Anholt /** ir_print_visitor helper for debugging. */ 754b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt void print(void) const; 76e46a454305af64710ce8deadafc718f75363ac7eEric Anholt 7778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *) = 0; 788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0; 798273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_instruction *clone(void *mem_ctx, 808273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *ht) const = 0; 8178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 8244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /** 8344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \name IR instruction downcast functions 8444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * 8544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * These functions either cast the object to a derived class or return 8644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \c NULL if the object's type does not match the specified derived class. 8744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * Additional downcast functions will be added as needed. 8844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke */ 8944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@{*/ 9044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_variable * as_variable() { return NULL; } 916202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual class ir_function * as_function() { return NULL; } 9244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_dereference * as_dereference() { return NULL; } 93b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual class ir_dereference_array * as_dereference_array() { return NULL; } 94d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt virtual class ir_dereference_variable *as_dereference_variable() { return NULL; } 956d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt virtual class ir_expression * as_expression() { return NULL; } 96fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual class ir_rvalue * as_rvalue() { return NULL; } 9701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual class ir_loop * as_loop() { return NULL; } 98cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_assignment * as_assignment() { return NULL; } 99cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_call * as_call() { return NULL; } 100cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_return * as_return() { return NULL; } 1015ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual class ir_if * as_if() { return NULL; } 1027d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual class ir_swizzle * as_swizzle() { return NULL; } 1035c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual class ir_constant * as_constant() { return NULL; } 10444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@}*/ 10544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 10744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke ir_instruction() 108d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 109d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_unset; 1100a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke type = NULL; 111d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 115fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction { 116fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic: 1178273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const = 0; 118ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick 119fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value() = 0; 120fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 121fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue * as_rvalue() 122fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 123fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return this; 124fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 125fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 126fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual bool is_lvalue() 127fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 128fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return false; 129fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 130fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 1312b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 1322b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 1332b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 1342b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick virtual ir_variable *variable_referenced() 1352b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick { 1362b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick return NULL; 1372b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick } 1382b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 139b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 140b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /** 141b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * If an r-value is a reference to a whole variable, get that variable 142b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * 143b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * \return 144b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * Pointer to a variable that is completely dereferenced by the r-value. If 145b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * the r-value is not a dereference or the dereference does not access the 146b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * entire variable (i.e., it's just one array element, struct field), \c NULL 147b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * is returned. 148b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 149b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 150b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 151b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return NULL; 152b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 153b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 154fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected: 1550a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke ir_rvalue(); 156fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke}; 157fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 158fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_auto = 0, 161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_uniform, 162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 1647e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_inout, 1657e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_temporary /**< Temporary variable generated during compilation. */ 166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 168a22426dc4c934673e8f0af5c70a67505a4de7aadCarl Worthenum ir_variable_interpolation { 169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 174fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 1777e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_variable(const struct glsl_type *, const char *, ir_variable_mode); 178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1798273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const; 1804b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 18144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_variable *as_variable() 18244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 18344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 18444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 18544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 18678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 18778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 18878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 18978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 19078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 1918895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1928895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1932d394d4877794d19756c3760d711524dca89f772Ian Romanick 194950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick /** 195950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * Get the string value for the interpolation qualifier 196950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * 197046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * \return The string that would be used in a shader to specify \c 198046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * mode will be returned. 199046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * 200046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * This function should only be used on a shader input or output variable. 201950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick */ 202950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick const char *interpolation_string() const; 203950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick 2048b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick /** 2058b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * Calculate the number of slots required to hold this variable 2068b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * 2078b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * This is used to determine how many uniform or varying locations a variable 2088b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * occupies. The count is in units of floating point components. 2098b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick */ 2108b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick unsigned component_slots() const; 2118b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick 212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 214b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick /** 215b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Highest element accessed with a constant expression array index 216b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * 217b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Not used for non-array variables. 218b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick */ 219b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick unsigned max_array_access; 220b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 2279d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick 2289d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick /** 2299d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * Flag that the whole array is assignable 2309d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * 2319d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * In GLSL 1.20 and later whole arrays are assignable (and comparable for 2329d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * equality). This flag enables this behavior. 2339d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick */ 2349d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick unsigned array_lvalue:1; 235326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt 2364a962170d7cf4243d6ae156fca20a6167388925dEric Anholt /* ARB_fragment_coord_conventions */ 2374a962170d7cf4243d6ae156fca20a6167388925dEric Anholt unsigned origin_upper_left:1; 2384a962170d7cf4243d6ae156fca20a6167388925dEric Anholt unsigned pixel_center_integer:1; 2394a962170d7cf4243d6ae156fca20a6167388925dEric Anholt 240326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt /** 24169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * Storage location of the base of this variable 24269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 24369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * The precise meaning of this field depends on the nature of the variable. 24469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 24569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Vertex shader input: one of the values from \c gl_vert_attrib. 24669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Vertex shader output: one of the values from \c gl_vert_result. 24769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Fragment shader input: one of the values from \c gl_frag_attrib. 24869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Fragment shader output: one of the values from \c gl_frag_result. 24969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Uniforms: Per-stage uniform slot number. 25069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Other: This field is not currently used. 25169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 25269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * If the variable is a uniform, shader input, or shader output, and the 25369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * slot has not been assigned, the value will be -1. 25469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick */ 25569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick int location; 25669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick 25769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick /** 258c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick * Emit a warning if this variable is accessed. 259c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick */ 260c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick const char *warn_extension; 261c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick 262c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick /** 263326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt * Value assigned in the initializer of a variable declared "const" 264326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt */ 265326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt ir_constant *constant_value; 266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 2709fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/** 2719fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or 2729fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype. 2739fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */ 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 275894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /* An ir_function_signature will be part of the list of signatures in 276894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt * an ir_function. 277894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt */ 278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 279e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick ir_function_signature(const glsl_type *return_type); 280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2818273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_function_signature *clone(void *mem_ctx, 2828273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *ht) const; 2834b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 28478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 28578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 28678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 28778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 28878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 2898895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2908895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 2920f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick * Get the name of the function for which this is a signature 2930f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick */ 2940f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick const char *function_name() const; 2950f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 2960f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick /** 297df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * Get a handle to the function for which this is a signature 298df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * 299df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * There is no setter function, this function returns a \c const pointer, 300df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * and \c ir_function_signature::_function is private for a reason. The 301df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * only way to make a connection between a function and function signature 302df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * is via \c ir_function::add_signature. This helps ensure that certain 303df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * invariants (i.e., a function signature is in the list of signatures for 304df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * its \c _function) are met. 305df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * 306df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * \sa ir_function::add_signature 307df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick */ 308df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick inline const class ir_function *function() const 309df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick { 310df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick return this->_function; 311df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick } 312df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick 313df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick /** 314abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * Check whether the qualifiers match between this signature's parameters 315abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * and the supplied parameter list. If not, returns the name of the first 316abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * parameter with mismatched qualifiers (for use in error messages). 317abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke */ 318abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke const char *qualifiers_match(exec_list *params); 319abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke 320abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke /** 321bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * Replace the current parameter list with the given one. This is useful 322bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * if the current information came from a prototype, and either has invalid 323bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * or missing parameter names. 324bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke */ 325bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke void replace_parameters(exec_list *new_params); 326bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke 327bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke /** 328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 335f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_variable of function parameters. 336f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * 337f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * This represents the storage. The paramaters passed in a particular 338f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * call will be in ir_call::actual_paramaters. 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 3400044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3429fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke /** Whether or not this function has a body (which may be empty). */ 3439fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke unsigned is_defined:1; 3446a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 345894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /** Body of instructions in the function. */ 346894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt struct exec_list body; 347894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt 3486a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate: 3496a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick /** Function of which this signature is one overload. */ 350df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick class ir_function *_function; 3516a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 3526a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick friend class ir_function; 353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 3579fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name. 3589fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the 3599fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions. 360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 363882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick ir_function(const char *name); 364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3658273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const; 3664b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 3676202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual ir_function *as_function() 3686202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke { 3696202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke return this; 3706202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke } 3716202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke 37278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 37378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 37478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 37578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 37678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 3778895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 3788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 3796a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick void add_signature(ir_function_signature *sig) 3806a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick { 381df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick sig->_function = this; 382df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick this->signatures.push_tail(sig); 3836a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick } 3846a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 38695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick * Get an iterator for the set of function signatures 38795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick */ 38895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick exec_list_iterator iterator() 38995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick { 39095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick return signatures.iterator(); 39195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick } 39295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick 39395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick /** 3940d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that matches a set of actual parameters, taking implicit 3950d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * conversions into account. 396471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 397b95897b89d36a25c237a021c299a4eb295856476Ian Romanick ir_function_signature *matching_signature(const exec_list *actual_param); 398471471f83471481db0445e73f8c89e6a9149838eIan Romanick 399471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 4000d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that exactly matches a set of actual parameters without 4010d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * any implicit type conversions. 4020d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke */ 403b95897b89d36a25c237a021c299a4eb295856476Ian Romanick ir_function_signature *exact_matching_signature(const exec_list *actual_ps); 4040d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke 4050d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke /** 406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 410b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke /** Whether or not this function is a built-in. */ 411b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke unsigned is_builtin:1; 412b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke 413471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 414f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_function_signature for each overloaded function with this name. 415471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 4160044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 4180f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 4190f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const 4200f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{ 421df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick return this->_function->name; 4220f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick} 423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4263c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/** 4273c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements 4283c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 4293c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction { 4303c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic: 4313c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_if(ir_rvalue *condition) 4323c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick : condition(condition) 4333c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 434d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_if; 4353c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 4363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 4378273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const; 4384b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 4395ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual ir_if *as_if() 4405ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt { 4415ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt return this; 4425ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt } 4435ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt 4443c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual void accept(ir_visitor *v) 4453c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 4463c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick v->visit(this); 4473c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 4483c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 4498895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 4508895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 4513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *condition; 452f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the then branch */ 4533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list then_instructions; 454f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the else branch */ 4553c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list else_instructions; 4563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}; 4573c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 4583c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 459fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/** 460fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure. 461fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 462fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction { 463fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic: 4643b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_loop(); 465fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 4668273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const; 4674b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 468fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick virtual void accept(ir_visitor *v) 469fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 470fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick v->visit(this); 471fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 472fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 4738895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 4748895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 47501f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual ir_loop *as_loop() 47601f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick { 47701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick return this; 47801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick } 47901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick 480fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 481fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * Get an iterator for the instructions of the loop body 482fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 483fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list_iterator iterator() 484fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 485fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick return body_instructions.iterator(); 486fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 487fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 488f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction that make up the body of the loop. */ 489fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list body_instructions; 490fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 491fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 492fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * \name Loop counter and controls 4933b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 4943b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * Represents a loop like a FORTRAN \c do-loop. 4953b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 4963b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * \note 4973b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * If \c from and \c to are the same value, the loop will execute once. 498fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 499fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@{*/ 5003b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_rvalue *from; /** Value of the loop counter on the first 5013b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * iteration of the loop. 5023b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 5033b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_rvalue *to; /** Value of the loop counter on the last 5043b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * iteration of the loop. 5053b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 506fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *increment; 507fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_variable *counter; 5083b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick 5093b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick /** 5103b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * Comparison operation in the loop terminator. 5113b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 5123b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * If any of the loop control fields are non-\c NULL, this field must be 5133b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal, 5143b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal. 5153b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 5163b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick int cmp; 517fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@}*/ 518fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick}; 519fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 520fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 5213c033637de7def553559c11d037f2e8bbb750f77Kenneth Graunkeclass ir_assignment : public ir_instruction { 522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 523fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition); 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5255a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 5265a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Construct an assignment with an explicit write mask 5275a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 5285a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * \note 5295a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Since a write mask is supplied, the LHS must already be a bare 5305a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * \c ir_dereference. The cannot be any swizzles in the LHS. 5315a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 5325a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition, 5335a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick unsigned write_mask); 5345a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 5358273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const; 5364b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 537fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 538fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 53978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 54078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 54178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 54278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 54378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 5448895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 5458895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 546cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_assignment * as_assignment() 547cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 548cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 549cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 550cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 5525a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Get a whole variable written by an assignment 5535a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 5545a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * If the LHS of the assignment writes a whole variable, the variable is 5555a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * returned. Otherwise \c NULL is returned. Examples of whole-variable 5565a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * assignment are: 5575a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 5585a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Assigning to a scalar 5595a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Assigning to all components of a vector 5605a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Whole array (or matrix) assignment 5615a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Whole structure assignment 5625a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 5635a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_variable *whole_variable_written(); 5645a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 5655a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 5665a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Set the LHS of an assignment 5675a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 5685a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick void set_lhs(ir_rvalue *lhs); 5695a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 5705a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 5725a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 5735a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * This should be treated as read only. If you need to set the LHS of an 5745a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * assignment, use \c ir_assignment::set_lhs. 575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 5765a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_dereference *lhs; 577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 581fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *rhs; 582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 586fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *condition; 5875a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 5885a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 5895a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 5905a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Component mask written 5915a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 5925a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * For non-vector types in the LHS, this field will be zero. For vector 5935a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * types, a bit will be set for each component that is written. Note that 5945a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * for \c vec2 and \c vec3 types only the lower bits will ever be set. 5955a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 5965a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick unsigned write_mask:4; 597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5993b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when 600160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list. 6013b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 607a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke ir_unop_sign, 608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 61044d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt ir_unop_sqrt, 611bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt ir_unop_exp, /**< Log base e on gentype */ 612bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt ir_unop_log, /**< Natural log on gentype */ 61301665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_exp2, 61401665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_log2, 615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 616a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 617dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_f2b, /**< Float-to-boolean conversion */ 618dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_b2f, /**< Boolean-to-float conversion */ 619c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_i2b, /**< int-to-boolean conversion */ 620c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_b2i, /**< Boolean-to-int conversion */ 6216c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick ir_unop_u2f, /**< Unsigned-to-float conversion. */ 6225e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt ir_unop_any, 623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 627a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 628a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 630a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 631d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt ir_unop_fract, 632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 63457e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /** 63557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke * \name Trigonometric operations. 63657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke */ 63757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@{*/ 63857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_sin, 63957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_cos, 64057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@}*/ 64157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke 642b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /** 643b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke * \name Partial derivatives. 644b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke */ 645b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@{*/ 646b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdx, 647b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdy, 648b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@}*/ 649b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke 650a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 651a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 652a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 653a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 6548a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt 6558a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt /** 6568a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * Takes one of two combinations of arguments: 6578a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * 6588a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * - mod(vecN, vecN) 6598a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * - mod(vecN, float) 6608a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * 6618a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * Does not take integer types. 6628a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt */ 663a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 664a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 665a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 666a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Binary comparison operators 667a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 668a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 669a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 670a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 671a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 672a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 673832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt /** 674832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * Returns single boolean for whether all components of operands[0] 675832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * equal the components of operands[1]. 676832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt */ 677a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 678832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt /** 679832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * Returns single boolean for whether any component of operands[0] 680832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * is not equal to the corresponding component of operands[1]. 681832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt */ 682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 683a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 685a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 687a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 689a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 691a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 695a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 696a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 697a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 698a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 699a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 700a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 7019be7f638130f46a9df2bfbcd4a03b36de9e4f3aaEric Anholt ir_binop_cross, 702a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 703a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 704a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 705a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_pow 706a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 707a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 708fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue { 709a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 711fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *, ir_rvalue *); 712a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 7136d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt virtual ir_expression *as_expression() 7146d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt { 7156d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt return this; 7166d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt } 7176d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt 7188273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const; 7194b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 720fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 721fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 7227dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke static unsigned int get_num_operands(ir_expression_operation); 7234b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt unsigned int get_num_operands() const 7247dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke { 7257dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke return get_num_operands(operation); 7267dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke } 727160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt 7283b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 7293b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Return a string representing this expression's operator. 7303b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 7313b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke const char *operator_string(); 7323b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 7333b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 7343b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Do a reverse-lookup to translate the given string into an operator. 7353b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 7363b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke static ir_expression_operation get_operator(const char *); 7373b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 73878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 73978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 74078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 74178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 74278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 7438895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 7448895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 745a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 746fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *operands[2]; 747a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 748a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 749a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 750ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 751ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 752ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 753fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue { 754ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 7551f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt ir_call(ir_function_signature *callee, exec_list *actual_parameters) 756b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(callee) 757ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 758d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_call; 7599e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick assert(callee->return_type != NULL); 7609e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick type = callee->return_type; 761471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 762ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 763ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 7648273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const; 7654b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 766fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 767fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 768cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_call *as_call() 769cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 770cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 771cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 772cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 773ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 774ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 775ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 776ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 777ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 7788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 7798895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 780ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 781ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 782e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth * 783e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth * Any allocation will be performed with 'ctx' as talloc owner. 784ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 785e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth static ir_call *get_error_instruction(void *ctx); 786ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 7879878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick /** 7889878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick * Get an iterator for the set of acutal parameters 7899878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick */ 7909878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick exec_list_iterator iterator() 7919878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick { 7929878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick return actual_parameters.iterator(); 7939878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick } 7949878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick 79593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /** 79693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick * Get the name of the function being called. 79793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick */ 79893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick const char *callee_name() const 79993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick { 8000f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return callee->function_name(); 80193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick } 80293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick 8031f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt ir_function_signature *get_callee() 804cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 805cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return callee; 806cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 807cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 808cad9766118d269725ef33b4e9588d674d5225010Eric Anholt /** 809792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick * Set the function call target 810792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick */ 8111f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt void set_callee(ir_function_signature *sig); 812792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick 813792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick /** 814cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * Generates an inline version of the function before @ir, 815cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * returning the return value of the function. 816cad9766118d269725ef33b4e9588d674d5225010Eric Anholt */ 817cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_rvalue *generate_inline(ir_instruction *ir); 818cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 819a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick /* List of ir_rvalue of paramaters passed in this call. */ 820a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick exec_list actual_parameters; 821a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick 822ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 823471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 824b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(NULL) 825471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 826d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_call; 827471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 828471471f83471481db0445e73f8c89e6a9149838eIan Romanick 8291f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt ir_function_signature *callee; 830ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 831ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 832ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 8339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 8349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 8359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 8369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 8379578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 8389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 8399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 8409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 8419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 8429578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 843d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_unset; 8449578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 8459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 8469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 8479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 8489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 8499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 8509578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 8519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 852d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_return; 8539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 8549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 855fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_return(ir_rvalue *value) 8569578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 8579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 858d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_return; 8599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 8609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 8618273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_return *clone(void *mem_ctx, struct hash_table *) const; 8624b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 863cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_return *as_return() 864cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 865cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 866cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 867cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 868fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *get_value() const 8699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 8709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 8719578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 8729578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 8739578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 8749578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 8759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 8769578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 8779578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 8788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 8798895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 880fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *value; 8819578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 882f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 883f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 884f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/** 885f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops 886f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 887f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue. The \c break within a loop is 888f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement. 889f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 890f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump 891f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */ 892f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump { 893f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic: 894f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode { 895f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_break, 896f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_continue 897f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick }; 898f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 8994b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt ir_loop_jump(jump_mode mode) 900f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 901d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_loop_jump; 9020c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt this->mode = mode; 9030c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt this->loop = loop; 904f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 905f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 9068273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const; 9074b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 908f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick virtual void accept(ir_visitor *v) 909f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 910f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick v->visit(this); 911f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 912f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 9138895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 9148895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 915f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_break() const 916f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 917f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_break; 918f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 919f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 920f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_continue() const 921f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 922f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_continue; 923f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 924f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 925f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Mode selector for the jump instruction. */ 926f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode mode; 9270c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholtprivate: 9280c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt /** Loop containing this break instruction. */ 9290c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt ir_loop *loop; 930f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick}; 93116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 93216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke/** 93316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke * IR instruction representing discard statements. 93416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke */ 93516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeclass ir_discard : public ir_jump { 93616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkepublic: 93716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_discard() 93816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 939d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_discard; 94016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke this->condition = NULL; 94116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 94216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 94316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_discard(ir_rvalue *cond) 94416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 94584ee01f40acf88185484df386b7715034e7685c9Aras Pranckevicius this->ir_type = ir_type_discard; 94616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke this->condition = cond; 94716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 94816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 9498273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const; 95016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 95116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual void accept(ir_visitor *v) 95216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 95316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke v->visit(this); 95416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 95516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 95616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 95716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 95816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_rvalue *condition; 95916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke}; 9609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 9619578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 9629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 96381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 96481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture 96581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 96681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode { 96781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_tex, /* Regular texture look-up */ 96881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txb, /* Texture look-up with LOD bias */ 96981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txl, /* Texture look-up with explicit LOD */ 97081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txd, /* Texture look-up with partial derivatvies */ 97181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_txf /* Texel fetch with explicit LOD */ 97281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 97381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 97481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 97581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 97681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture 97781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 97881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value 97981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes. In the printed IR, these will 98081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as: 98181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 98281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texel offset 98381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | Projection divisor 98481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | | Shadow comparitor 98581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | | | 98681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * v v v 98781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (tex (sampler) (coordinate) (0 0 0) (1) ( )) 98881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias)) 98981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod)) 99081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy)) 99181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txf (sampler) (coordinate) (0 0 0) (lod)) 99281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 99381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue { 99481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic: 99581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_texture(enum ir_texture_opcode op) 996b97efa5db5fce2e0d9a4c61a939c85b240c89170Kenneth Graunke : op(op), projector(NULL), shadow_comparitor(NULL) 99781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick { 998d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_texture; 99981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } 100081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 10018273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const; 10024b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1003fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1004fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 100526d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual void accept(ir_visitor *v) 100626d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke { 100726d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke v->visit(this); 100826d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke } 100926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 101026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 101126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 1012c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 1013c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Return a string representing the ir_texture_opcode. 1014c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 1015c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke const char *opcode_string(); 1016c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 101756d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke /** Set the sampler and infer the type. */ 101856d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke void set_sampler(ir_dereference *sampler); 101956d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke 1020c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 1021c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Do a reverse-lookup to translate a string into an ir_texture_opcode. 1022c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 1023c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke static ir_texture_opcode get_opcode(const char *); 1024c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 102581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick enum ir_texture_opcode op; 102681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 102781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Sampler to use for the texture access. */ 102881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_dereference *sampler; 102981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 103081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Texture coordinate to sample */ 103181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *coordinate; 103281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 103381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 103481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Value used for projective divide. 103581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 103681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no projective divide (the common case), this will be 103781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c NULL. Optimization passes should check for this to point to a constant 103881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * of 1.0 and replace that with \c NULL. 103981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 104081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *projector; 104181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 104281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 104381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Coordinate used for comparison on shadow look-ups. 104481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 104581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no shadow comparison, this will be \c NULL. For the 104681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c ir_txf opcode, this *must* be \c NULL. 104781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 104881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *shadow_comparitor; 104981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 105081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Explicit texel offsets. */ 105181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick signed char offsets[3]; 105281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 105381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick union { 105481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *lod; /**< Floating point LOD */ 105581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *bias; /**< Floating point LOD bias */ 105681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick struct { 105781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdx; /**< Partial derivative of coordinate wrt X */ 105881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdy; /**< Partial derivative of coordinate wrt Y */ 105981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } grad; 106081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } lod_info; 106181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 106281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 106381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 1064a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 1065a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 1066a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 1067a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 1068a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 1069a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1070a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 1071a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 1072a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1073f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke unsigned num_components:3; 1074a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1075a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 1076a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 1077a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1078a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 1079a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1080a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 1081a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1082a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1083affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1084affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue { 1085affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic: 1086affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 1087affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke unsigned count); 10886315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 10896315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count); 10906315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 109105a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask); 1092cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 10938273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const; 10944b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1095fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1096fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 10977d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual ir_swizzle *as_swizzle() 10987d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt { 10997d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt return this; 11007d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt } 11017d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt 1102affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke /** 1103affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke * Construct an ir_swizzle from the textual representation. Can fail. 1104affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke */ 1105affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 1106affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1107affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke virtual void accept(ir_visitor *v) 1108affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 1109affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke v->visit(this); 1110affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 1111affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 11128895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 11138895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1114affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke bool is_lvalue() 1115affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 1116a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt return val->is_lvalue() && !mask.has_duplicates; 1117affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 1118affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 11192b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 11202b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 11212b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 11222b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick virtual ir_variable *variable_referenced(); 11232b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 1124affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_rvalue *val; 1125affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle_mask mask; 11266315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 11276315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanickprivate: 11286315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick /** 11296315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * Initialize the mask component of a swizzle 11306315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * 11316315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * This is used by the \c ir_swizzle constructors. 11326315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick */ 11336315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick void init_mask(const unsigned *components, unsigned count); 1134affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}; 1135affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1136affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1137fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue { 1138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 11398273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0; 1140ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick 114144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_dereference *as_dereference() 114244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 114344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 114444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 114544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 1146c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt bool is_lvalue(); 1147fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 11482b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 11492b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 11502b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 115170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() = 0; 115270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 115370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 115470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 115570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference { 115670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 115770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_variable(ir_variable *var); 115870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 11598273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_variable *clone(void *mem_ctx, 11608273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 11614b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1162fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1163fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 1164d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt virtual ir_dereference_variable *as_dereference_variable() 1165d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt { 1166d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt return this; 1167d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt } 1168d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 116970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 117070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 117170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 117270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 117370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 117436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->var; 117570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 1176f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 1177b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 1178b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 1179b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /* ir_dereference_variable objects always dereference the entire 1180b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * variable. However, if this dereference is dereferenced by anything 1181b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * else, the complete deferefernce chain is not a whole-variable 1182b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * dereference. This method should only be called on the top most 1183b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * ir_rvalue in a dereference chain. 1184b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 1185b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return this->var; 1186b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 1187b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 1188c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1189c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1190c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1191c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1192c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1193f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 119436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 119536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick /** 119636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick * Object being dereferenced. 119736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick */ 119836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_variable *var; 119970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 120070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 120170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 120270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference { 120370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 120470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index); 120570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 120670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_variable *var, ir_rvalue *array_index); 120770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 12088273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_array *clone(void *mem_ctx, 12098273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 12104b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1211fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1212fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 1213b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual ir_dereference_array *as_dereference_array() 1214b145e903694fa932ab1e0d955e889555193ab604Eric Anholt { 1215b145e903694fa932ab1e0d955e889555193ab604Eric Anholt return this; 1216b145e903694fa932ab1e0d955e889555193ab604Eric Anholt } 1217b145e903694fa932ab1e0d955e889555193ab604Eric Anholt 121870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 121970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 122070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 122170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 122270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 122336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->array->variable_referenced(); 122470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 122570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 1226c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1227c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1228c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1229c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1230c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1231f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 123270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 123336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array; 123436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array_index; 123536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 123670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate: 123770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick void set_array(ir_rvalue *value); 123870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 123970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 124070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 124170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference { 124270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 124370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_rvalue *value, const char *field); 124470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 124570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_variable *var, const char *field); 124670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 12478273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_record *clone(void *mem_ctx, 12488273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 12494b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1250fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1251fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 125270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 125370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 125470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 125570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 125670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 125736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->record->variable_referenced(); 125870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 1259f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 1260c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1261c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1262c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1263c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1264c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1265f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 126636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 126736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *record; 126836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick const char *field; 1269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1272be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/** 1273be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick * Data stored in an ir_constant 1274be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick */ 1275be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanickunion ir_constant_data { 1276be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick unsigned u[16]; 1277be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick int i[16]; 1278be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick float f[16]; 1279be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick bool b[16]; 1280be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick}; 1281be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick 1282be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick 1283fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue { 1284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 1285824b659d917a5f14a1f66b891d25036ef9f9adc6Ian Romanick ir_constant(const struct glsl_type *type, const ir_constant_data *data); 12863c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(bool b); 12873c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(unsigned int u); 12883c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(int i); 12893c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(float f); 1290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1291989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick /** 1292756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick * Construct an ir_constant from a list of ir_constant values 1293756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick */ 1294756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick ir_constant(const struct glsl_type *type, exec_list *values); 1295756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick 1296756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick /** 1297989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * Construct an ir_constant from a scalar component of another ir_constant 1298989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1299989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * The new \c ir_constant inherits the type of the component from the 1300989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * source constant. 1301989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1302989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * \note 1303989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * In the case of a matrix constant, the new constant is a scalar, \b not 1304989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * a vector. 1305989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick */ 1306989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick ir_constant(const ir_constant *c, unsigned i); 1307989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick 1308ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke /** 1309ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke * Return a new ir_constant of the specified type containing all zeros. 1310ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke */ 1311ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke static ir_constant *zero(void *mem_ctx, const glsl_type *type); 1312ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke 13138273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const; 13144b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1315fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1316fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 13175c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual ir_constant *as_constant() 13185c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt { 13195c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt return this; 13205c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt } 13215c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt 132278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 132378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 132478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 132578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 132678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 13278895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 13288895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 133031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * Get a particular component of a constant as a specific type 133131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * 133231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * This is useful, for example, to get a value from an integer constant 133331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * as a float or bool. This appears frequently when constructors are 133431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * called with all constant parameters. 133531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick */ 133631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@{*/ 133731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick bool get_bool_component(unsigned i) const; 133831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick float get_float_component(unsigned i) const; 133931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick int get_int_component(unsigned i) const; 134031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick unsigned get_uint_component(unsigned i) const; 134131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@}*/ 134231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick 134374e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke ir_constant *get_array_element(unsigned i) const; 134474e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke 1345b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick ir_constant *get_record_field(const char *name); 1346b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick 134731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /** 13481e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick * Determine whether a constant has the same value as another constant 13491e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick */ 13501e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick bool has_value(const ir_constant *) const; 13511e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick 13521e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick /** 1353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 1354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 1356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 1357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 1358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1359be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick union ir_constant_data value; 13607f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick 136174e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke /* Array elements */ 136274e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke ir_constant **array_elements; 136374e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke 136474e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke /* Structure fields */ 13657f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick exec_list components; 1366710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick 1367710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanickprivate: 1368710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick /** 1369710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick * Parameterless constructor only used by the clone method 1370710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick */ 1371710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick ir_constant(void); 1372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 137470b74928a220aff024664714877defb0caedf33fEric Anholtvoid 137570b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor); 1376adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 137753cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholtvoid validate_ir_tree(exec_list *instructions); 137853cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholt 1379f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick/** 1380f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * Make a clone of each IR instruction in a list 1381f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * 1382f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param in List of IR instructions that are to be cloned 1383f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param out List to hold the cloned instructions 1384f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick */ 1385f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanickvoid 13868273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholtclone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in); 1387f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick 1388adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 1389adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 1390adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 1391e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 1392c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void 1393c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions, 1394c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt struct _mesa_glsl_parse_state *state); 1395c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt 139660e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickextern void 1397d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick_mesa_glsl_release_functions(void); 1398d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick 1399d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanickextern void 140060e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickreparent_ir(exec_list *list, void *mem_ctx); 140160e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanick 14021cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonsecastruct glsl_symbol_table; 14034ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick 14044ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickextern void 14054ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickimport_prototypes(const exec_list *source, exec_list *dest, 14061cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonseca struct glsl_symbol_table *symbols, void *mem_ctx); 14074ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick 14089f82806c7b5109553cf806a5652e6b6198665094Eric Anholtextern bool 14099f82806c7b5109553cf806a5652e6b6198665094Eric Anholtir_has_call(ir_instruction *ir); 14109f82806c7b5109553cf806a5652e6b6198665094Eric Anholt 1411925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtextern void 1412925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtdo_set_program_inouts(exec_list *instructions, struct gl_program *prog); 1413925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt 1414e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 1415