ir.h revision 7f1ab834d7aa901ce0e12f40db23d7d9891eae59
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; }
59b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual class ir_dereference_array *	as_dereference_array() { return NULL; }
60fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual class ir_rvalue *            as_rvalue()           { 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
98b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
99b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   /**
100b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * If an r-value is a reference to a whole variable, get that variable
101b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    *
102b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * \return
103b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * Pointer to a variable that is completely dereferenced by the r-value.  If
104b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * the r-value is not a dereference or the dereference does not access the
105b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * entire variable (i.e., it's just one array element, struct field), \c NULL
106b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * is returned.
107b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    */
108b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
109b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
110b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return NULL;
111b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
112b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
113fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected:
114b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   ir_rvalue()
115b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   {
116b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      /* empty */
117b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   }
118fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke};
119fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
120fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_auto = 0,
123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_uniform,
124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_inout
127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation {
130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
135fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_variable(const struct glsl_type *, const char *);
139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
14044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_variable *as_variable()
14144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
14244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
14344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
14444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
14578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
14678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
14778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
14878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
14978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
1508895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1518895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1522d394d4877794d19756c3760d711524dca89f772Ian Romanick   /**
1532d394d4877794d19756c3760d711524dca89f772Ian Romanick    * Duplicate an IR variable
1542d394d4877794d19756c3760d711524dca89f772Ian Romanick    *
1552d394d4877794d19756c3760d711524dca89f772Ian Romanick    * \note
1562d394d4877794d19756c3760d711524dca89f772Ian Romanick    * This will probably be made \c virtual and moved to the base class
1572d394d4877794d19756c3760d711524dca89f772Ian Romanick    * eventually.
1582d394d4877794d19756c3760d711524dca89f772Ian Romanick    */
1592d394d4877794d19756c3760d711524dca89f772Ian Romanick   ir_variable *clone() const
1602d394d4877794d19756c3760d711524dca89f772Ian Romanick   {
1612d394d4877794d19756c3760d711524dca89f772Ian Romanick      ir_variable *var = new ir_variable(type, name);
1622d394d4877794d19756c3760d711524dca89f772Ian Romanick
163b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick      var->max_array_access = this->max_array_access;
1642d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->read_only = this->read_only;
1652d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->centroid = this->centroid;
1662d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->invariant = this->invariant;
1672d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->mode = this->mode;
1682d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->interpolation = this->interpolation;
1692d394d4877794d19756c3760d711524dca89f772Ian Romanick
1702d394d4877794d19756c3760d711524dca89f772Ian Romanick      return var;
1712d394d4877794d19756c3760d711524dca89f772Ian Romanick   }
1722d394d4877794d19756c3760d711524dca89f772Ian Romanick
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
175b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   /**
176b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Highest element accessed with a constant expression array index
177b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    *
178b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Not used for non-array variables.
179b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    */
180b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   unsigned max_array_access;
181b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
18571df19f5ef6e78beb5160801f81468184b75447eEric Anholt   /** If the variable is initialized outside of the scope of the shader */
18671df19f5ef6e78beb5160801f81468184b75447eEric Anholt   unsigned shader_in:1;
18771df19f5ef6e78beb5160801f81468184b75447eEric Anholt   /**
18871df19f5ef6e78beb5160801f81468184b75447eEric Anholt    * If the variable value is later used outside of the scope of the shader.
18971df19f5ef6e78beb5160801f81468184b75447eEric Anholt    */
19071df19f5ef6e78beb5160801f81468184b75447eEric Anholt   unsigned shader_out:1;
191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
1949d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick
1959d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   /**
1969d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * Flag that the whole array is assignable
1979d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    *
1989d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * In GLSL 1.20 and later whole arrays are assignable (and comparable for
1999d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * equality).  This flag enables this behavior.
2009d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    */
2019d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   unsigned array_lvalue:1;
202326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt
203326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   /**
204c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    * Emit a warning if this variable is accessed.
205c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    */
206c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   const char *warn_extension;
207c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick
208c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   /**
209326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    * Value assigned in the initializer of a variable declared "const"
210326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    */
211326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   ir_constant *constant_value;
212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
2169fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/**
2179fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or
2189fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype.
2199fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */
220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
221894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /* An ir_function_signature will be part of the list of signatures in
222894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    * an ir_function.
223894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    */
224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
225e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
22778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
22878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
22978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
23078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
23178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2328895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2338895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
2350f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    * Get the name of the function for which this is a signature
2360f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    */
2370f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   const char *function_name() const;
2380f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
2390f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   /**
240abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * Check whether the qualifiers match between this signature's parameters
241abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * and the supplied parameter list.  If not, returns the name of the first
242abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * parameter with mismatched qualifiers (for use in error messages).
243abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    */
244abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   const char *qualifiers_match(exec_list *params);
245abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke
246abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   /**
247bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * Replace the current parameter list with the given one.  This is useful
248bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * if the current information came from a prototype, and either has invalid
249bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * or missing parameter names.
250bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    */
251bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   void replace_parameters(exec_list *new_params);
252bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke
253bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   /**
254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
261f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_variable of function parameters.
262f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    *
263f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * This represents the storage.  The paramaters passed in a particular
264f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * call will be in ir_call::actual_paramaters.
265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
2660044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2689fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   /** Whether or not this function has a body (which may be empty). */
2699fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   unsigned is_defined:1;
2706a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
271894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /** Body of instructions in the function. */
272894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   struct exec_list body;
273894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt
2746a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate:
2756a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   /** Function of which this signature is one overload. */
2766a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   class ir_function *function;
2776a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
2786a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   friend class ir_function;
279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
2839fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name.
2849fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the
2859fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions.
286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
289882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2916202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual ir_function *as_function()
2926202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   {
2936202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke      return this;
2946202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   }
2956202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke
29678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
29778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
29878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
29978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
30078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
3018895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
3028895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3036a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   void add_signature(ir_function_signature *sig)
3046a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   {
3056a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      sig->function = this;
3066a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      signatures.push_tail(sig);
3076a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   }
3086a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
31095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    * Get an iterator for the set of function signatures
31195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    */
31295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   exec_list_iterator iterator()
31395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   {
31495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick      return signatures.iterator();
31595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   }
31695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick
31795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   /**
3180d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that matches a set of actual parameters, taking implicit
3190d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * conversions into account.
320471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
321471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *matching_signature(exec_list *actual_param);
322471471f83471481db0445e73f8c89e6a9149838eIan Romanick
323471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
3240d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that exactly matches a set of actual parameters without
3250d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * any implicit type conversions.
3260d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    */
3270d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   ir_function_signature *exact_matching_signature(exec_list *actual_ps);
3280d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke
3290d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   /**
330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
334a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate:
335471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
336f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_function_signature for each overloaded function with this name.
337471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
3380044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
3400f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
3410f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const
3420f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{
3430f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   return function->name;
3440f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick}
345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3483c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/**
3493c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements
3503c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */
3513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction {
3523c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic:
3533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if(ir_rvalue *condition)
3543c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      : condition(condition)
3553c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
3563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      /* empty */
3573c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
3583c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3595ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual ir_if *as_if()
3605ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   {
3615ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt      return this;
3625ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   }
3635ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt
3643c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void accept(ir_visitor *v)
3653c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
3663c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      v->visit(this);
3673c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
3683c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
3708895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3713c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *condition;
372f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the then branch */
3733c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  then_instructions;
374f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the else branch */
3753c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  else_instructions;
3763c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick};
3773c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3783c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
379fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/**
380fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure.
381fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */
382fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction {
383fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic:
384fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL)
385fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
386fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      /* empty */
387fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
388fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
389fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   virtual void accept(ir_visitor *v)
390fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
391fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      v->visit(this);
392fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
393fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
3948895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
3958895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
39601f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual ir_loop *as_loop()
39701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   {
39801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick      return this;
39901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   }
40001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick
401fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
402fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * Get an iterator for the instructions of the loop body
403fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
404fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list_iterator iterator()
405fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
406fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      return body_instructions.iterator();
407fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
408fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
409f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction that make up the body of the loop. */
410fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list body_instructions;
411fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
412fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
413fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * \name Loop counter and controls
414fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
415fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@{*/
416fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *from;
417fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *to;
418fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *increment;
419fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_variable *counter;
420fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@}*/
421fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick};
422fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
423fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
424fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue {
425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
426fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
42878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
42978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
43078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
43178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
43278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
4338895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4348895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
435cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_assignment * as_assignment()
436cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
437cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
438cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
439cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
443fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *lhs;
444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
448fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
453fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4563b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when
457160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list.
4583b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */
459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
461a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
464a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke   ir_unop_sign,
465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
46744d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_exp,
469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_log,
47001665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
47101665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
474dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_f2b,      /**< Float-to-boolean conversion */
475dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_b2f,      /**< Boolean-to-float conversion */
476c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_i2b,      /**< int-to-boolean conversion */
477c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_b2i,      /**< Boolean-to-int conversion */
4786c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
48957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /**
49057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    * \name Trigonometric operations.
49157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    */
49257e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@{*/
49357e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_sin,
49457e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_cos,
49557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@}*/
49657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke
497b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /**
498b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    * \name Partial derivatives.
499b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    */
500b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@{*/
501b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdx,
502b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdy,
503b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@}*/
504b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke
505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
537a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
538a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
539a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
540a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
541a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
543a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
545fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
548fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5507dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   static unsigned int get_num_operands(ir_expression_operation);
5517dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   unsigned int get_num_operands()
5527dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   {
5537dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke      return get_num_operands(operation);
5547dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   }
555160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt
5563b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
5573b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Return a string representing this expression's operator.
5583b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
5593b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   const char *operator_string();
5603b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
5613b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
5623b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Do a reverse-lookup to translate the given string into an operator.
5633b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
5643b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   static ir_expression_operation get_operator(const char *);
5653b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
56678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
56778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
56878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
56978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
57078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
5718895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
5728895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
573cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_expression *clone();
574cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
576fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *operands[2];
577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
580ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
581ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
582ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
583fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue {
584ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
585471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call(const ir_function_signature *callee, exec_list *actual_parameters)
586b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(callee)
587ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
5889e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
5899e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      type = callee->return_type;
590471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
591ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
592ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
593cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_call *as_call()
594cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
595cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
596cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
597cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
598ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
599ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
600ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
601ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
602ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
6038895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
6048895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
605ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
606ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
607ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
608ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   static ir_call *get_error_instruction();
609ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
6109878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   /**
6119878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
6129878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
6139878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
6149878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
6159878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
6169878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
6179878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
61893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
61993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
62093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
62193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
62293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
6230f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick      return callee->function_name();
62493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
62593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
626cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   const ir_function_signature *get_callee()
627cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
628cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return callee;
629cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
630cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
631cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   /**
632cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * Generates an inline version of the function before @ir,
633cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * returning the return value of the function.
634cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    */
635cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_rvalue *generate_inline(ir_instruction *ir);
636cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
637ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
638471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
639b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(NULL)
640471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
641471471f83471481db0445e73f8c89e6a9149838eIan Romanick      /* empty */
642471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
643471471f83471481db0445e73f8c89e6a9149838eIan Romanick
644471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *callee;
645f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt
646f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /* List of ir_rvalue of paramaters passed in this call. */
647ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   exec_list actual_parameters;
648ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
649ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
650ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
6519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
6529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
6539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
6549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
6559578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
6569578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
6579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
6589578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
6599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
6609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6619578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
6629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6639578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
6649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
6659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
6669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
6679578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
6689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
6699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
6719578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6729578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
673fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
6749578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
6759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6769578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
6779578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6789578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
679cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_return *as_return()
680cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
681cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
682cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
683cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
684fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
6859578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6869578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
6879578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6889578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
6899578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
6909578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6919578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
6929578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6939578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
6948895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
6958895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
696fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
6979578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
698f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
699f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
700f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/**
701f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops
702f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
703f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue.  The \c break within a loop is
704f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement.
705f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
706f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump
707f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */
708f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump {
709f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic:
710f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode {
711f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_break,
712f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_continue
713f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   };
714f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
715f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   ir_loop_jump(ir_loop *loop, jump_mode mode)
716f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      : loop(loop), mode(mode)
717f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
718f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      /* empty */
719f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
720f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
721f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   virtual void accept(ir_visitor *v)
722f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
723f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      v->visit(this);
724f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
725f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
7268895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
7278895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
728f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_break() const
729f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
730f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_break;
731f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
732f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
733f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_continue() const
734f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
735f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_continue;
736f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
737f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
738f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickprivate:
739f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Loop containing this break instruction. */
740f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   ir_loop *loop;
741f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
742f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Mode selector for the jump instruction. */
743f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode mode;
744f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick};
7459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
7469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
7479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
74881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
74981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture
75081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
75181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode {
75281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_tex,		/* Regular texture look-up */
75381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txb,		/* Texture look-up with LOD bias */
75481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txl,		/* Texture look-up with explicit LOD */
75581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txd,		/* Texture look-up with partial derivatvies */
75681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txf		/* Texel fetch with explicit LOD */
75781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
75881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
75981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
76081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
76181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture
76281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
76381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value
76481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes.  In the printed IR, these will
76581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as:
76681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
76781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              Texel offset
76881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       Projection divisor
76981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       |   Shadow comparitor
77081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       |   |
77181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              v       v   v
77281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (tex (sampler) (coordinate) (0 0 0) (1) ( ))
77381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias))
77481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod))
77581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy))
77681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txf (sampler) (coordinate) (0 0 0)         (lod))
77781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
77881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue {
77981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic:
78081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_texture(enum ir_texture_opcode op)
781b97efa5db5fce2e0d9a4c61a939c85b240c89170Kenneth Graunke      : op(op), projector(NULL), shadow_comparitor(NULL)
78281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   {
78381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      /* empty */
78481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   }
78581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
78626d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual void accept(ir_visitor *v)
78726d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   {
78826d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke      v->visit(this);
78926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   }
79026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
79126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
79226d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
793c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
794c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Return a string representing the ir_texture_opcode.
795c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
796c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   const char *opcode_string();
797c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
79856d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke   /** Set the sampler and infer the type. */
79956d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke   void set_sampler(ir_dereference *sampler);
80056d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke
801c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
802c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Do a reverse-lookup to translate a string into an ir_texture_opcode.
803c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
804c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   static ir_texture_opcode get_opcode(const char *);
805c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
80681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   enum ir_texture_opcode op;
80781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
80881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Sampler to use for the texture access. */
80981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_dereference *sampler;
81081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
81181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Texture coordinate to sample */
81281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *coordinate;
81381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
81481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
81581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Value used for projective divide.
81681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
81781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no projective divide (the common case), this will be
81881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c NULL.  Optimization passes should check for this to point to a constant
81981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * of 1.0 and replace that with \c NULL.
82081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
82181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *projector;
82281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
82381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
82481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Coordinate used for comparison on shadow look-ups.
82581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
82681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no shadow comparison, this will be \c NULL.  For the
82781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c ir_txf opcode, this *must* be \c NULL.
82881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
82981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *shadow_comparitor;
83081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
83181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Explicit texel offsets. */
83281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   signed char offsets[3];
83381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
83481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   union {
83581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *lod;		/**< Floating point LOD */
83681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *bias;		/**< Floating point LOD bias */
83781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      struct {
83881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdx;	/**< Partial derivative of coordinate wrt X */
83981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdy;	/**< Partial derivative of coordinate wrt Y */
84081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      } grad;
84181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   } lod_info;
84281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
84381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
84481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
845a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
846a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
847a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
848a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
849a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
850a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
851a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
852a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
853a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
854f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
855a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
856a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
857a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
858a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
859a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
860a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
861a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
862a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
863a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
864affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
865affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
866affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
867affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
868affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
86905a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt   ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
870cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
8717d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual ir_swizzle *as_swizzle()
8727d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   {
8737d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt      return this;
8747d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   }
8757d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt
876cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_swizzle *clone()
877cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
878cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return new ir_swizzle(this->val, this->mask);
879cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
880cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
881affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
882affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
883affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
884affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
885affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
886affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
887affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
888affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
889affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
890affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
8918895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
8928895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
893affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   bool is_lvalue()
894affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
895a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
896affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
897affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
8982b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
8992b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
9002b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
9012b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   virtual ir_variable *variable_referenced();
9022b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
903affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
904affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
905affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
906affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
907affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
908fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
909a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
91044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
91144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
91244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
91344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
91444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
915c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt   bool is_lvalue();
916fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
9172b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
9182b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
9192b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
92070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced() = 0;
92170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
92270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
92370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
92470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference {
92570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
92670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_variable(ir_variable *var);
92770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
92870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
92970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
93070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
93170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
93270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
93336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->var;
93470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
935f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
936b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
937b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
938b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      /* ir_dereference_variable objects always dereference the entire
939b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * variable.  However, if this dereference is dereferenced by anything
940b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * else, the complete deferefernce chain is not a whole-variable
941b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * dereference.  This method should only be called on the top most
942b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * ir_rvalue in a dereference chain.
943b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       */
944b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return this->var;
945b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
946b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
947c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
948c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
949c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
950c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
951c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
952f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
95336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
95436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   /**
95536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    * Object being dereferenced.
95636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    */
95736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_variable *var;
95870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
95970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
96070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
96170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference {
96270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
96370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
96470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
96570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
96670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
967b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual ir_dereference_array *as_dereference_array()
968b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   {
969b145e903694fa932ab1e0d955e889555193ab604Eric Anholt      return this;
970b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   }
971b145e903694fa932ab1e0d955e889555193ab604Eric Anholt
97270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
97370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
97470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
97570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
97670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
97736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->array->variable_referenced();
97870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
97970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
980c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
981c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
982c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
983c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
984c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
985f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
98670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
98736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array;
98836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array_index;
98936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
99070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate:
99170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   void set_array(ir_rvalue *value);
99270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
99370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
99470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
99570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference {
99670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
99770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_rvalue *value, const char *field);
99870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
99970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_variable *var, const char *field);
100070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
100170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
100270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
100370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
100470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
100570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
100636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->record->variable_referenced();
100770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1008f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1009c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1010c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1011c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1012c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1013c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1014f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
101536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
101636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *record;
101736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   const char *field;
1018a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1019a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1020a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1021fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
1022a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
1023a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_constant(const struct glsl_type *type, const void *data);
10243c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
10253c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
10263c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
10273c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
1028a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1029989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   /**
1030756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    * Construct an ir_constant from a list of ir_constant values
1031756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    */
1032756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   ir_constant(const struct glsl_type *type, exec_list *values);
1033756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick
1034756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   /**
1035989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * Construct an ir_constant from a scalar component of another ir_constant
1036989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1037989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * The new \c ir_constant inherits the type of the component from the
1038989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * source constant.
1039989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1040989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * \note
1041989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * In the case of a matrix constant, the new constant is a scalar, \b not
1042989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * a vector.
1043989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    */
1044989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   ir_constant(const ir_constant *c, unsigned i);
1045989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick
10465c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual ir_constant *as_constant()
10475c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   {
10485c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt      return this;
10495c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   }
10505c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt
105178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
105278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
105378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
105478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
105578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
10568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
10578895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1058cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_constant *clone()
1059cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
1060cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return new ir_constant(this->type, &this->value);
1061cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
1062cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
1063a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
106431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * Get a particular component of a constant as a specific type
106531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    *
106631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * This is useful, for example, to get a value from an integer constant
106731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * as a float or bool.  This appears frequently when constructors are
106831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * called with all constant parameters.
106931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    */
107031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@{*/
107131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   bool get_bool_component(unsigned i) const;
107231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   float get_float_component(unsigned i) const;
107331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   int get_int_component(unsigned i) const;
107431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   unsigned get_uint_component(unsigned i) const;
107531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@}*/
107631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick
107731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /**
1078a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
1079a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1080a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
1081a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
1082a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
1083a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1084a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
1085a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned u[16];
1086a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int i[16];
1087a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      float f[16];
1088a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      bool b[16];
1089a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } value;
10907f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick
10917f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick   exec_list components;
1092a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1093a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
109470b74928a220aff024664714877defb0caedf33fEric Anholtvoid
109570b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor);
1096adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
1097adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
1098adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
1099adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
1100e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
1101c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
1102c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions,
1103c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt				struct _mesa_glsl_parse_state *state);
1104c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
1105e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
1106