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