ir.h revision 8a1f186cc55979bb9df0a88b48da8d81460c3e7c
1986b8f798272d3ae2898617c8fb089156a5941c0Ian Romanick/* -*- c++ -*- */
2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*
3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation
4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"),
7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation
8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions:
11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next
13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the
14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software.
15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE.
23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
25e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#pragma once
26e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#ifndef IR_H
27e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#define IR_H
28e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
29ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt#include <cstdio>
30ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt#include <cstdlib>
31ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt
32f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worthextern "C" {
33f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worth#include <talloc.h>
34f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worth}
35f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worth
360044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h"
3778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h"
388895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick#include "ir_hierarchical_visitor.h"
390044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick
40829e0a8eff0e657c85fa7fc53a4b456375b434ccEric Anholt#ifndef ARRAY_SIZE
41829e0a8eff0e657c85fa7fc53a4b456375b434ccEric Anholt#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
42829e0a8eff0e657c85fa7fc53a4b456375b434ccEric Anholt#endif
43829e0a8eff0e657c85fa7fc53a4b456375b434ccEric Anholt
44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_program {
45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   void *bong_hits;
46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions
50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
510044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node {
52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
53a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
551cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick   class ir_constant *constant_expression_value();
56e46a454305af64710ce8deadafc718f75363ac7eEric Anholt
57e46a454305af64710ce8deadafc718f75363ac7eEric Anholt   /** ir_print_visitor helper for debugging. */
584b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   void print(void) const;
59e46a454305af64710ce8deadafc718f75363ac7eEric Anholt
6078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *) = 0;
618895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
624b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *ht) const = 0;
6378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
6444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /**
6544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \name IR instruction downcast functions
6644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    *
6744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * These functions either cast the object to a derived class or return
6844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \c NULL if the object's type does not match the specified derived class.
6944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * Additional downcast functions will be added as needed.
7044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    */
7144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@{*/
7244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_variable *          as_variable()         { return NULL; }
736202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual class ir_function *          as_function()         { return NULL; }
7444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_dereference *       as_dereference()      { return NULL; }
75b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual class ir_dereference_array *	as_dereference_array() { return NULL; }
76d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual class ir_dereference_variable *as_dereference_variable() { return NULL; }
77fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual class ir_rvalue *            as_rvalue()           { return NULL; }
7801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual class ir_loop *              as_loop()             { return NULL; }
79cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_assignment *        as_assignment()       { return NULL; }
80cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_call *              as_call()             { return NULL; }
81cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_return *            as_return()           { return NULL; }
825ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual class ir_if *                as_if()               { return NULL; }
837d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual class ir_swizzle *           as_swizzle()          { return NULL; }
845c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual class ir_constant *          as_constant()         { return NULL; }
8544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@}*/
8644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
8844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   ir_instruction()
89d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
90d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick      /* empty */
91d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
95fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction {
96fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic:
97fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue * as_rvalue()
98fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
99fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return this;
100fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
101fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
102fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual bool is_lvalue()
103fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
104fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return false;
105fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
106fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
1072b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
1082b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
1092b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
1102b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   virtual ir_variable *variable_referenced()
1112b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   {
1122b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick      return NULL;
1132b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   }
1142b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
115b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
116b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   /**
117b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * If an r-value is a reference to a whole variable, get that variable
118b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    *
119b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * \return
120b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * Pointer to a variable that is completely dereferenced by the r-value.  If
121b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * the r-value is not a dereference or the dereference does not access the
122b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * entire variable (i.e., it's just one array element, struct field), \c NULL
123b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * is returned.
124b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    */
125b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
126b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
127b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return NULL;
128b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
129b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
130fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected:
131b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   ir_rvalue()
132b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   {
133b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      /* empty */
134b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   }
135fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke};
136fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
137fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_auto = 0,
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_uniform,
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_inout
144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
146a22426dc4c934673e8f0af5c70a67505a4de7aadCarl Worthenum ir_variable_interpolation {
147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
152fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_variable(const struct glsl_type *, const char *);
156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1574b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *ht) const;
1584b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
15944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_variable *as_variable()
16044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
16144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
16244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
16344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
16478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
16578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
16678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
16778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
16878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
1698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1708895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1712d394d4877794d19756c3760d711524dca89f772Ian Romanick
172950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   /**
173950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * Get the string value for the interpolation qualifier
174950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    *
175950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * \return
176950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * If none of \c shader_in or \c shader_out is set, an empty string will
177950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * be returned.  Otherwise the string that would be used in a shader to
178950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * specify \c mode will be returned.
179950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    */
180950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   const char *interpolation_string() const;
181950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick
1828b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick   /**
1838b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * Calculate the number of slots required to hold this variable
1848b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    *
1858b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * This is used to determine how many uniform or varying locations a variable
1868b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * occupies.  The count is in units of floating point components.
1878b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    */
1888b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick   unsigned component_slots() const;
1898b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick
190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
192b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   /**
193b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Highest element accessed with a constant expression array index
194b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    *
195b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Not used for non-array variables.
196b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    */
197b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   unsigned max_array_access;
198b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
20271df19f5ef6e78beb5160801f81468184b75447eEric Anholt   /** If the variable is initialized outside of the scope of the shader */
20371df19f5ef6e78beb5160801f81468184b75447eEric Anholt   unsigned shader_in:1;
20471df19f5ef6e78beb5160801f81468184b75447eEric Anholt   /**
20571df19f5ef6e78beb5160801f81468184b75447eEric Anholt    * If the variable value is later used outside of the scope of the shader.
20671df19f5ef6e78beb5160801f81468184b75447eEric Anholt    */
20771df19f5ef6e78beb5160801f81468184b75447eEric Anholt   unsigned shader_out:1;
208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
2119d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick
2129d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   /**
2139d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * Flag that the whole array is assignable
2149d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    *
2159d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * In GLSL 1.20 and later whole arrays are assignable (and comparable for
2169d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * equality).  This flag enables this behavior.
2179d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    */
2189d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   unsigned array_lvalue:1;
219326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt
220326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   /**
22169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * Storage location of the base of this variable
22269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
22369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * The precise meaning of this field depends on the nature of the variable.
22469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
22569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader input: one of the values from \c gl_vert_attrib.
22669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader output: one of the values from \c gl_vert_result.
22769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader input: one of the values from \c gl_frag_attrib.
22869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader output: one of the values from \c gl_frag_result.
22969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Uniforms: Per-stage uniform slot number.
23069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Other: This field is not currently used.
23169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
23269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * If the variable is a uniform, shader input, or shader output, and the
23369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * slot has not been assigned, the value will be -1.
23469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    */
23569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   int location;
23669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick
23769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   /**
238c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    * Emit a warning if this variable is accessed.
239c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    */
240c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   const char *warn_extension;
241c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick
242c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   /**
243326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    * Value assigned in the initializer of a variable declared "const"
244326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    */
245326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   ir_constant *constant_value;
246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
2509fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/**
2519fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or
2529fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype.
2539fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */
254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
255894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /* An ir_function_signature will be part of the list of signatures in
256894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    * an ir_function.
257894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    */
258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
259e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2614b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *ht) const;
2624b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
26378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
26478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
26578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
26678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
26778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2688895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
2710f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    * Get the name of the function for which this is a signature
2720f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    */
2730f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   const char *function_name() const;
2740f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
2750f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   /**
276abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * Check whether the qualifiers match between this signature's parameters
277abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * and the supplied parameter list.  If not, returns the name of the first
278abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * parameter with mismatched qualifiers (for use in error messages).
279abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    */
280abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   const char *qualifiers_match(exec_list *params);
281abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke
282abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   /**
283bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * Replace the current parameter list with the given one.  This is useful
284bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * if the current information came from a prototype, and either has invalid
285bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * or missing parameter names.
286bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    */
287bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   void replace_parameters(exec_list *new_params);
288bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke
289bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   /**
290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
297f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_variable of function parameters.
298f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    *
299f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * This represents the storage.  The paramaters passed in a particular
300f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * call will be in ir_call::actual_paramaters.
301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
3020044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3049fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   /** Whether or not this function has a body (which may be empty). */
3059fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   unsigned is_defined:1;
3066a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
307894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /** Body of instructions in the function. */
308894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   struct exec_list body;
309894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt
3106a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate:
3116a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   /** Function of which this signature is one overload. */
3126a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   class ir_function *function;
3136a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
3146a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   friend class ir_function;
315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
3199fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name.
3209fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the
3219fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions.
322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
325882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3274b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *ht) const;
3284b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
3296202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual ir_function *as_function()
3306202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   {
3316202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke      return this;
3326202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   }
3336202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke
33478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
33578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
33678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
33778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
33878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
3398895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
3408895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3416a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   void add_signature(ir_function_signature *sig)
3426a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   {
3436a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      sig->function = this;
3446a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      signatures.push_tail(sig);
3456a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   }
3466a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
34895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    * Get an iterator for the set of function signatures
34995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    */
35095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   exec_list_iterator iterator()
35195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   {
35295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick      return signatures.iterator();
35395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   }
35495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick
35595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   /**
3560d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that matches a set of actual parameters, taking implicit
3570d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * conversions into account.
358471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
359471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *matching_signature(exec_list *actual_param);
360471471f83471481db0445e73f8c89e6a9149838eIan Romanick
361471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
3620d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that exactly matches a set of actual parameters without
3630d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * any implicit type conversions.
3640d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    */
3650d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   ir_function_signature *exact_matching_signature(exec_list *actual_ps);
3660d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke
3670d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   /**
368a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
369a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
370a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
371a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
372a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate:
373471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
374f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_function_signature for each overloaded function with this name.
375471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
3760044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
377a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
3780f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
3790f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const
3800f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{
3810f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   return function->name;
3820f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick}
383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3863c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/**
3873c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements
3883c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */
3893c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction {
3903c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic:
3913c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if(ir_rvalue *condition)
3923c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      : condition(condition)
3933c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
3943c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      /* empty */
3953c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
3963c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3974b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *ht) const;
3984b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
3995ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual ir_if *as_if()
4005ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   {
4015ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt      return this;
4025ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   }
4035ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt
4043c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void accept(ir_visitor *v)
4053c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
4063c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      v->visit(this);
4073c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
4083c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
4098895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4108895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
4113c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *condition;
412f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the then branch */
4133c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  then_instructions;
414f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the else branch */
4153c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  else_instructions;
4163c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick};
4173c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
4183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
419fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/**
420fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure.
421fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */
422fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction {
423fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic:
424fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL)
425fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
426fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      /* empty */
427fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
428fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
4294b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *ht) const;
4304b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
431fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   virtual void accept(ir_visitor *v)
432fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
433fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      v->visit(this);
434fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
435fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
4368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4378895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
43801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual ir_loop *as_loop()
43901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   {
44001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick      return this;
44101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   }
44201f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick
443fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
444fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * Get an iterator for the instructions of the loop body
445fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
446fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list_iterator iterator()
447fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
448fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      return body_instructions.iterator();
449fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
450fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
451f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction that make up the body of the loop. */
452fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list body_instructions;
453fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
454fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
455fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * \name Loop counter and controls
456fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
457fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@{*/
458fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *from;
459fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *to;
460fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *increment;
461fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_variable *counter;
462fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@}*/
463fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick};
464fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
465fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
466fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue {
467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
468fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4704b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *ht) const;
4714b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
47278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
47378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
47478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
47578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
47678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
4778895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
479cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_assignment * as_assignment()
480cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
481cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
482cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
483cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
487fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *lhs;
488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
492fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
497fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5003b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when
501160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list.
5023b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */
503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
508a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke   ir_unop_sign,
509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
51144d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_exp,
513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_log,
51401665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
51501665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
518dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_f2b,      /**< Float-to-boolean conversion */
519dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_b2f,      /**< Boolean-to-float conversion */
520c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_i2b,      /**< int-to-boolean conversion */
521c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_b2i,      /**< Boolean-to-int conversion */
5226c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
531d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt   ir_unop_fract,
532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
53457e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /**
53557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    * \name Trigonometric operations.
53657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    */
53757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@{*/
53857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_sin,
53957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_cos,
54057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@}*/
54157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke
542b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /**
543b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    * \name Partial derivatives.
544b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    */
545b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@{*/
546b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdx,
547b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdy,
548b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@}*/
549b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke
550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
5548a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt
5558a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt   /**
5568a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Takes one of two combinations of arguments:
5578a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
5588a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, vecN)
5598a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, float)
5608a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
5618a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Does not take integer types.
5628a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    */
563a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
565a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
566a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
567a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
568a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
573a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
576a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
581a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
594a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
599fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
600a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
601a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
602fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
6044b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *ht) const;
6054b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
6067dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   static unsigned int get_num_operands(ir_expression_operation);
6074b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   unsigned int get_num_operands() const
6087dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   {
6097dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke      return get_num_operands(operation);
6107dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   }
611160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt
6123b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
6133b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Return a string representing this expression's operator.
6143b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
6153b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   const char *operator_string();
6163b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
6173b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
6183b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Do a reverse-lookup to translate the given string into an operator.
6193b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
6203b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   static ir_expression_operation get_operator(const char *);
6213b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
62278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
62378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
62478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
62578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
62678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
6278895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
6288895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
630fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *operands[2];
631a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
634ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
635ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
636ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
637fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue {
638ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
639471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call(const ir_function_signature *callee, exec_list *actual_parameters)
640b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(callee)
641ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
6429e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
6439e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      type = callee->return_type;
644471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
645ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
646ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
6474b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *ht) const;
6484b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
649cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_call *as_call()
650cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
651cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
652cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
653cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
654ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
655ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
656ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
657ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
658ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
6598895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
6608895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
661ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
662ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
663e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth    *
664e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth    * Any allocation will be performed with 'ctx' as talloc owner.
665ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
666e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth   static ir_call *get_error_instruction(void *ctx);
667ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
6689878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   /**
6699878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
6709878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
6719878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
6729878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
6739878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
6749878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
6759878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
67693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
67793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
67893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
67993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
68093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
6810f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick      return callee->function_name();
68293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
68393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
684cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   const ir_function_signature *get_callee()
685cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
686cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return callee;
687cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
688cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
689cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   /**
690cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * Generates an inline version of the function before @ir,
691cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * returning the return value of the function.
692cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    */
693cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_rvalue *generate_inline(ir_instruction *ir);
694cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
695ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
696471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
697b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(NULL)
698471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
699471471f83471481db0445e73f8c89e6a9149838eIan Romanick      /* empty */
700471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
701471471f83471481db0445e73f8c89e6a9149838eIan Romanick
702471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *callee;
703f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt
704f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /* List of ir_rvalue of paramaters passed in this call. */
705ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   exec_list actual_parameters;
706ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
707ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
708ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
7099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
7109578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
7119578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
7129578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
7139578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
7149578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
7159578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
7169578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
7179578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
7189578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
7199578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
7209578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
7219578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
7229578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
7239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
7249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
7259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
7269578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
7279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
7289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
7299578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
7309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
731fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
7329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
7339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
7349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
7359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
7369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
7374b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *) const;
7384b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
739cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_return *as_return()
740cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
741cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
742cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
743cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
744fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
7459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
7469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
7479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
7489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
7499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
7509578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
7519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
7529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
7539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
7548895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
7558895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
756fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
7579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
758f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
759f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
760f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/**
761f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops
762f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
763f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue.  The \c break within a loop is
764f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement.
765f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
766f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump
767f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */
768f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump {
769f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic:
770f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode {
771f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_break,
772f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_continue
773f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   };
774f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
7754b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   ir_loop_jump(jump_mode mode)
776f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
7770c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt      this->mode = mode;
7780c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt      this->loop = loop;
779f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
780f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
7814b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *) const;
7824b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
783f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   virtual void accept(ir_visitor *v)
784f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
785f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      v->visit(this);
786f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
787f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
7888895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
7898895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
790f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_break() const
791f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
792f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_break;
793f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
794f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
795f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_continue() const
796f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
797f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_continue;
798f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
799f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
800f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Mode selector for the jump instruction. */
801f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode mode;
8020c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholtprivate:
8030c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt   /** Loop containing this break instruction. */
8040c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt   ir_loop *loop;
805f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick};
80616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
80716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke/**
80816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke * IR instruction representing discard statements.
80916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke */
81016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeclass ir_discard : public ir_jump {
81116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkepublic:
81216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard()
81316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
81416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = NULL;
81516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
81616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
81716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard(ir_rvalue *cond)
81816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
81916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = cond;
82016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
82116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
82216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual ir_instruction *clone(struct hash_table *ht) const;
82316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
82416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual void accept(ir_visitor *v)
82516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
82616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      v->visit(this);
82716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
82816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
82916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
83016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
83116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_rvalue *condition;
83216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke};
8339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
8349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
8359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
83681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
83781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture
83881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
83981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode {
84081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_tex,		/* Regular texture look-up */
84181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txb,		/* Texture look-up with LOD bias */
84281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txl,		/* Texture look-up with explicit LOD */
84381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txd,		/* Texture look-up with partial derivatvies */
84481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txf		/* Texel fetch with explicit LOD */
84581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
84681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
84781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
84881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
84981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture
85081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
85181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value
85281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes.  In the printed IR, these will
85381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as:
85481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
85581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              Texel offset
85681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       Projection divisor
85781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       |   Shadow comparitor
85881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       |   |
85981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              v       v   v
86081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (tex (sampler) (coordinate) (0 0 0) (1) ( ))
86181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias))
86281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod))
86381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy))
86481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txf (sampler) (coordinate) (0 0 0)         (lod))
86581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
86681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue {
86781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic:
86881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_texture(enum ir_texture_opcode op)
869b97efa5db5fce2e0d9a4c61a939c85b240c89170Kenneth Graunke      : op(op), projector(NULL), shadow_comparitor(NULL)
87081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   {
87181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      /* empty */
87281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   }
87381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
8744b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *) const;
8754b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
87626d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual void accept(ir_visitor *v)
87726d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   {
87826d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke      v->visit(this);
87926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   }
88026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
88126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
88226d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
883c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
884c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Return a string representing the ir_texture_opcode.
885c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
886c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   const char *opcode_string();
887c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
88856d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke   /** Set the sampler and infer the type. */
88956d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke   void set_sampler(ir_dereference *sampler);
89056d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke
891c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
892c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Do a reverse-lookup to translate a string into an ir_texture_opcode.
893c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
894c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   static ir_texture_opcode get_opcode(const char *);
895c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
89681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   enum ir_texture_opcode op;
89781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
89881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Sampler to use for the texture access. */
89981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_dereference *sampler;
90081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
90181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Texture coordinate to sample */
90281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *coordinate;
90381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
90481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
90581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Value used for projective divide.
90681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
90781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no projective divide (the common case), this will be
90881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c NULL.  Optimization passes should check for this to point to a constant
90981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * of 1.0 and replace that with \c NULL.
91081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
91181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *projector;
91281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
91381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
91481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Coordinate used for comparison on shadow look-ups.
91581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
91681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no shadow comparison, this will be \c NULL.  For the
91781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c ir_txf opcode, this *must* be \c NULL.
91881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
91981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *shadow_comparitor;
92081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
92181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Explicit texel offsets. */
92281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   signed char offsets[3];
92381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
92481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   union {
92581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *lod;		/**< Floating point LOD */
92681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *bias;		/**< Floating point LOD bias */
92781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      struct {
92881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdx;	/**< Partial derivative of coordinate wrt X */
92981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdy;	/**< Partial derivative of coordinate wrt Y */
93081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      } grad;
93181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   } lod_info;
93281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
93381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
93481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
935a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
936a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
937a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
938a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
939a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
940a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
941a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
942a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
943a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
944f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
945a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
946a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
947a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
948a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
949a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
950a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
951a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
952a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
953a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
954affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
955affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
956affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
957affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
958affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
9596315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
9606315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count);
9616315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
96205a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt   ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
963cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
9644b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *) const;
9654b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
9667d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual ir_swizzle *as_swizzle()
9677d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   {
9687d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt      return this;
9697d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   }
9707d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt
971affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
972affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
973affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
974affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
975affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
976affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
977affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
978affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
979affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
980affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
9818895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
9828895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
983affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   bool is_lvalue()
984affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
985a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
986affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
987affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
9882b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
9892b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
9902b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
9912b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   virtual ir_variable *variable_referenced();
9922b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
993affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
994affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
9956315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
9966315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanickprivate:
9976315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   /**
9986315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * Initialize the mask component of a swizzle
9996315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    *
10006315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * This is used by the \c ir_swizzle constructors.
10016315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    */
10026315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   void init_mask(const unsigned *components, unsigned count);
1003affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
1004affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1005affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1006fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
1007a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
100844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
100944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
101044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
101144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
101244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
1013c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt   bool is_lvalue();
1014fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
10152b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
10162b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
10172b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
101870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced() = 0;
101970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
102070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
102170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
102270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference {
102370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
102470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_variable(ir_variable *var);
102570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
10264b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *) const;
10274b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1028d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual ir_dereference_variable *as_dereference_variable()
1029d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   {
1030d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt      return this;
1031d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   }
1032d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt
103370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
103470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
103570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
103670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
103770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
103836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->var;
103970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1040f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1041b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
1042b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
1043b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      /* ir_dereference_variable objects always dereference the entire
1044b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * variable.  However, if this dereference is dereferenced by anything
1045b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * else, the complete deferefernce chain is not a whole-variable
1046b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * dereference.  This method should only be called on the top most
1047b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * ir_rvalue in a dereference chain.
1048b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       */
1049b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return this->var;
1050b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
1051b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
1052c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1053c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1054c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1055c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1056c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1057f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
105836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
105936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   /**
106036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    * Object being dereferenced.
106136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    */
106236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_variable *var;
106370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
106470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
106570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
106670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference {
106770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
106870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
106970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
107070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
107170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
10724b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *) const;
10734b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1074b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual ir_dereference_array *as_dereference_array()
1075b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   {
1076b145e903694fa932ab1e0d955e889555193ab604Eric Anholt      return this;
1077b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   }
1078b145e903694fa932ab1e0d955e889555193ab604Eric Anholt
107970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
108070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
108170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
108270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
108370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
108436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->array->variable_referenced();
108570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
108670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
1087c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1088c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1089c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1090c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1091c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1092f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
109370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
109436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array;
109536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array_index;
109636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
109770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate:
109870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   void set_array(ir_rvalue *value);
109970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
110070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
110170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
110270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference {
110370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
110470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_rvalue *value, const char *field);
110570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
110670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_variable *var, const char *field);
110770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
11084b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *) const;
11094b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
111070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
111170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
111270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
111370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
111470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
111536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->record->variable_referenced();
111670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1117f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1118c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1119c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1120c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1121c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1122c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1123f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
112436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
112536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *record;
112636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   const char *field;
1127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1130be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/**
1131be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick * Data stored in an ir_constant
1132be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick */
1133be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanickunion ir_constant_data {
1134be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      unsigned u[16];
1135be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      int i[16];
1136be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      float f[16];
1137be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      bool b[16];
1138be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick};
1139be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1140be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1141fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
1142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
1143824b659d917a5f14a1f66b891d25036ef9f9adc6Ian Romanick   ir_constant(const struct glsl_type *type, const ir_constant_data *data);
11443c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
11453c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
11463c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
11473c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
1148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1149989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   /**
1150756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    * Construct an ir_constant from a list of ir_constant values
1151756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    */
1152756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   ir_constant(const struct glsl_type *type, exec_list *values);
1153756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick
1154756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   /**
1155989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * Construct an ir_constant from a scalar component of another ir_constant
1156989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1157989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * The new \c ir_constant inherits the type of the component from the
1158989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * source constant.
1159989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1160989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * \note
1161989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * In the case of a matrix constant, the new constant is a scalar, \b not
1162989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * a vector.
1163989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    */
1164989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   ir_constant(const ir_constant *c, unsigned i);
1165989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick
11664b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *) const;
11674b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
11685c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual ir_constant *as_constant()
11695c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   {
11705c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt      return this;
11715c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   }
11725c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt
117378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
117478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
117578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
117678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
117778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
11788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
11798895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
118131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * Get a particular component of a constant as a specific type
118231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    *
118331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * This is useful, for example, to get a value from an integer constant
118431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * as a float or bool.  This appears frequently when constructors are
118531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * called with all constant parameters.
118631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    */
118731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@{*/
118831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   bool get_bool_component(unsigned i) const;
118931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   float get_float_component(unsigned i) const;
119031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   int get_int_component(unsigned i) const;
119131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   unsigned get_uint_component(unsigned i) const;
119231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@}*/
119331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick
1194b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick   ir_constant *get_record_field(const char *name);
1195b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick
119631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /**
11971e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    * Determine whether a constant has the same value as another constant
11981e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    */
11991e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick   bool has_value(const ir_constant *) const;
12001e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick
12011e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick   /**
1202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
1203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
1205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
1206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
1207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1208be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick   union ir_constant_data value;
12097f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick
12107f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick   exec_list components;
1211710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick
1212710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanickprivate:
1213710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   /**
1214710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    * Parameterless constructor only used by the clone method
1215710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    */
1216710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   ir_constant(void);
1217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
121970b74928a220aff024664714877defb0caedf33fEric Anholtvoid
122070b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor);
1221adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
122253cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholtvoid validate_ir_tree(exec_list *instructions);
122353cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholt
1224adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
1225adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
1226adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
1227e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
1228c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
1229c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions,
1230c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt				struct _mesa_glsl_parse_state *state);
1231c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
1232e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
1233