ir.h revision 13f57d42b6929f50d8ef8b4123f46a61c46fde7b
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 40e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 41e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \defgroup IR Intermediate representation nodes 42e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 43e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * @{ 44e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 45e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 46e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 47e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Class tags 48e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 49e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Each concrete class derived from \c ir_instruction has a value in this 50e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * enumerant. The value for the type is stored in \c ir_instruction::ir_type 51e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * by the constructor. While using type tags is not very C++, it is extremely 52e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * convenient. For example, during debugging you can simply inspect 53e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to find out the actual type of the object. 54e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 55e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * In addition, it is possible to use a switch-statement based on \c 56e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to select different behavior for different object 57e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types. For functions that have only slight differences for several object 58e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types, this allows writing very straightforward, readable code. 59e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 60d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholtenum ir_node_type { 61e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 62e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Zero is unused so that the IR validator can detect cases where 63e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type has not been initialized. 64e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 65d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_unset, 66d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_variable, 67d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_assignment, 68d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_call, 69d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_constant, 70d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_array, 71d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_record, 72d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_variable, 73d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_discard, 74d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_expression, 75d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_function, 76d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_function_signature, 77d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_if, 78d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_loop, 79d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_loop_jump, 80d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_return, 81d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_swizzle, 82d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_texture, 836dc89d221d43fad5f3edbb903997160af071bec0Brian Paul ir_type_max /**< maximum ir_type enum number, for validation */ 84d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt}; 85d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions 88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 890044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node { 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 91d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt enum ir_node_type ir_type; 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 94e46a454305af64710ce8deadafc718f75363ac7eEric Anholt /** ir_print_visitor helper for debugging. */ 954b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt void print(void) const; 96e46a454305af64710ce8deadafc718f75363ac7eEric Anholt 9778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *) = 0; 988895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0; 998273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_instruction *clone(void *mem_ctx, 1008273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *ht) const = 0; 10178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 10244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /** 10344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \name IR instruction downcast functions 10444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * 10544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * These functions either cast the object to a derived class or return 10644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \c NULL if the object's type does not match the specified derived class. 10744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * Additional downcast functions will be added as needed. 10844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke */ 10944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@{*/ 11044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_variable * as_variable() { return NULL; } 1116202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual class ir_function * as_function() { return NULL; } 11244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_dereference * as_dereference() { return NULL; } 113b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual class ir_dereference_array * as_dereference_array() { return NULL; } 114d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt virtual class ir_dereference_variable *as_dereference_variable() { return NULL; } 1156d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt virtual class ir_expression * as_expression() { return NULL; } 116fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual class ir_rvalue * as_rvalue() { return NULL; } 11701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual class ir_loop * as_loop() { return NULL; } 118cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_assignment * as_assignment() { return NULL; } 119cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_call * as_call() { return NULL; } 120cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_return * as_return() { return NULL; } 1215ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual class ir_if * as_if() { return NULL; } 1227d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual class ir_swizzle * as_swizzle() { return NULL; } 1235c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual class ir_constant * as_constant() { return NULL; } 12444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@}*/ 12544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 12744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke ir_instruction() 128d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 129d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_unset; 1300a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke type = NULL; 131d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 135fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction { 136fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic: 1378273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const = 0; 138ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick 139fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value() = 0; 140fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 141fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue * as_rvalue() 142fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 143fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return this; 144fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 145fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 146fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual bool is_lvalue() 147fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 148fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return false; 149fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 150fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 1512b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 1522b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 1532b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 1542b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick virtual ir_variable *variable_referenced() 1552b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick { 1562b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick return NULL; 1572b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick } 1582b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 159b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 160b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /** 161b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * If an r-value is a reference to a whole variable, get that variable 162b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * 163b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * \return 164b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * Pointer to a variable that is completely dereferenced by the r-value. If 165b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * the r-value is not a dereference or the dereference does not access the 166b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * entire variable (i.e., it's just one array element, struct field), \c NULL 167b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * is returned. 168b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 169b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 170b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 171b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return NULL; 172b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 173b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 174ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick /** 175ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * Determine if an r-value has the value zero 176ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 177ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * The base implementation of this function always returns \c false. The 178ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * \c ir_constant class over-rides this function to return \c true \b only 179ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * for vector and scalar types that have all elements set to the value 180ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * zero (or \c false for booleans). 181ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 1828e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \sa ir_constant::has_value, ir_rvalue::is_one, ir_rvalue::is_negative_one 183ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick */ 184ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_zero() const; 185ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick 186ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick /** 187ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * Determine if an r-value has the value one 188ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 189ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * The base implementation of this function always returns \c false. The 190ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * \c ir_constant class over-rides this function to return \c true \b only 191ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * for vector and scalar types that have all elements set to the value 192ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * one (or \c true for booleans). 193ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 1948e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_negative_one 195ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick */ 196ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_one() const; 197ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick 1988e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick /** 1998e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * Determine if an r-value has the value negative one 2008e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * 2018e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * The base implementation of this function always returns \c false. The 2028e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \c ir_constant class over-rides this function to return \c true \b only 2038e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * for vector and scalar types that have all elements set to the value 2048e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * negative one. For boolean times, the result is always \c false. 2058e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * 2068e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one 2078e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick */ 2088e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick virtual bool is_negative_one() const; 2098e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick 210fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected: 2110a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke ir_rvalue(); 212fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke}; 213fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 214fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 215e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 216e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Variable storage classes 217e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 219e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_var_auto = 0, /**< Function local variables and globals. */ 220e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_var_uniform, /**< Variable declared as a uniform. */ 221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 2237e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_inout, 2247e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_temporary /**< Temporary variable generated during compilation. */ 225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 227a22426dc4c934673e8f0af5c70a67505a4de7aadCarl Worthenum ir_variable_interpolation { 228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 233fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 2367e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_variable(const struct glsl_type *, const char *, ir_variable_mode); 237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2388273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const; 2394b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 24044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_variable *as_variable() 24144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 24244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 24344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 24444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 24578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 24678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 24778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 24878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 24978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 2508895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2518895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 2522d394d4877794d19756c3760d711524dca89f772Ian Romanick 253950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick /** 254950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * Get the string value for the interpolation qualifier 255950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * 256046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * \return The string that would be used in a shader to specify \c 257046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * mode will be returned. 258046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * 259046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * This function should only be used on a shader input or output variable. 260950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick */ 261950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick const char *interpolation_string() const; 262950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick 2638b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick /** 2648b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * Calculate the number of slots required to hold this variable 2658b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * 2668b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * This is used to determine how many uniform or varying locations a variable 2678b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * occupies. The count is in units of floating point components. 2688b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick */ 2698b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick unsigned component_slots() const; 2708b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick 271e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 272e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Delcared name of the variable 273e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 276b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick /** 277b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Highest element accessed with a constant expression array index 278b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * 279b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Not used for non-array variables. 280b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick */ 281b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick unsigned max_array_access; 282b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 283e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 284e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Is the variable read-only? 285e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 286e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * This is set for variables declared as \c const, shader inputs, 287e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * and uniforms. 288e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 293e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 294e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Storage class of the variable. 295e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 296e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \sa ir_variable_mode 297e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 299e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 300e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 301e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Interpolation mode for shader inputs / outputs 302e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 303e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \sa ir_variable_interpolation 304e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 3069d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick 3079d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick /** 3089d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * Flag that the whole array is assignable 3099d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * 3109d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * In GLSL 1.20 and later whole arrays are assignable (and comparable for 3119d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * equality). This flag enables this behavior. 3129d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick */ 3139d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick unsigned array_lvalue:1; 314326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt 315e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 316e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \name ARB_fragment_coord_conventions 317e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * @{ 318e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 3194a962170d7cf4243d6ae156fca20a6167388925dEric Anholt unsigned origin_upper_left:1; 3204a962170d7cf4243d6ae156fca20a6167388925dEric Anholt unsigned pixel_center_integer:1; 321e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /*@}*/ 3224a962170d7cf4243d6ae156fca20a6167388925dEric Anholt 323326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt /** 324eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * Was the location explicitly set in the shader? 325eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * 326eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * If the location is explicitly set in the shader, it \b cannot be changed 327eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * by the linker or by the API (e.g., calls to \c glBindAttribLocation have 328eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * no effect). 329eee68d3631813580a14fa51fda6f0c959279256cIan Romanick */ 330eee68d3631813580a14fa51fda6f0c959279256cIan Romanick unsigned explicit_location:1; 331eee68d3631813580a14fa51fda6f0c959279256cIan Romanick 332eee68d3631813580a14fa51fda6f0c959279256cIan Romanick /** 33369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * Storage location of the base of this variable 33469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 33569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * The precise meaning of this field depends on the nature of the variable. 33669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 33769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Vertex shader input: one of the values from \c gl_vert_attrib. 33869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Vertex shader output: one of the values from \c gl_vert_result. 33969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Fragment shader input: one of the values from \c gl_frag_attrib. 34069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Fragment shader output: one of the values from \c gl_frag_result. 34169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Uniforms: Per-stage uniform slot number. 34269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Other: This field is not currently used. 34369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 34469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * If the variable is a uniform, shader input, or shader output, and the 34569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * slot has not been assigned, the value will be -1. 34669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick */ 34769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick int location; 34869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick 34969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick /** 350c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick * Emit a warning if this variable is accessed. 351c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick */ 352c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick const char *warn_extension; 353c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick 354c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick /** 355326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt * Value assigned in the initializer of a variable declared "const" 356326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt */ 357326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt ir_constant *constant_value; 358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 3629fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/** 3639fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or 3649fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype. 3659fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */ 366a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 367894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /* An ir_function_signature will be part of the list of signatures in 368894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt * an ir_function. 369894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt */ 370a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 371e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick ir_function_signature(const glsl_type *return_type); 372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3738273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_function_signature *clone(void *mem_ctx, 3748273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *ht) const; 3754b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 37678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 37778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 37878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 37978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 38078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 3818895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 3828895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 3840f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick * Get the name of the function for which this is a signature 3850f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick */ 3860f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick const char *function_name() const; 3870f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 3880f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick /** 389df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * Get a handle to the function for which this is a signature 390df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * 391df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * There is no setter function, this function returns a \c const pointer, 392df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * and \c ir_function_signature::_function is private for a reason. The 393df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * only way to make a connection between a function and function signature 394df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * is via \c ir_function::add_signature. This helps ensure that certain 395df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * invariants (i.e., a function signature is in the list of signatures for 396df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * its \c _function) are met. 397df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * 398df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * \sa ir_function::add_signature 399df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick */ 400df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick inline const class ir_function *function() const 401df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick { 402df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick return this->_function; 403df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick } 404df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick 405df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick /** 406abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * Check whether the qualifiers match between this signature's parameters 407abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * and the supplied parameter list. If not, returns the name of the first 408abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * parameter with mismatched qualifiers (for use in error messages). 409abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke */ 410abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke const char *qualifiers_match(exec_list *params); 411abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke 412abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke /** 413bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * Replace the current parameter list with the given one. This is useful 414bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * if the current information came from a prototype, and either has invalid 415bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * or missing parameter names. 416bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke */ 417bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke void replace_parameters(exec_list *new_params); 418bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke 419bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke /** 420a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 427f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_variable of function parameters. 428f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * 429f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * This represents the storage. The paramaters passed in a particular 430f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * call will be in ir_call::actual_paramaters. 431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 4320044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4349fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke /** Whether or not this function has a body (which may be empty). */ 4359fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke unsigned is_defined:1; 4366a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 437f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke /** Whether or not this function signature is a built-in. */ 438f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke unsigned is_builtin:1; 439f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke 440894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /** Body of instructions in the function. */ 441894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt struct exec_list body; 442894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt 4436a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate: 4446a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick /** Function of which this signature is one overload. */ 445df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick class ir_function *_function; 4466a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 4476a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick friend class ir_function; 448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 4529fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name. 4539fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the 4549fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions. 455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 458882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick ir_function(const char *name); 459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4608273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const; 4614b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 4626202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual ir_function *as_function() 4636202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke { 4646202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke return this; 4656202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke } 4666202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke 46778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 46878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 46978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 47078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 47178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 4728895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 4738895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 4746a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick void add_signature(ir_function_signature *sig) 4756a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick { 476df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick sig->_function = this; 477df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick this->signatures.push_tail(sig); 4786a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick } 4796a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 48195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick * Get an iterator for the set of function signatures 48295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick */ 48395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick exec_list_iterator iterator() 48495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick { 48595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick return signatures.iterator(); 48695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick } 48795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick 48895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick /** 4890d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that matches a set of actual parameters, taking implicit 4900d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * conversions into account. 491471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 492b95897b89d36a25c237a021c299a4eb295856476Ian Romanick ir_function_signature *matching_signature(const exec_list *actual_param); 493471471f83471481db0445e73f8c89e6a9149838eIan Romanick 494471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 4950d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that exactly matches a set of actual parameters without 4960d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * any implicit type conversions. 4970d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke */ 498b95897b89d36a25c237a021c299a4eb295856476Ian Romanick ir_function_signature *exact_matching_signature(const exec_list *actual_ps); 4990d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke 5000d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke /** 501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 50581f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke /** Whether or not this function has a signature that isn't a built-in. */ 50681f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke bool has_user_signature(); 507b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke 508471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 509f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_function_signature for each overloaded function with this name. 510471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 5110044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 5130f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 5140f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const 5150f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{ 516df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick return this->_function->name; 5170f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick} 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5213c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/** 5223c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements 5233c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 5243c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction { 5253c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic: 5263c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_if(ir_rvalue *condition) 5273c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick : condition(condition) 5283c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 529d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_if; 5303c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 5313c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 5328273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const; 5334b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 5345ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual ir_if *as_if() 5355ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt { 5365ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt return this; 5375ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt } 5385ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt 5393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual void accept(ir_visitor *v) 5403c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 5413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick v->visit(this); 5423c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 5433c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 5448895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 5458895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 5463c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *condition; 547f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the then branch */ 5483c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list then_instructions; 549f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the else branch */ 5503c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list else_instructions; 5513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}; 5523c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 5533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 554fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/** 555fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure. 556fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 557fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction { 558fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic: 5593b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_loop(); 560fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 5618273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const; 5624b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 563fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick virtual void accept(ir_visitor *v) 564fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 565fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick v->visit(this); 566fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 567fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 5688895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 5698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 57001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual ir_loop *as_loop() 57101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick { 57201f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick return this; 57301f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick } 57401f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick 575fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 576fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * Get an iterator for the instructions of the loop body 577fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 578fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list_iterator iterator() 579fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 580fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick return body_instructions.iterator(); 581fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 582fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 583f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction that make up the body of the loop. */ 584fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list body_instructions; 585fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 586fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 587fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * \name Loop counter and controls 5883b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 5893b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * Represents a loop like a FORTRAN \c do-loop. 5903b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 5913b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * \note 5923b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * If \c from and \c to are the same value, the loop will execute once. 593fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 594fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@{*/ 5953b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_rvalue *from; /** Value of the loop counter on the first 5963b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * iteration of the loop. 5973b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 5983b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_rvalue *to; /** Value of the loop counter on the last 5993b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * iteration of the loop. 6003b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 601fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *increment; 602fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_variable *counter; 6033b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick 6043b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick /** 6053b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * Comparison operation in the loop terminator. 6063b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 6073b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * If any of the loop control fields are non-\c NULL, this field must be 6083b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal, 6093b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal. 6103b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 6113b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick int cmp; 612fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@}*/ 613fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick}; 614fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 615fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 6163c033637de7def553559c11d037f2e8bbb750f77Kenneth Graunkeclass ir_assignment : public ir_instruction { 617a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 618fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition); 619a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 6205a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 6215a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Construct an assignment with an explicit write mask 6225a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 6235a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * \note 6245a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Since a write mask is supplied, the LHS must already be a bare 6255a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * \c ir_dereference. The cannot be any swizzles in the LHS. 6265a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 6275a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition, 6285a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick unsigned write_mask); 6295a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 6308273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const; 6314b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 632fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 633fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 63478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 63578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 63678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 63778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 63878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 6398895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 6408895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 641cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_assignment * as_assignment() 642cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 643cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 644cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 645cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 646a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 6475a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Get a whole variable written by an assignment 6485a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 6495a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * If the LHS of the assignment writes a whole variable, the variable is 6505a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * returned. Otherwise \c NULL is returned. Examples of whole-variable 6515a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * assignment are: 6525a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 6535a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Assigning to a scalar 6545a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Assigning to all components of a vector 6555a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Whole array (or matrix) assignment 6565a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Whole structure assignment 6575a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 6585a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_variable *whole_variable_written(); 6595a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 6605a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 6615a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Set the LHS of an assignment 6625a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 6635a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick void set_lhs(ir_rvalue *lhs); 6645a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 6655a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 666a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 6675a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 6685a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * This should be treated as read only. If you need to set the LHS of an 6695a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * assignment, use \c ir_assignment::set_lhs. 670a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 6715a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_dereference *lhs; 672a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 673a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 674a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 675a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 676fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *rhs; 677a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 678a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 679a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 680a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 681fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *condition; 6825a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 6835a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 6845a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 6855a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Component mask written 6865a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 6875a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * For non-vector types in the LHS, this field will be zero. For vector 6885a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * types, a bit will be set for each component that is written. Note that 6895a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * for \c vec2 and \c vec3 types only the lower bits will ever be set. 690b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * 691b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * A partially-set write mask means that each enabled channel gets 692b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * the value from a consecutive channel of the rhs. For example, 693b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * to write just .xyw of gl_FrontColor with color: 694b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * 695b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * (assign (constant bool (1)) (xyw) 696b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * (var_ref gl_FragColor) 697b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * (swiz xyw (var_ref color))) 6985a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 6995a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick unsigned write_mask:4; 700a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 701a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 7023b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when 703160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list. 7043b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 705a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 706a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 707a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 708a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 709a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 710a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke ir_unop_sign, 711a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 712a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 71344d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt ir_unop_sqrt, 714bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt ir_unop_exp, /**< Log base e on gentype */ 715bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt ir_unop_log, /**< Natural log on gentype */ 71601665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_exp2, 71701665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_log2, 718a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 719a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 720dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_f2b, /**< Float-to-boolean conversion */ 721dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_b2f, /**< Boolean-to-float conversion */ 722c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_i2b, /**< int-to-boolean conversion */ 723c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_b2i, /**< Boolean-to-int conversion */ 7246c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick ir_unop_u2f, /**< Unsigned-to-float conversion. */ 7255e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt ir_unop_any, 726a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 727a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 728a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 729a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 730a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 731a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 732a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 733a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 734d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt ir_unop_fract, 735d85d25dd1f4fd281bd210ba6ba5135ba1e3b535fKenneth Graunke ir_unop_round_even, 736a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 737a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 73857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /** 73957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke * \name Trigonometric operations. 74057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke */ 74157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@{*/ 74257e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_sin, 74357e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_cos, 744f2616e56de8a48360cae8f269727b58490555f4dIan Romanick ir_unop_sin_reduced, /**< Reduced range sin. [-pi, pi] */ 745f2616e56de8a48360cae8f269727b58490555f4dIan Romanick ir_unop_cos_reduced, /**< Reduced range cos. [-pi, pi] */ 74657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@}*/ 74757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke 748b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /** 749b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke * \name Partial derivatives. 750b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke */ 751b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@{*/ 752b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdx, 753b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdy, 754b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@}*/ 755b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke 7563a5ce85cfa4914711e56c8cf831699242618928eIan Romanick ir_unop_noise, 7573a5ce85cfa4914711e56c8cf831699242618928eIan Romanick 758007f4881503b69055d65cfb20bd237673779786bKenneth Graunke /** 759007f4881503b69055d65cfb20bd237673779786bKenneth Graunke * A sentinel marking the last of the unary operations. 760007f4881503b69055d65cfb20bd237673779786bKenneth Graunke */ 761007f4881503b69055d65cfb20bd237673779786bKenneth Graunke ir_last_unop = ir_unop_noise, 762007f4881503b69055d65cfb20bd237673779786bKenneth Graunke 763a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 764a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 765a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 766a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 7678a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt 7688a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt /** 7698a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * Takes one of two combinations of arguments: 7708a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * 7718a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * - mod(vecN, vecN) 7728a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * - mod(vecN, float) 7738a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * 7748a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * Does not take integer types. 7758a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt */ 776a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 777a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 778a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 77914eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke * \name Binary comparison operators which return a boolean vector. 78014eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke * The type of both operands must be equal. 781a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 782a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 783a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 784a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 785a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 786a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 7874dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_equal, 7884dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_nequal, 789832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt /** 790832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * Returns single boolean for whether all components of operands[0] 791832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * equal the components of operands[1]. 792832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt */ 7934dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_all_equal, 794832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt /** 795832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * Returns single boolean for whether any component of operands[0] 796832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * is not equal to the corresponding component of operands[1]. 797832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt */ 7984dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_any_nequal, 799a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 800a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 801a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 802a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 803a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 804a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 805a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 806a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 807a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 808a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 809a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 810a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 811a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 812a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 813a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 814a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 815a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 816a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 817a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 818a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 819a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 820007f4881503b69055d65cfb20bd237673779786bKenneth Graunke ir_binop_pow, 821007f4881503b69055d65cfb20bd237673779786bKenneth Graunke 822007f4881503b69055d65cfb20bd237673779786bKenneth Graunke /** 823007f4881503b69055d65cfb20bd237673779786bKenneth Graunke * A sentinel marking the last of the binary operations. 824007f4881503b69055d65cfb20bd237673779786bKenneth Graunke */ 825007f4881503b69055d65cfb20bd237673779786bKenneth Graunke ir_last_binop = ir_binop_pow, 826007f4881503b69055d65cfb20bd237673779786bKenneth Graunke 827007f4881503b69055d65cfb20bd237673779786bKenneth Graunke /** 828007f4881503b69055d65cfb20bd237673779786bKenneth Graunke * A sentinel marking the last of all operations. 829007f4881503b69055d65cfb20bd237673779786bKenneth Graunke */ 830007f4881503b69055d65cfb20bd237673779786bKenneth Graunke ir_last_opcode = ir_last_binop 831a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 832a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 833fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue { 834a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 83513f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick /** 83613f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick * Constructor for unary operation expressions 83713f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick */ 83813f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick ir_expression(int op, const struct glsl_type *type, ir_rvalue *); 83913f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick 84013f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick /** 84113f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick * Constructor for binary operation expressions 84213f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick */ 843a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 844fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *, ir_rvalue *); 845a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 8466d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt virtual ir_expression *as_expression() 8476d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt { 8486d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt return this; 8496d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt } 8506d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt 8518273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const; 8524b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 853e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 854e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Attempt to constant-fold the expression 855e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 856e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * If the expression cannot be constant folded, this method will return 857e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c NULL. 858e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 859fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 860fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 861e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 862e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Determine the number of operands used by an expression 863e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 8647dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke static unsigned int get_num_operands(ir_expression_operation); 865e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 866e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 867e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Determine the number of operands used by an expression 868e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 8694b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt unsigned int get_num_operands() const 8707dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke { 8717dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke return get_num_operands(operation); 8727dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke } 873160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt 8743b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 8753b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Return a string representing this expression's operator. 8763b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 8773b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke const char *operator_string(); 8783b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 8793b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 880351525d534268b08c090f9ce42a67e9329a969aeIan Romanick * Return a string representing this expression's operator. 881351525d534268b08c090f9ce42a67e9329a969aeIan Romanick */ 882351525d534268b08c090f9ce42a67e9329a969aeIan Romanick static const char *operator_string(ir_expression_operation); 883351525d534268b08c090f9ce42a67e9329a969aeIan Romanick 884351525d534268b08c090f9ce42a67e9329a969aeIan Romanick 885351525d534268b08c090f9ce42a67e9329a969aeIan Romanick /** 8863b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Do a reverse-lookup to translate the given string into an operator. 8873b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 8883b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke static ir_expression_operation get_operator(const char *); 8893b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 89078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 89178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 89278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 89378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 89478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 8958895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 8968895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 897a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 898fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *operands[2]; 899a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 900a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 901a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 902ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 903ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 904ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 905fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue { 906ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 9071f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt ir_call(ir_function_signature *callee, exec_list *actual_parameters) 908b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(callee) 909ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 910d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_call; 9119e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick assert(callee->return_type != NULL); 9129e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick type = callee->return_type; 913471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 914ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 915ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 9168273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const; 9174b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 918fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 919fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 920cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_call *as_call() 921cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 922cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 923cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 924cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 925ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 926ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 927ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 928ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 929ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 9308895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 9318895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 932ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 933ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 934e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth * 935e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth * Any allocation will be performed with 'ctx' as talloc owner. 936ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 937e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth static ir_call *get_error_instruction(void *ctx); 938ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 9399878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick /** 9409878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick * Get an iterator for the set of acutal parameters 9419878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick */ 9429878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick exec_list_iterator iterator() 9439878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick { 9449878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick return actual_parameters.iterator(); 9459878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick } 9469878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick 94793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /** 94893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick * Get the name of the function being called. 94993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick */ 95093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick const char *callee_name() const 95193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick { 9520f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return callee->function_name(); 95393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick } 95493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick 955e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 956e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Get the function signature bound to this function call 957e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 9581f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt ir_function_signature *get_callee() 959cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 960cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return callee; 961cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 962cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 963cad9766118d269725ef33b4e9588d674d5225010Eric Anholt /** 964792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick * Set the function call target 965792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick */ 9661f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt void set_callee(ir_function_signature *sig); 967792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick 968792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick /** 969cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * Generates an inline version of the function before @ir, 970cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * returning the return value of the function. 971cad9766118d269725ef33b4e9588d674d5225010Eric Anholt */ 972cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_rvalue *generate_inline(ir_instruction *ir); 973cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 974a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick /* List of ir_rvalue of paramaters passed in this call. */ 975a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick exec_list actual_parameters; 976a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick 977ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 978471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 979b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(NULL) 980471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 981d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_call; 982471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 983471471f83471481db0445e73f8c89e6a9149838eIan Romanick 9841f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt ir_function_signature *callee; 985ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 986ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 987ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 9889578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 9899578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 9909578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 9919578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 9929578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 9939578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 9949578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 9959578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 9969578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 9979578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 998d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_unset; 9999578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 10009578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 10019578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 10029578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 10039578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 10049578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 10059578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 10069578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 1007d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_return; 10089578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 10099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 1010fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_return(ir_rvalue *value) 10119578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 10129578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 1013d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_return; 10149578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 10159578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 10168273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_return *clone(void *mem_ctx, struct hash_table *) const; 10174b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1018cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_return *as_return() 1019cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 1020cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 1021cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 1022cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 1023fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *get_value() const 10249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 10259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 10269578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 10279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 10289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 10299578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 10309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 10319578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 10329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 10338895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 10348895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1035fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *value; 10369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 1037f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1038f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1039f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/** 1040f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops 1041f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 1042f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue. The \c break within a loop is 1043f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement. 1044f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 1045f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump 1046f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */ 1047f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump { 1048f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic: 1049f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode { 1050f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_break, 1051f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_continue 1052f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick }; 1053f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 10544b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt ir_loop_jump(jump_mode mode) 1055f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1056d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_loop_jump; 10570c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt this->mode = mode; 10580c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt this->loop = loop; 1059f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1060f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 10618273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const; 10624b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1063f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick virtual void accept(ir_visitor *v) 1064f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1065f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick v->visit(this); 1066f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1067f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 10688895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 10698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1070f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_break() const 1071f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1072f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_break; 1073f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1074f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1075f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_continue() const 1076f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1077f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_continue; 1078f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1079f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1080f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Mode selector for the jump instruction. */ 1081f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode mode; 10820c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholtprivate: 10830c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt /** Loop containing this break instruction. */ 10840c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt ir_loop *loop; 1085f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick}; 108616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 108716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke/** 108816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke * IR instruction representing discard statements. 108916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke */ 109016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeclass ir_discard : public ir_jump { 109116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkepublic: 109216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_discard() 109316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 1094d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_discard; 109516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke this->condition = NULL; 109616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 109716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 109816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_discard(ir_rvalue *cond) 109916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 110084ee01f40acf88185484df386b7715034e7685c9Aras Pranckevicius this->ir_type = ir_type_discard; 110116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke this->condition = cond; 110216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 110316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 11048273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const; 110516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 110616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual void accept(ir_visitor *v) 110716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 110816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke v->visit(this); 110916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 111016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 111116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 111216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 111316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_rvalue *condition; 111416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke}; 11159578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 11169578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 11179578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 111881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 111981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture 112081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 112181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode { 1122e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_tex, /**< Regular texture look-up */ 1123e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_txb, /**< Texture look-up with LOD bias */ 1124e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_txl, /**< Texture look-up with explicit LOD */ 1125e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_txd, /**< Texture look-up with partial derivatvies */ 1126e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_txf /**< Texel fetch with explicit LOD */ 112781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 112881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 112981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 113081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 113181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture 113281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 113381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value 113481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes. In the printed IR, these will 113581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as: 113681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 113781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texel offset 113881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | Projection divisor 113981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | | Shadow comparitor 114081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * | | | 114181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * v v v 114281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (tex (sampler) (coordinate) (0 0 0) (1) ( )) 114381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias)) 114481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod)) 114581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy)) 114681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txf (sampler) (coordinate) (0 0 0) (lod)) 114781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 114881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue { 114981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic: 115081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_texture(enum ir_texture_opcode op) 1151b97efa5db5fce2e0d9a4c61a939c85b240c89170Kenneth Graunke : op(op), projector(NULL), shadow_comparitor(NULL) 115281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick { 1153d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_texture; 115481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } 115581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 11568273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const; 11574b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1158fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1159fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 116026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual void accept(ir_visitor *v) 116126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke { 116226d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke v->visit(this); 116326d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke } 116426d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 116526d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 116626d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 1167c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 1168c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Return a string representing the ir_texture_opcode. 1169c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 1170c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke const char *opcode_string(); 1171c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 117256d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke /** Set the sampler and infer the type. */ 117356d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke void set_sampler(ir_dereference *sampler); 117456d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke 1175c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 1176c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Do a reverse-lookup to translate a string into an ir_texture_opcode. 1177c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 1178c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke static ir_texture_opcode get_opcode(const char *); 1179c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 118081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick enum ir_texture_opcode op; 118181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 118281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Sampler to use for the texture access. */ 118381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_dereference *sampler; 118481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 118581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Texture coordinate to sample */ 118681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *coordinate; 118781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 118881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 118981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Value used for projective divide. 119081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 119181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no projective divide (the common case), this will be 119281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c NULL. Optimization passes should check for this to point to a constant 119381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * of 1.0 and replace that with \c NULL. 119481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 119581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *projector; 119681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 119781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 119881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Coordinate used for comparison on shadow look-ups. 119981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 120081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no shadow comparison, this will be \c NULL. For the 120181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c ir_txf opcode, this *must* be \c NULL. 120281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 120381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *shadow_comparitor; 120481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 120581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Explicit texel offsets. */ 120681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick signed char offsets[3]; 120781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 120881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick union { 120981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *lod; /**< Floating point LOD */ 121081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *bias; /**< Floating point LOD bias */ 121181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick struct { 121281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdx; /**< Partial derivative of coordinate wrt X */ 121381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdy; /**< Partial derivative of coordinate wrt Y */ 121481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } grad; 121581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } lod_info; 121681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 121781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 121881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 1219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 1220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 1221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 1222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 1223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 1224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 1226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 1227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1228f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke unsigned num_components:3; 1229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 1231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 1232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 1234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 1236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1238affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1239affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue { 1240affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic: 1241affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 1242affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke unsigned count); 12436315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 12446315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count); 12456315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 124605a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask); 1247cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 12488273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const; 12494b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1250fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1251fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 12527d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual ir_swizzle *as_swizzle() 12537d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt { 12547d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt return this; 12557d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt } 12567d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt 1257affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke /** 1258affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke * Construct an ir_swizzle from the textual representation. Can fail. 1259affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke */ 1260affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 1261affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1262affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke virtual void accept(ir_visitor *v) 1263affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 1264affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke v->visit(this); 1265affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 1266affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 12678895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 12688895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1269affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke bool is_lvalue() 1270affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 1271a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt return val->is_lvalue() && !mask.has_duplicates; 1272affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 1273affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 12742b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 12752b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 12762b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 12772b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick virtual ir_variable *variable_referenced(); 12782b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 1279affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_rvalue *val; 1280affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle_mask mask; 12816315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 12826315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanickprivate: 12836315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick /** 12846315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * Initialize the mask component of a swizzle 12856315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * 12866315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * This is used by the \c ir_swizzle constructors. 12876315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick */ 12886315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick void init_mask(const unsigned *components, unsigned count); 1289affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}; 1290affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1291affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1292fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue { 1293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 12948273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0; 1295ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick 129644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_dereference *as_dereference() 129744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 129844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 129944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 130044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 1301c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt bool is_lvalue(); 1302fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 13032b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 13042b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 13052b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 130670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() = 0; 130770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 130870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 130970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 131070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference { 131170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 131270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_variable(ir_variable *var); 131370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 13148273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_variable *clone(void *mem_ctx, 13158273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 13164b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1317fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1318fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 1319d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt virtual ir_dereference_variable *as_dereference_variable() 1320d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt { 1321d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt return this; 1322d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt } 1323d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 132470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 132570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 132670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 132770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 132870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 132936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->var; 133070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 1331f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 1332b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 1333b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 1334b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /* ir_dereference_variable objects always dereference the entire 1335b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * variable. However, if this dereference is dereferenced by anything 1336b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * else, the complete deferefernce chain is not a whole-variable 1337b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * dereference. This method should only be called on the top most 1338b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * ir_rvalue in a dereference chain. 1339b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 1340b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return this->var; 1341b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 1342b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 1343c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1344c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1345c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1346c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1347c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1348f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 134936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 135036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick /** 135136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick * Object being dereferenced. 135236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick */ 135336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_variable *var; 135470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 135570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 135670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 135770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference { 135870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 135970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index); 136070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 136170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_variable *var, ir_rvalue *array_index); 136270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 13638273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_array *clone(void *mem_ctx, 13648273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 13654b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1366fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1367fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 1368b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual ir_dereference_array *as_dereference_array() 1369b145e903694fa932ab1e0d955e889555193ab604Eric Anholt { 1370b145e903694fa932ab1e0d955e889555193ab604Eric Anholt return this; 1371b145e903694fa932ab1e0d955e889555193ab604Eric Anholt } 1372b145e903694fa932ab1e0d955e889555193ab604Eric Anholt 137370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 137470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 137570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 137670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 137770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 137836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->array->variable_referenced(); 137970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 138070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 1381c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1382c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1383c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1384c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1385c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1386f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 138770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 138836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array; 138936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array_index; 139036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 139170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate: 139270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick void set_array(ir_rvalue *value); 139370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 139470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 139570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 139670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference { 139770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 139870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_rvalue *value, const char *field); 139970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 140070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_variable *var, const char *field); 140170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 14028273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_record *clone(void *mem_ctx, 14038273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 14044b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1405fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1406fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 140770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 140870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 140970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 141070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick virtual ir_variable *variable_referenced() 141170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 141236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->record->variable_referenced(); 141370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 1414f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 1415c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1416c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1417c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1418c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1419c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1420f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 142136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 142236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *record; 142336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick const char *field; 1424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1427be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/** 1428be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick * Data stored in an ir_constant 1429be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick */ 1430be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanickunion ir_constant_data { 1431be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick unsigned u[16]; 1432be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick int i[16]; 1433be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick float f[16]; 1434be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick bool b[16]; 1435be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick}; 1436be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick 1437be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick 1438fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue { 1439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 1440824b659d917a5f14a1f66b891d25036ef9f9adc6Ian Romanick ir_constant(const struct glsl_type *type, const ir_constant_data *data); 14413c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(bool b); 14423c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(unsigned int u); 14433c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(int i); 14443c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(float f); 1445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1446989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick /** 1447756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick * Construct an ir_constant from a list of ir_constant values 1448756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick */ 1449756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick ir_constant(const struct glsl_type *type, exec_list *values); 1450756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick 1451756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick /** 1452989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * Construct an ir_constant from a scalar component of another ir_constant 1453989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1454989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * The new \c ir_constant inherits the type of the component from the 1455989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * source constant. 1456989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1457989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * \note 1458989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * In the case of a matrix constant, the new constant is a scalar, \b not 1459989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * a vector. 1460989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick */ 1461989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick ir_constant(const ir_constant *c, unsigned i); 1462989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick 1463ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke /** 1464ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke * Return a new ir_constant of the specified type containing all zeros. 1465ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke */ 1466ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke static ir_constant *zero(void *mem_ctx, const glsl_type *type); 1467ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke 14688273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const; 14694b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1470fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1471fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 14725c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual ir_constant *as_constant() 14735c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt { 14745c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt return this; 14755c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt } 14765c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt 147778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 147878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 147978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 148078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 148178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 14828895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 14838895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 148531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * Get a particular component of a constant as a specific type 148631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * 148731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * This is useful, for example, to get a value from an integer constant 148831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * as a float or bool. This appears frequently when constructors are 148931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * called with all constant parameters. 149031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick */ 149131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@{*/ 149231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick bool get_bool_component(unsigned i) const; 149331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick float get_float_component(unsigned i) const; 149431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick int get_int_component(unsigned i) const; 149531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick unsigned get_uint_component(unsigned i) const; 149631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@}*/ 149731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick 149874e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke ir_constant *get_array_element(unsigned i) const; 149974e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke 1500b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick ir_constant *get_record_field(const char *name); 1501b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick 150231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /** 15031e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick * Determine whether a constant has the same value as another constant 150438e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick * 15058e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \sa ir_constant::is_zero, ir_constant::is_one, 15068e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * ir_constant::is_negative_one 15071e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick */ 15081e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick bool has_value(const ir_constant *) const; 15091e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick 1510ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_zero() const; 1511ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_one() const; 15128e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick virtual bool is_negative_one() const; 151338e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick 151438e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick /** 1515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 1516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 1518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 1519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 1520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1521be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick union ir_constant_data value; 15227f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick 152374e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke /* Array elements */ 152474e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke ir_constant **array_elements; 152574e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke 152674e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke /* Structure fields */ 15277f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick exec_list components; 1528710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick 1529710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanickprivate: 1530710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick /** 1531710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick * Parameterless constructor only used by the clone method 1532710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick */ 1533710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick ir_constant(void); 1534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1536e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/*@}*/ 1537e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 1538e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 1539e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Apply a visitor to each IR node in a list 1540e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 154170b74928a220aff024664714877defb0caedf33fEric Anholtvoid 154270b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor); 1543adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 1544e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 1545e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Validate invariants on each IR node in a list 1546e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 154753cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholtvoid validate_ir_tree(exec_list *instructions); 154853cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholt 1549f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick/** 1550f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * Make a clone of each IR instruction in a list 1551f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * 1552f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param in List of IR instructions that are to be cloned 1553f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param out List to hold the cloned instructions 1554f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick */ 1555f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanickvoid 15568273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholtclone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in); 1557f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick 1558adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 1559adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 1560adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 1561e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 1562c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void 1563c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions, 1564c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt struct _mesa_glsl_parse_state *state); 1565c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt 156660e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickextern void 1567d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick_mesa_glsl_release_functions(void); 1568d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick 1569d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanickextern void 157060e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickreparent_ir(exec_list *list, void *mem_ctx); 157160e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanick 15721cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonsecastruct glsl_symbol_table; 15734ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick 15744ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickextern void 15754ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickimport_prototypes(const exec_list *source, exec_list *dest, 15761cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonseca struct glsl_symbol_table *symbols, void *mem_ctx); 15774ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick 15789f82806c7b5109553cf806a5652e6b6198665094Eric Anholtextern bool 15799f82806c7b5109553cf806a5652e6b6198665094Eric Anholtir_has_call(ir_instruction *ir); 15809f82806c7b5109553cf806a5652e6b6198665094Eric Anholt 1581925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtextern void 1582925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtdo_set_program_inouts(exec_list *instructions, struct gl_program *prog); 1583925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt 1584e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 1585