ir.h revision 70fe8b66632f4afd87ebb12a450b1e639428e88f
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"
318895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick#include "ir_hierarchical_visitor.h"
320044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick
33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_program {
34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   void *bong_hits;
35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions
39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
400044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node {
41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
43a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
441cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick   class ir_constant *constant_expression_value();
4578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *) = 0;
468895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
4778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
4844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /**
4944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \name IR instruction downcast functions
5044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    *
5144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * These functions either cast the object to a derived class or return
5244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \c NULL if the object's type does not match the specified derived class.
5344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * Additional downcast functions will be added as needed.
5444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    */
5544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@{*/
5644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_variable *          as_variable()         { return NULL; }
576202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual class ir_function *          as_function()         { return NULL; }
5844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_dereference *       as_dereference()      { return NULL; }
59fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual class ir_rvalue *            as_rvalue()           { return NULL; }
607d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual class ir_label *             as_label()            { return NULL; }
6101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual class ir_loop *              as_loop()             { return NULL; }
62cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_assignment *        as_assignment()       { return NULL; }
63cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_call *              as_call()             { return NULL; }
64cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_return *            as_return()           { return NULL; }
655ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual class ir_if *                as_if()               { return NULL; }
667d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual class ir_swizzle *           as_swizzle()          { return NULL; }
675c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual class ir_constant *          as_constant()         { return NULL; }
6844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@}*/
6944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
7144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   ir_instruction()
72d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
73d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick      /* empty */
74d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
75a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
78fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction {
79fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic:
80fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue * as_rvalue()
81fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
82fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return this;
83fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
84fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
85fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual bool is_lvalue()
86fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
87fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return false;
88fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
89fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
902b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
912b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
922b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
932b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   virtual ir_variable *variable_referenced()
942b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   {
952b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick      return NULL;
962b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   }
972b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
98fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected:
99b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   ir_rvalue()
100b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   {
101b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      /* empty */
102b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   }
103fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke};
104fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
105fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_auto = 0,
108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_uniform,
109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_inout
112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation {
115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
120fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_variable(const struct glsl_type *, const char *);
124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
12544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_variable *as_variable()
12644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
12744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
12844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
12944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
13078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
13178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
13278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
13378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
13478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
1358895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1372d394d4877794d19756c3760d711524dca89f772Ian Romanick   /**
1382d394d4877794d19756c3760d711524dca89f772Ian Romanick    * Duplicate an IR variable
1392d394d4877794d19756c3760d711524dca89f772Ian Romanick    *
1402d394d4877794d19756c3760d711524dca89f772Ian Romanick    * \note
1412d394d4877794d19756c3760d711524dca89f772Ian Romanick    * This will probably be made \c virtual and moved to the base class
1422d394d4877794d19756c3760d711524dca89f772Ian Romanick    * eventually.
1432d394d4877794d19756c3760d711524dca89f772Ian Romanick    */
1442d394d4877794d19756c3760d711524dca89f772Ian Romanick   ir_variable *clone() const
1452d394d4877794d19756c3760d711524dca89f772Ian Romanick   {
1462d394d4877794d19756c3760d711524dca89f772Ian Romanick      ir_variable *var = new ir_variable(type, name);
1472d394d4877794d19756c3760d711524dca89f772Ian Romanick
148b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick      var->max_array_access = this->max_array_access;
1492d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->read_only = this->read_only;
1502d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->centroid = this->centroid;
1512d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->invariant = this->invariant;
1522d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->mode = this->mode;
1532d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->interpolation = this->interpolation;
1542d394d4877794d19756c3760d711524dca89f772Ian Romanick
1552d394d4877794d19756c3760d711524dca89f772Ian Romanick      return var;
1562d394d4877794d19756c3760d711524dca89f772Ian Romanick   }
1572d394d4877794d19756c3760d711524dca89f772Ian Romanick
158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
160b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   /**
161b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Highest element accessed with a constant expression array index
162b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    *
163b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Not used for non-array variables.
164b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    */
165b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   unsigned max_array_access;
166b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
17071df19f5ef6e78beb5160801f81468184b75447eEric Anholt   /** If the variable is initialized outside of the scope of the shader */
17171df19f5ef6e78beb5160801f81468184b75447eEric Anholt   unsigned shader_in:1;
17271df19f5ef6e78beb5160801f81468184b75447eEric Anholt   /**
17371df19f5ef6e78beb5160801f81468184b75447eEric Anholt    * If the variable value is later used outside of the scope of the shader.
17471df19f5ef6e78beb5160801f81468184b75447eEric Anholt    */
17571df19f5ef6e78beb5160801f81468184b75447eEric Anholt   unsigned shader_out:1;
176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
1799d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick
1809d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   /**
1819d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * Flag that the whole array is assignable
1829d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    *
1839d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * In GLSL 1.20 and later whole arrays are assignable (and comparable for
1849d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * equality).  This flag enables this behavior.
1859d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    */
1869d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   unsigned array_lvalue:1;
187326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt
188326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   /**
189c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    * Emit a warning if this variable is accessed.
190c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    */
191c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   const char *warn_extension;
192c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick
193c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   /**
194326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    * Value assigned in the initializer of a variable declared "const"
195326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    */
196326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   ir_constant *constant_value;
197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
2019fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/**
2029fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or
2039fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype.
2049fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */
205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
206894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /* An ir_function_signature will be part of the list of signatures in
207894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    * an ir_function.
208894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    */
209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
210e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
21278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
21378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
21478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
21578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
21678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2178895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2188895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
2200f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    * Get the name of the function for which this is a signature
2210f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    */
2220f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   const char *function_name() const;
2230f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
2240f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   /**
225abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * Check whether the qualifiers match between this signature's parameters
226abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * and the supplied parameter list.  If not, returns the name of the first
227abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * parameter with mismatched qualifiers (for use in error messages).
228abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    */
229abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   const char *qualifiers_match(exec_list *params);
230abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke
231abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   /**
232bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * Replace the current parameter list with the given one.  This is useful
233bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * if the current information came from a prototype, and either has invalid
234bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * or missing parameter names.
235bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    */
236bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   void replace_parameters(exec_list *new_params);
237bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke
238bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   /**
239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
246f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_variable of function parameters.
247f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    *
248f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * This represents the storage.  The paramaters passed in a particular
249f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * call will be in ir_call::actual_paramaters.
250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
2510044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2539fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   /** Whether or not this function has a body (which may be empty). */
2549fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   unsigned is_defined:1;
2556a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
256894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /** Body of instructions in the function. */
257894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   struct exec_list body;
258894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt
2596a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate:
2606a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   /** Function of which this signature is one overload. */
2616a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   class ir_function *function;
2626a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
2636a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   friend class ir_function;
264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
2689fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name.
2699fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the
2709fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions.
271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
274882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2766202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual ir_function *as_function()
2776202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   {
2786202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke      return this;
2796202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   }
2806202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke
28178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
28278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
28378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
28478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
28578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2868895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2878895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
2886a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   void add_signature(ir_function_signature *sig)
2896a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   {
2906a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      sig->function = this;
2916a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      signatures.push_tail(sig);
2926a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   }
2936a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
29595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    * Get an iterator for the set of function signatures
29695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    */
29795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   exec_list_iterator iterator()
29895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   {
29995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick      return signatures.iterator();
30095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   }
30195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick
30295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   /**
3030d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that matches a set of actual parameters, taking implicit
3040d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * conversions into account.
305471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
306471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *matching_signature(exec_list *actual_param);
307471471f83471481db0445e73f8c89e6a9149838eIan Romanick
308471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
3090d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that exactly matches a set of actual parameters without
3100d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * any implicit type conversions.
3110d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    */
3120d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   ir_function_signature *exact_matching_signature(exec_list *actual_ps);
3130d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke
3140d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   /**
315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
319a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate:
320471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
321f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_function_signature for each overloaded function with this name.
322471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
3230044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
3250f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
3260f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const
3270f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{
3280f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   return function->name;
3290f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick}
330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3333c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/**
3343c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements
3353c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */
3363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction {
3373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic:
3383c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if(ir_rvalue *condition)
3393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      : condition(condition)
3403c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
3413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      /* empty */
3423c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
3433c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3445ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual ir_if *as_if()
3455ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   {
3465ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt      return this;
3475ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   }
3485ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt
3493c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void accept(ir_visitor *v)
3503c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
3513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      v->visit(this);
3523c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
3533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3548895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
3558895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *condition;
357f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the then branch */
3583c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  then_instructions;
359f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the else branch */
3603c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  else_instructions;
3613c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick};
3623c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3633c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
364fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/**
365fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure.
366fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */
367fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction {
368fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic:
369fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL)
370fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
371fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      /* empty */
372fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
373fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
374fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   virtual void accept(ir_visitor *v)
375fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
376fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      v->visit(this);
377fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
378fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
3798895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
3808895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
38101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual ir_loop *as_loop()
38201f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   {
38301f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick      return this;
38401f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   }
38501f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick
386fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
387fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * Get an iterator for the instructions of the loop body
388fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
389fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list_iterator iterator()
390fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
391fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      return body_instructions.iterator();
392fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
393fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
394f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction that make up the body of the loop. */
395fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list body_instructions;
396fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
397fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
398fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * \name Loop counter and controls
399fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
400fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@{*/
401fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *from;
402fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *to;
403fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *increment;
404fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_variable *counter;
405fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@}*/
406fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick};
407fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
408fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
409fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue {
410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
411fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
41378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
41478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
41578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
41678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
41778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
4188895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4198895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
420cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_assignment * as_assignment()
421cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
422cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
423cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
424cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
428fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *lhs;
429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
433fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
438fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4413b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when
442160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list.
4433b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */
444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
449a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke   ir_unop_sign,
450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
45244d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_exp,
454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_log,
45501665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
45601665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
459dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_f2b,      /**< Float-to-boolean conversion */
460dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_b2f,      /**< Boolean-to-float conversion */
461c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_i2b,      /**< int-to-boolean conversion */
462c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_b2i,      /**< Boolean-to-int conversion */
4636c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
471a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
47457e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /**
47557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    * \name Trigonometric operations.
47657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    */
47757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@{*/
47857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_sin,
47957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_cos,
48057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@}*/
48157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke
482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
522fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
525fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5277dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   static unsigned int get_num_operands(ir_expression_operation);
5287dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   unsigned int get_num_operands()
5297dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   {
5307dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke      return get_num_operands(operation);
5317dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   }
532160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt
5333b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
5343b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Return a string representing this expression's operator.
5353b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
5363b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   const char *operator_string();
5373b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
5383b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
5393b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Do a reverse-lookup to translate the given string into an operator.
5403b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
5413b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   static ir_expression_operation get_operator(const char *);
5423b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
54378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
54478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
54578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
54678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
54778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
5488895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
5498895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
550cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_expression *clone();
551cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
553fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *operands[2];
554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
557ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
558ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
559ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
560fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue {
561ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
562471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call(const ir_function_signature *callee, exec_list *actual_parameters)
563b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(callee)
564ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
5659e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
5669e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      type = callee->return_type;
567471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
568ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
569ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
570cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_call *as_call()
571cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
572cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
573cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
574cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
575ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
576ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
577ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
578ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
579ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
5808895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
5818895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
582ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
583ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
584ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
585ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   static ir_call *get_error_instruction();
586ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
5879878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   /**
5889878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
5899878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
5909878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
5919878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
5929878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
5939878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
5949878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
59593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
59693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
59793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
59893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
59993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
6000f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick      return callee->function_name();
60193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
60293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
603cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   const ir_function_signature *get_callee()
604cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
605cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return callee;
606cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
607cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
608cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   /**
609cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * Generates an inline version of the function before @ir,
610cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * returning the return value of the function.
611cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    */
612cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_rvalue *generate_inline(ir_instruction *ir);
613cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
614ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
615471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
616b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(NULL)
617471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
618471471f83471481db0445e73f8c89e6a9149838eIan Romanick      /* empty */
619471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
620471471f83471481db0445e73f8c89e6a9149838eIan Romanick
621471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *callee;
622f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt
623f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /* List of ir_rvalue of paramaters passed in this call. */
624ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   exec_list actual_parameters;
625ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
626ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
627ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
6289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
6299578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
6309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
6319578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
6329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
6339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
6349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
6359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
6369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
6379578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
6399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
6419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
6429578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
6439578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
6449578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
6459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
6469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
6489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
650fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
6519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
6529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
6549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6559578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
656cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_return *as_return()
657cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
658cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
659cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
660cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
661fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
6629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6639578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
6649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
6669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
6679578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
6699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
6718895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
6728895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
6739578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate:
674fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
6759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
676f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
677f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
678f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/**
679f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops
680f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
681f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue.  The \c break within a loop is
682f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement.
683f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
684f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump
685f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */
686f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump {
687f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic:
688f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode {
689f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_break,
690f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_continue
691f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   };
692f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
693f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   ir_loop_jump(ir_loop *loop, jump_mode mode)
694f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      : loop(loop), mode(mode)
695f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
696f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      /* empty */
697f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
698f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
699f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   virtual void accept(ir_visitor *v)
700f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
701f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      v->visit(this);
702f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
703f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
7048895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
7058895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
706f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_break() const
707f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
708f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_break;
709f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
710f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
711f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_continue() const
712f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
713f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_continue;
714f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
715f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
716f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickprivate:
717f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Loop containing this break instruction. */
718f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   ir_loop *loop;
719f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
720f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Mode selector for the jump instruction. */
721f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode mode;
722f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick};
7239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
7249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
7259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
726a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
727a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
728a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
729a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
730a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
731a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
732a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
733a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
734a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
735f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
736a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
737a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
738a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
740a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
741a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
742a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
743a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
744a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
745affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
746affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
747affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
748affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
749affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
75005a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt   ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
751cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
7527d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual ir_swizzle *as_swizzle()
7537d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   {
7547d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt      return this;
7557d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   }
7567d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt
757cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_swizzle *clone()
758cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
759cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return new ir_swizzle(this->val, this->mask);
760cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
761cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
762affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
763affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
764affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
765affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
766affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
767affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
768affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
769affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
770affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
771affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
7728895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
7738895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
774affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   bool is_lvalue()
775affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
776a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
777affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
778affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
7792b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
7802b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
7812b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
7822b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   virtual ir_variable *variable_referenced();
7832b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
784affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
785affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
786affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
787affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
788affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
789fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
790a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
79144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
79244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
79344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
79444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
79544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
79678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
79778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
79878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
79978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
80078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
8018895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
8028895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
803c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt   bool is_lvalue();
804fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
8052b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
8062b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
8072b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
80870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced() = 0;
8092b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
81070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   enum ir_deref_mode {
811a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_variable,
812a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_array,
813a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_record
814a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
815a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
816a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
817a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Object being dereferenced.
818a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
819fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke    * Must be either an \c ir_variable or an \c ir_rvalue.
820a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
821a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *var;
822a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
823a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
824fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      ir_rvalue *array_index;
825a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      const char *field;
826a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } selector;
82770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
82870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprotected:
82970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference(ir_deref_mode mode)
83070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick      : mode(mode)
83170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
83270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick      /* empty */
83370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
83470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
83570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
83670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
83770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference {
83870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
83970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_variable(ir_variable *var);
84070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
84170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
84270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
84370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
84470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
84570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
84670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick      return (ir_variable *) this->var;
84770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
84870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
84970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
85070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
85170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference {
85270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
85370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
85470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
85570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
85670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
85770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
85870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
85970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
86070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
86170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
86270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick      return ((ir_rvalue *) this->var)->variable_referenced();
86370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
86470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
86570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
86670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate:
86770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   void set_array(ir_rvalue *value);
86870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
86970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
87070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
87170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference {
87270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
87370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_rvalue *value, const char *field);
87470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
87570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_variable *var, const char *field);
87670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
87770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
87870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
87970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
88070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
88170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
88270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick      return ((ir_rvalue *) this->var)->variable_referenced();
88370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
884a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
885a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
886a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
887fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
888a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
889a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_constant(const struct glsl_type *type, const void *data);
8903c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
8913c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
8923c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
8933c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
894a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
8955c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual ir_constant *as_constant()
8965c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   {
8975c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt      return this;
8985c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   }
8995c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt
90078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
90178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
90278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
90378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
90478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
9058895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
9068895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
907cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_constant *clone()
908cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
909cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return new ir_constant(this->type, &this->value);
910cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
911cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
912a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
913a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
914a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
915a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
916a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
917a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
918a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
919a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
920a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned u[16];
921a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int i[16];
922a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      float f[16];
923a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      bool b[16];
924a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } value;
925a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
926a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
92770b74928a220aff024664714877defb0caedf33fEric Anholtvoid
92870b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor);
929adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
930adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
931adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
932adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
933e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
934c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
935c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions,
936c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt				struct _mesa_glsl_parse_state *state);
937c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
938e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
939