ir.h revision f1ddca9f2143e377d2a70941dcedbb1f5c699e07
1986b8f798272d3ae2898617c8fb089156a5941c0Ian Romanick/* -*- c++ -*- */ 2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/* 3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation 4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"), 7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation 8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the 10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions: 11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next 13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the 14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software. 15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE. 23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 25e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#pragma once 26e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#ifndef IR_H 27e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#define IR_H 28e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 290044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h" 3078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h" 310044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick 32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_program { 33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick void *bong_hits; 34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions 38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 390044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node { 40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 431cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick class ir_constant *constant_expression_value(); 4478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *) = 0; 4578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 4644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /** 4744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \name IR instruction downcast functions 4844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * 4944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * These functions either cast the object to a derived class or return 5044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \c NULL if the object's type does not match the specified derived class. 5144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * Additional downcast functions will be added as needed. 5244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke */ 5344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@{*/ 5444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_variable * as_variable() { return NULL; } 5544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_dereference * as_dereference() { return NULL; } 56fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual class ir_rvalue * as_rvalue() { return NULL; } 5701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual class ir_loop * as_loop() { return NULL; } 5844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@}*/ 5944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 60a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 6144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke ir_instruction() 62d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 63d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick /* empty */ 64d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 68fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction { 69fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic: 70fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue * as_rvalue() 71fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 72fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return this; 73fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 74fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 75fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual bool is_lvalue() 76fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 77fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return false; 78fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 79fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 80fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected: 81fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue() : ir_instruction() { } 82fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke}; 83fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 84fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_auto = 0, 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_uniform, 88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_inout 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation { 94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 99fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_variable(const struct glsl_type *, const char *); 103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 10444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_variable *as_variable() 10544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 10644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 10744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 10844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 10978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 11078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 11178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 11278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 11378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 1142d394d4877794d19756c3760d711524dca89f772Ian Romanick /** 1152d394d4877794d19756c3760d711524dca89f772Ian Romanick * Duplicate an IR variable 1162d394d4877794d19756c3760d711524dca89f772Ian Romanick * 1172d394d4877794d19756c3760d711524dca89f772Ian Romanick * \note 1182d394d4877794d19756c3760d711524dca89f772Ian Romanick * This will probably be made \c virtual and moved to the base class 1192d394d4877794d19756c3760d711524dca89f772Ian Romanick * eventually. 1202d394d4877794d19756c3760d711524dca89f772Ian Romanick */ 1212d394d4877794d19756c3760d711524dca89f772Ian Romanick ir_variable *clone() const 1222d394d4877794d19756c3760d711524dca89f772Ian Romanick { 1232d394d4877794d19756c3760d711524dca89f772Ian Romanick ir_variable *var = new ir_variable(type, name); 1242d394d4877794d19756c3760d711524dca89f772Ian Romanick 125b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick var->max_array_access = this->max_array_access; 1262d394d4877794d19756c3760d711524dca89f772Ian Romanick var->read_only = this->read_only; 1272d394d4877794d19756c3760d711524dca89f772Ian Romanick var->centroid = this->centroid; 1282d394d4877794d19756c3760d711524dca89f772Ian Romanick var->invariant = this->invariant; 1292d394d4877794d19756c3760d711524dca89f772Ian Romanick var->mode = this->mode; 1302d394d4877794d19756c3760d711524dca89f772Ian Romanick var->interpolation = this->interpolation; 1312d394d4877794d19756c3760d711524dca89f772Ian Romanick 1322d394d4877794d19756c3760d711524dca89f772Ian Romanick return var; 1332d394d4877794d19756c3760d711524dca89f772Ian Romanick } 1342d394d4877794d19756c3760d711524dca89f772Ian Romanick 135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 137b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick /** 138b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Highest element accessed with a constant expression array index 139b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * 140b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Not used for non-array variables. 141b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick */ 142b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick unsigned max_array_access; 143b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 1509d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick 1519d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick /** 1529d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * Flag that the whole array is assignable 1539d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * 1549d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * In GLSL 1.20 and later whole arrays are assignable (and comparable for 1559d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * equality). This flag enables this behavior. 1569d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick */ 1579d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick unsigned array_lvalue:1; 158326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt 159326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt /** 160c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick * Emit a warning if this variable is accessed. 161c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick */ 162c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick const char *warn_extension; 163c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick 164c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick /** 165326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt * Value assigned in the initializer of a variable declared "const" 166326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt */ 167326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt ir_constant *constant_value; 168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction { 172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label(const char *label); 174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 17578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 17678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 17778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 17878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 17978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *label; 181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 187e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick ir_function_signature(const glsl_type *return_type); 188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 18978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 19078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 19178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 19278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 19378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 1950f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick * Get the name of the function for which this is a signature 1960f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick */ 1970f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick const char *function_name() const; 1980f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 1990f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick /** 200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 207f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_variable of function parameters. 208f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * 209f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * This represents the storage. The paramaters passed in a particular 210f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * call will be in ir_call::actual_paramaters. 211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 2120044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Pointer to the label that begins the function definition. 216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_label *definition; 2186a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 2196a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate: 2206a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick /** Function of which this signature is one overload. */ 2216a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick class ir_function *function; 2226a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 2236a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick friend class ir_function; 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 232882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick ir_function(const char *name); 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 23478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 23578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 23678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 23778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 23878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 2396a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick void add_signature(ir_function_signature *sig) 2406a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick { 2416a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick sig->function = this; 2426a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick signatures.push_tail(sig); 2436a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick } 2446a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 24695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick * Get an iterator for the set of function signatures 24795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick */ 24895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick exec_list_iterator iterator() 24995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick { 25095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick return signatures.iterator(); 25195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick } 25295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick 25395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick /** 254471471f83471481db0445e73f8c89e6a9149838eIan Romanick * Find a signature that matches a set of actual parameters. 255471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 256471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *matching_signature(exec_list *actual_param); 257471471f83471481db0445e73f8c89e6a9149838eIan Romanick 258471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 263a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate: 264471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 265f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_function_signature for each overloaded function with this name. 266471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 2670044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 2690f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 2700f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const 2710f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{ 2720f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return function->name; 2730f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick} 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2773c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/** 2783c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements 2793c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 2803c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction { 2813c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic: 2823c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_if(ir_rvalue *condition) 2833c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick : condition(condition) 2843c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 2853c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick /* empty */ 2863c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 2873c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 2883c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual void accept(ir_visitor *v) 2893c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 2903c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick v->visit(this); 2913c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 2923c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 2933c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *condition; 294f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the then branch */ 2953c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list then_instructions; 296f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the else branch */ 2973c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list else_instructions; 2983c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}; 2993c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3003c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 301fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/** 302fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure. 303fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 304fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction { 305fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic: 306fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL) 307fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 308fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /* empty */ 309fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 310fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 311fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick virtual void accept(ir_visitor *v) 312fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 313fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick v->visit(this); 314fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 315fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 31601f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual ir_loop *as_loop() 31701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick { 31801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick return this; 31901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick } 32001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick 321fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 322fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * Get an iterator for the instructions of the loop body 323fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 324fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list_iterator iterator() 325fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 326fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick return body_instructions.iterator(); 327fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 328fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 329f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction that make up the body of the loop. */ 330fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list body_instructions; 331fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 332fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 333fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * \name Loop counter and controls 334fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 335fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@{*/ 336fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *from; 337fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *to; 338fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *increment; 339fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_variable *counter; 340fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@}*/ 341fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick}; 342fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 343fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 344fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue { 345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 346fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition); 347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 34878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 34978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 35078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 35178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 35278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 356fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *lhs; 357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 361fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *rhs; 362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 365a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 366fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *condition; 367a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 368a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 369160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt/* Update ir_expression::num_operands() and ir_print_visitor.cpp when 370160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list. 371160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt*/ 372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 375a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 376a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 377a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 378a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 37944d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt ir_unop_sqrt, 380a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_exp, 381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_log, 38201665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_exp2, 38301665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_log2, 384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 386dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_f2b, /**< Float-to-boolean conversion */ 387dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_b2f, /**< Boolean-to-float conversion */ 388c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_i2b, /**< int-to-boolean conversion */ 389c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_b2i, /**< Boolean-to-int conversion */ 3906c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick ir_unop_u2f, /**< Unsigned-to-float conversion. */ 391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 393a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 394a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 395a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 396a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 397a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 398a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 405a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Binary comparison operators 409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 418a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 419a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 420a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 428a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_pow 439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 441fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue { 442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 444fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *, ir_rvalue *); 445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 446160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt unsigned int get_num_operands(void); 447160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt 44878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 44978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 45078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 45178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 45278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 454fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *operands[2]; 455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 458ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 459ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 460ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 461fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue { 462ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 463471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call(const ir_function_signature *callee, exec_list *actual_parameters) 464fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke : ir_rvalue(), callee(callee) 465ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 4669e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick assert(callee->return_type != NULL); 4679e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick type = callee->return_type; 468471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 469ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 470ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 471ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 472ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 473ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 474ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 475ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 476ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 477ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 478ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 479ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick static ir_call *get_error_instruction(); 480ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 4819878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick /** 4829878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick * Get an iterator for the set of acutal parameters 4839878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick */ 4849878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick exec_list_iterator iterator() 4859878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick { 4869878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick return actual_parameters.iterator(); 4879878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick } 4889878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick 48993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /** 49093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick * Get the name of the function being called. 49193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick */ 49293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick const char *callee_name() const 49393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick { 4940f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return callee->function_name(); 49593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick } 49693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick 497ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 498471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 499fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke : ir_rvalue(), callee(NULL) 500471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 501471471f83471481db0445e73f8c89e6a9149838eIan Romanick /* empty */ 502471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 503471471f83471481db0445e73f8c89e6a9149838eIan Romanick 504471471f83471481db0445e73f8c89e6a9149838eIan Romanick const ir_function_signature *callee; 505f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt 506f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /* List of ir_rvalue of paramaters passed in this call. */ 507ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick exec_list actual_parameters; 508ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 509ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 510ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 5119578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 5129578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 5139578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 5149578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 5159578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 5169578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 5179578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 5189578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 5199578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 52044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke : ir_instruction() 5219578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 5229578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 5239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 5249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 5259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 5269578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 5279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 5289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 5299578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 5309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 5319578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 5329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 5339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 534fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_return(ir_rvalue *value) 5359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 5369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 5379578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick /* empty */ 5389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 5399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 540fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *get_value() const 5419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 5429578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 5439578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 5449578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 5459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 5469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 5479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 5489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 5499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 5509578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate: 551fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *value; 5529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 553f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 554f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 555f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/** 556f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops 557f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 558f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue. The \c break within a loop is 559f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement. 560f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 561f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump 562f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */ 563f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump { 564f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic: 565f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode { 566f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_break, 567f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_continue 568f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick }; 569f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 570f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick ir_loop_jump(ir_loop *loop, jump_mode mode) 571f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick : loop(loop), mode(mode) 572f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 573f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /* empty */ 574f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 575f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 576f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick virtual void accept(ir_visitor *v) 577f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 578f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick v->visit(this); 579f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 580f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 581f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_break() const 582f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 583f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_break; 584f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 585f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 586f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_continue() const 587f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 588f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_continue; 589f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 590f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 591f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickprivate: 592f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Loop containing this break instruction. */ 593f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick ir_loop *loop; 594f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 595f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Mode selector for the jump instruction. */ 596f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode mode; 597f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick}; 5989578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 5999578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 6009578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 601a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 610f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke unsigned num_components:3; 611a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 612a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 616a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 617a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 618a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 619a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 620affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 621affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue { 622affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic: 623affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 624affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke unsigned count); 625affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke /** 626affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke * Construct an ir_swizzle from the textual representation. Can fail. 627affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke */ 628affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 629affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 630affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke virtual void accept(ir_visitor *v) 631affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 632affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke v->visit(this); 633affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 634affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 635affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke bool is_lvalue() 636affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 637a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt return val->is_lvalue() && !mask.has_duplicates; 638affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 639affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 640affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_rvalue *val; 641affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle_mask mask; 642affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}; 643affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 644affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 645fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue { 646a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 647a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_dereference(struct ir_instruction *); 648a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 649fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_dereference(ir_instruction *variable, ir_rvalue *array_index); 650954699773681842dac9f8f0d9ba4629513232196Ian Romanick 65144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_dereference *as_dereference() 65244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 65344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 65444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 65544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 65678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 65778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 65878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 65978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 66078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 661c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt bool is_lvalue(); 662fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 663a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick enum { 664a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_variable, 665a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_array, 666a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_reference_record 667a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } mode; 668a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 669a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 670a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Object being dereferenced. 671a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 672fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke * Must be either an \c ir_variable or an \c ir_rvalue. 673a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 674a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_instruction *var; 675a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 676a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 677fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *array_index; 678a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *field; 679a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } selector; 680a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 681a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 683fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue { 684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 685a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_constant(const struct glsl_type *type, const void *data); 6863c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(bool b); 6873c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(unsigned int u); 6883c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(int i); 6893c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(float f); 690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 69178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 69278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 69378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 69478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 69578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 696a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 697a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 698a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 699a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 700a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 701a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 702a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 703a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick union { 704a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned u[16]; 705a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick int i[16]; 706a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick float f[16]; 707a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool b[16]; 708a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } value; 709a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 71170b74928a220aff024664714877defb0caedf33fEric Anholtvoid 71270b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor); 713adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 714adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 715adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 716adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 717e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 718c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void 719c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions, 720c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt struct _mesa_glsl_parse_state *state); 721c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt 722e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 723