ir.h revision 1f47245bdda2c85bf0f0174e6c24a50486b413aa
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 Romanick/**
45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions
46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
470044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node {
48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
511cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick   class ir_constant *constant_expression_value();
52e46a454305af64710ce8deadafc718f75363ac7eEric Anholt
53e46a454305af64710ce8deadafc718f75363ac7eEric Anholt   /** ir_print_visitor helper for debugging. */
544b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   void print(void) const;
55e46a454305af64710ce8deadafc718f75363ac7eEric Anholt
5678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *) = 0;
578895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
584b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   virtual ir_instruction *clone(struct hash_table *ht) const = 0;
5978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
6044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /**
6144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \name IR instruction downcast functions
6244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    *
6344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * These functions either cast the object to a derived class or return
6444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \c NULL if the object's type does not match the specified derived class.
6544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * Additional downcast functions will be added as needed.
6644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    */
6744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@{*/
6844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_variable *          as_variable()         { return NULL; }
696202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual class ir_function *          as_function()         { return NULL; }
7044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_dereference *       as_dereference()      { return NULL; }
71b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual class ir_dereference_array *	as_dereference_array() { return NULL; }
72d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual class ir_dereference_variable *as_dereference_variable() { return NULL; }
736d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   virtual class ir_expression *        as_expression()       { return NULL; }
74fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual class ir_rvalue *            as_rvalue()           { return NULL; }
7501f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual class ir_loop *              as_loop()             { return NULL; }
76cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_assignment *        as_assignment()       { return NULL; }
77cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_call *              as_call()             { return NULL; }
78cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_return *            as_return()           { return NULL; }
795ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual class ir_if *                as_if()               { return NULL; }
807d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual class ir_swizzle *           as_swizzle()          { return NULL; }
815c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual class ir_constant *          as_constant()         { return NULL; }
8244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@}*/
8344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
8544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   ir_instruction()
86d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
87d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick      /* empty */
88d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
92fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction {
93fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic:
94ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_rvalue *clone(struct hash_table *) const = 0;
95ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick
96fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue * as_rvalue()
97fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
98fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return this;
99fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
100fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
101fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual bool is_lvalue()
102fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
103fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return false;
104fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
105fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
1062b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
1072b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
1082b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
1092b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   virtual ir_variable *variable_referenced()
1102b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   {
1112b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick      return NULL;
1122b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   }
1132b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
114b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
115b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   /**
116b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * If an r-value is a reference to a whole variable, get that variable
117b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    *
118b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * \return
119b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * Pointer to a variable that is completely dereferenced by the r-value.  If
120b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * the r-value is not a dereference or the dereference does not access the
121b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * entire variable (i.e., it's just one array element, struct field), \c NULL
122b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * is returned.
123b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    */
124b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
125b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
126b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return NULL;
127b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
128b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
129fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected:
130b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   ir_rvalue()
131b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   {
132b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      /* empty */
133b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   }
134fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke};
135fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
136fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_auto = 0,
139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_uniform,
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_inout
143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
145a22426dc4c934673e8f0af5c70a67505a4de7aadCarl Worthenum ir_variable_interpolation {
146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
151fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_variable(const struct glsl_type *, const char *);
155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
156ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_variable *clone(struct hash_table *ht) const;
1574b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
15844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_variable *as_variable()
15944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
16044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
16144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
16244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
16378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
16478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
16578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
16678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
16778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
1688895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1702d394d4877794d19756c3760d711524dca89f772Ian Romanick
171950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   /**
172950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * Get the string value for the interpolation qualifier
173950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    *
174950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * \return
175950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * If none of \c shader_in or \c shader_out is set, an empty string will
176950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * be returned.  Otherwise the string that would be used in a shader to
177950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * specify \c mode will be returned.
178950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    */
179950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   const char *interpolation_string() const;
180950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick
1818b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick   /**
1828b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * Calculate the number of slots required to hold this variable
1838b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    *
1848b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * This is used to determine how many uniform or varying locations a variable
1858b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * occupies.  The count is in units of floating point components.
1868b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    */
1878b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick   unsigned component_slots() const;
1888b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick
189a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
191b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   /**
192b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Highest element accessed with a constant expression array index
193b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    *
194b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Not used for non-array variables.
195b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    */
196b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   unsigned max_array_access;
197b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
20171df19f5ef6e78beb5160801f81468184b75447eEric Anholt   /** If the variable is initialized outside of the scope of the shader */
20271df19f5ef6e78beb5160801f81468184b75447eEric Anholt   unsigned shader_in:1;
20371df19f5ef6e78beb5160801f81468184b75447eEric Anholt   /**
20471df19f5ef6e78beb5160801f81468184b75447eEric Anholt    * If the variable value is later used outside of the scope of the shader.
20571df19f5ef6e78beb5160801f81468184b75447eEric Anholt    */
20671df19f5ef6e78beb5160801f81468184b75447eEric Anholt   unsigned shader_out:1;
207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
2109d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick
2119d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   /**
2129d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * Flag that the whole array is assignable
2139d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    *
2149d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * In GLSL 1.20 and later whole arrays are assignable (and comparable for
2159d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * equality).  This flag enables this behavior.
2169d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    */
2179d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   unsigned array_lvalue:1;
218326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt
219326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   /**
22069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * Storage location of the base of this variable
22169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
22269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * The precise meaning of this field depends on the nature of the variable.
22369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
22469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader input: one of the values from \c gl_vert_attrib.
22569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader output: one of the values from \c gl_vert_result.
22669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader input: one of the values from \c gl_frag_attrib.
22769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader output: one of the values from \c gl_frag_result.
22869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Uniforms: Per-stage uniform slot number.
22969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Other: This field is not currently used.
23069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
23169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * If the variable is a uniform, shader input, or shader output, and the
23269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * slot has not been assigned, the value will be -1.
23369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    */
23469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   int location;
23569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick
23669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   /**
237c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    * Emit a warning if this variable is accessed.
238c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    */
239c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   const char *warn_extension;
240c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick
241c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   /**
242326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    * Value assigned in the initializer of a variable declared "const"
243326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    */
244326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   ir_constant *constant_value;
245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
2499fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/**
2509fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or
2519fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype.
2529fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */
253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
254894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /* An ir_function_signature will be part of the list of signatures in
255894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    * an ir_function.
256894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    */
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
258e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
260ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_function_signature *clone(struct hash_table *ht) const;
2614b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
26278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
26378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
26478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
26578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
26678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2678895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2688895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
2700f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    * Get the name of the function for which this is a signature
2710f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    */
2720f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   const char *function_name() const;
2730f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
2740f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   /**
275df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * Get a handle to the function for which this is a signature
276df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    *
277df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * There is no setter function, this function returns a \c const pointer,
278df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * and \c ir_function_signature::_function is private for a reason.  The
279df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * only way to make a connection between a function and function signature
280df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * is via \c ir_function::add_signature.  This helps ensure that certain
281df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * invariants (i.e., a function signature is in the list of signatures for
282df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * its \c _function) are met.
283df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    *
284df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * \sa ir_function::add_signature
285df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    */
286df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   inline const class ir_function *function() const
287df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   {
288df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      return this->_function;
289df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   }
290df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick
291df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   /**
292abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * Check whether the qualifiers match between this signature's parameters
293abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * and the supplied parameter list.  If not, returns the name of the first
294abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * parameter with mismatched qualifiers (for use in error messages).
295abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    */
296abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   const char *qualifiers_match(exec_list *params);
297abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke
298abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   /**
299bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * Replace the current parameter list with the given one.  This is useful
300bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * if the current information came from a prototype, and either has invalid
301bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * or missing parameter names.
302bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    */
303bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   void replace_parameters(exec_list *new_params);
304bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke
305bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   /**
306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
313f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_variable of function parameters.
314f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    *
315f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * This represents the storage.  The paramaters passed in a particular
316f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * call will be in ir_call::actual_paramaters.
317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
3180044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3209fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   /** Whether or not this function has a body (which may be empty). */
3219fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   unsigned is_defined:1;
3226a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
32313f782c4ae4e38e64ec4fe87a1c24597a5e894c3Ian Romanick   /** Whether or not this function signature is a built-in. */
32413f782c4ae4e38e64ec4fe87a1c24597a5e894c3Ian Romanick   unsigned is_built_in:1;
32513f782c4ae4e38e64ec4fe87a1c24597a5e894c3Ian Romanick
326894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /** Body of instructions in the function. */
327894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   struct exec_list body;
328894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt
3296a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate:
3306a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   /** Function of which this signature is one overload. */
331df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   class ir_function *_function;
3326a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
3336a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   friend class ir_function;
334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
3389fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name.
3399fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the
3409fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions.
341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
344882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
346ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_function *clone(struct hash_table *ht) const;
3474b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
3486202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual ir_function *as_function()
3496202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   {
3506202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke      return this;
3516202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   }
3526202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke
35378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
35478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
35578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
35678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
35778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
3588895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
3598895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3606a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   void add_signature(ir_function_signature *sig)
3616a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   {
362df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      sig->_function = this;
363df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      this->signatures.push_tail(sig);
3646a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   }
3656a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
366a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
36795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    * Get an iterator for the set of function signatures
36895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    */
36995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   exec_list_iterator iterator()
37095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   {
37195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick      return signatures.iterator();
37295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   }
37395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick
37495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   /**
3750d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that matches a set of actual parameters, taking implicit
3760d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * conversions into account.
377471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
37811fc7beb2fa82179cfd9202449e1365b28f868a9Ian Romanick   ir_function_signature *matching_signature(exec_list *actual_param);
379471471f83471481db0445e73f8c89e6a9149838eIan Romanick
380471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
3810d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that exactly matches a set of actual parameters without
3820d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * any implicit type conversions.
3830d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    */
3840d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   ir_function_signature *exact_matching_signature(exec_list *actual_ps);
3850d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke
3860d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   /**
387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
391a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate:
392471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
393f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_function_signature for each overloaded function with this name.
394471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
3950044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
396a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
3970f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
3980f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const
3990f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{
400df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   return this->_function->name;
4010f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick}
402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4053c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/**
4063c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements
4073c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */
4083c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction {
4093c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic:
4103c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if(ir_rvalue *condition)
4113c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      : condition(condition)
4123c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
4133c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      /* empty */
4143c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
4153c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
416ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_if *clone(struct hash_table *ht) const;
4174b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
4185ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual ir_if *as_if()
4195ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   {
4205ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt      return this;
4215ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   }
4225ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt
4233c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void accept(ir_visitor *v)
4243c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
4253c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      v->visit(this);
4263c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
4273c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
4288895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4298895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
4303c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *condition;
431f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the then branch */
4323c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  then_instructions;
433f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the else branch */
4343c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  else_instructions;
4353c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick};
4363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
4373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
438fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/**
439fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure.
440fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */
441fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction {
442fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic:
443fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL)
444fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
445fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      /* empty */
446fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
447fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
448ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_loop *clone(struct hash_table *ht) const;
4494b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
450fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   virtual void accept(ir_visitor *v)
451fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
452fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      v->visit(this);
453fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
454fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
4558895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
45701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual ir_loop *as_loop()
45801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   {
45901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick      return this;
46001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   }
46101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick
462fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
463fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * Get an iterator for the instructions of the loop body
464fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
465fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list_iterator iterator()
466fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
467fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      return body_instructions.iterator();
468fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
469fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
470f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction that make up the body of the loop. */
471fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list body_instructions;
472fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
473fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
474fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * \name Loop counter and controls
475fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
476fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@{*/
477fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *from;
478fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *to;
479fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *increment;
480fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_variable *counter;
481fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@}*/
482fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick};
483fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
484fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
485fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue {
486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
487fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
489ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_assignment *clone(struct hash_table *ht) const;
4904b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
49178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
49278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
49378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
49478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
49578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
4968895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4978895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
498cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_assignment * as_assignment()
499cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
500cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
501cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
502cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
506fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *lhs;
507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
511fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
516fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5193b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when
520160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list.
5213b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */
522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
527a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke   ir_unop_sign,
528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
53044d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_exp,
532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_log,
53301665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
53401665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
537dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_f2b,      /**< Float-to-boolean conversion */
538dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_b2f,      /**< Boolean-to-float conversion */
539c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_i2b,      /**< int-to-boolean conversion */
540c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_b2i,      /**< Boolean-to-int conversion */
5416c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
543a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
550d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt   ir_unop_fract,
551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
55357e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /**
55457e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    * \name Trigonometric operations.
55557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    */
55657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@{*/
55757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_sin,
55857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_cos,
55957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@}*/
56057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke
561b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /**
562b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    * \name Partial derivatives.
563b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    */
564b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@{*/
565b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdx,
566b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdy,
567b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@}*/
568b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke
569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
5738a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt
5748a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt   /**
5758a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Takes one of two combinations of arguments:
5768a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
5778a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, vecN)
5788a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, float)
5798a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
5808a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Does not take integer types.
5818a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    */
582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
594a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
600a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
601a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
610a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
611a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
6129be7f638130f46a9df2bfbcd4a03b36de9e4f3aaEric Anholt   ir_binop_cross,
613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
616a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
617a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
618a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
619fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
620a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
621a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
622fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
6246d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   virtual ir_expression *as_expression()
6256d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   {
6266d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt      return this;
6276d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   }
6286d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt
629ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_expression *clone(struct hash_table *ht) const;
6304b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
6317dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   static unsigned int get_num_operands(ir_expression_operation);
6324b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   unsigned int get_num_operands() const
6337dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   {
6347dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke      return get_num_operands(operation);
6357dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   }
636160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt
6373b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
6383b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Return a string representing this expression's operator.
6393b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
6403b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   const char *operator_string();
6413b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
6423b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
6433b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Do a reverse-lookup to translate the given string into an operator.
6443b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
6453b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   static ir_expression_operation get_operator(const char *);
6463b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
64778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
64878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
64978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
65078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
65178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
6528895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
6538895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
654a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
655fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *operands[2];
656a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
657a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
658a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
659ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
660ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
661ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
662fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue {
663ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
6641f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_call(ir_function_signature *callee, exec_list *actual_parameters)
665b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(callee)
666ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
6679e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
6689e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      type = callee->return_type;
669471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
670ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
671ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
672ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_call *clone(struct hash_table *ht) const;
6734b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
674cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_call *as_call()
675cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
676cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
677cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
678cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
679ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
680ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
681ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
682ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
683ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
6848895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
6858895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
686ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
687ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
688e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth    *
689e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth    * Any allocation will be performed with 'ctx' as talloc owner.
690ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
691e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth   static ir_call *get_error_instruction(void *ctx);
692ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
6939878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   /**
6949878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
6959878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
6969878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
6979878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
6989878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
6999878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
7009878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
70193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
70293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
70393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
70493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
70593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
7060f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick      return callee->function_name();
70793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
70893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
7091f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_function_signature *get_callee()
710cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
711cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return callee;
712cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
713cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
714cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   /**
715792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick    * Set the function call target
716792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick    */
7171f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   void set_callee(ir_function_signature *sig);
718792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick
719792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick   /**
720cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * Generates an inline version of the function before @ir,
721cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * returning the return value of the function.
722cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    */
723cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_rvalue *generate_inline(ir_instruction *ir);
724cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
725ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
726471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
727b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(NULL)
728471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
729471471f83471481db0445e73f8c89e6a9149838eIan Romanick      /* empty */
730471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
731471471f83471481db0445e73f8c89e6a9149838eIan Romanick
7321f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_function_signature *callee;
733f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt
734f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /* List of ir_rvalue of paramaters passed in this call. */
735ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   exec_list actual_parameters;
736ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
737ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
738ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
7399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
7409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
7419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
7429578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
7439578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
7449578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
7459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
7469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
7479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
7489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
7499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
7509578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
7519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
7529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
7539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
7549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
7559578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
7569578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
7579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
7589578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
7599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
7609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
761fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
7629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
7639578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
7649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
7659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
7669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
767ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_return *clone(struct hash_table *) const;
7684b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
769cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_return *as_return()
770cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
771cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
772cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
773cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
774fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
7759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
7769578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
7779578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
7789578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
7799578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
7809578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
7819578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
7829578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
7839578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
7848895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
7858895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
786fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
7879578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
788f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
789f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
790f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/**
791f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops
792f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
793f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue.  The \c break within a loop is
794f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement.
795f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
796f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump
797f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */
798f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump {
799f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic:
800f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode {
801f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_break,
802f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_continue
803f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   };
804f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
8054b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   ir_loop_jump(jump_mode mode)
806f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
8070c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt      this->mode = mode;
8080c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt      this->loop = loop;
809f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
810f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
811ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_loop_jump *clone(struct hash_table *) const;
8124b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
813f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   virtual void accept(ir_visitor *v)
814f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
815f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      v->visit(this);
816f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
817f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
8188895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
8198895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
820f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_break() const
821f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
822f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_break;
823f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
824f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
825f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_continue() const
826f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
827f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_continue;
828f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
829f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
830f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Mode selector for the jump instruction. */
831f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode mode;
8320c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholtprivate:
8330c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt   /** Loop containing this break instruction. */
8340c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt   ir_loop *loop;
835f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick};
83616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
83716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke/**
83816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke * IR instruction representing discard statements.
83916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke */
84016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeclass ir_discard : public ir_jump {
84116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkepublic:
84216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard()
84316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
84416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = NULL;
84516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
84616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
84716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard(ir_rvalue *cond)
84816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
84916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = cond;
85016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
85116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
852ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_discard *clone(struct hash_table *ht) const;
85316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
85416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual void accept(ir_visitor *v)
85516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
85616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      v->visit(this);
85716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
85816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
85916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
86016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
86116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_rvalue *condition;
86216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke};
8639578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
8649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
8659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
86681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
86781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture
86881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
86981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode {
87081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_tex,		/* Regular texture look-up */
87181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txb,		/* Texture look-up with LOD bias */
87281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txl,		/* Texture look-up with explicit LOD */
87381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txd,		/* Texture look-up with partial derivatvies */
87481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txf		/* Texel fetch with explicit LOD */
87581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
87681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
87781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
87881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
87981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture
88081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
88181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value
88281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes.  In the printed IR, these will
88381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as:
88481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
88581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              Texel offset
88681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       Projection divisor
88781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       |   Shadow comparitor
88881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       |   |
88981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              v       v   v
89081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (tex (sampler) (coordinate) (0 0 0) (1) ( ))
89181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias))
89281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod))
89381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy))
89481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txf (sampler) (coordinate) (0 0 0)         (lod))
89581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
89681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue {
89781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic:
89881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_texture(enum ir_texture_opcode op)
899b97efa5db5fce2e0d9a4c61a939c85b240c89170Kenneth Graunke      : op(op), projector(NULL), shadow_comparitor(NULL)
90081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   {
90181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      /* empty */
90281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   }
90381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
904ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_texture *clone(struct hash_table *) const;
9054b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
90626d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual void accept(ir_visitor *v)
90726d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   {
90826d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke      v->visit(this);
90926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   }
91026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
91126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
91226d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
913c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
914c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Return a string representing the ir_texture_opcode.
915c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
916c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   const char *opcode_string();
917c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
91856d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke   /** Set the sampler and infer the type. */
91956d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke   void set_sampler(ir_dereference *sampler);
92056d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke
921c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
922c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Do a reverse-lookup to translate a string into an ir_texture_opcode.
923c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
924c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   static ir_texture_opcode get_opcode(const char *);
925c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
92681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   enum ir_texture_opcode op;
92781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
92881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Sampler to use for the texture access. */
92981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_dereference *sampler;
93081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
93181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Texture coordinate to sample */
93281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *coordinate;
93381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
93481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
93581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Value used for projective divide.
93681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
93781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no projective divide (the common case), this will be
93881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c NULL.  Optimization passes should check for this to point to a constant
93981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * of 1.0 and replace that with \c NULL.
94081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
94181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *projector;
94281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
94381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
94481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Coordinate used for comparison on shadow look-ups.
94581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
94681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no shadow comparison, this will be \c NULL.  For the
94781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c ir_txf opcode, this *must* be \c NULL.
94881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
94981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *shadow_comparitor;
95081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
95181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Explicit texel offsets. */
95281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   signed char offsets[3];
95381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
95481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   union {
95581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *lod;		/**< Floating point LOD */
95681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *bias;		/**< Floating point LOD bias */
95781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      struct {
95881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdx;	/**< Partial derivative of coordinate wrt X */
95981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdy;	/**< Partial derivative of coordinate wrt Y */
96081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      } grad;
96181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   } lod_info;
96281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
96381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
96481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
965a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
966a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
967a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
968a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
969a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
970a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
971a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
972a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
973a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
974f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
975a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
976a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
977a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
978a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
979a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
980a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
981a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
982a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
983a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
984affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
985affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
986affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
987affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
988affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
9896315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
9906315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count);
9916315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
99205a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt   ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
993cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
994ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_swizzle *clone(struct hash_table *) const;
9954b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
9967d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual ir_swizzle *as_swizzle()
9977d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   {
9987d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt      return this;
9997d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   }
10007d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt
1001affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
1002affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
1003affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
1004affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
1005affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1006affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
1007affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
1008affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
1009affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
1010affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
10118895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
10128895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1013affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   bool is_lvalue()
1014affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
1015a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
1016affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
1017affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
10182b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
10192b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
10202b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
10212b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   virtual ir_variable *variable_referenced();
10222b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
1023affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
1024affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
10256315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
10266315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanickprivate:
10276315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   /**
10286315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * Initialize the mask component of a swizzle
10296315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    *
10306315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * This is used by the \c ir_swizzle constructors.
10316315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    */
10326315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   void init_mask(const unsigned *components, unsigned count);
1033affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
1034affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1035affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1036fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
1037a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
1038ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_dereference *clone(struct hash_table *) const = 0;
1039ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick
104044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
104144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
104244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
104344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
104444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
1045c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt   bool is_lvalue();
1046fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
10472b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
10482b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
10492b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
105070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced() = 0;
105170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
105270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
105370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
105470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference {
105570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
105670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_variable(ir_variable *var);
105770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
1058ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_dereference_variable *clone(struct hash_table *) const;
10594b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1060d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual ir_dereference_variable *as_dereference_variable()
1061d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   {
1062d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt      return this;
1063d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   }
1064d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt
106570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
106670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
106770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
106870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
106970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
107036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->var;
107170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1072f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1073b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
1074b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
1075b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      /* ir_dereference_variable objects always dereference the entire
1076b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * variable.  However, if this dereference is dereferenced by anything
1077b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * else, the complete deferefernce chain is not a whole-variable
1078b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * dereference.  This method should only be called on the top most
1079b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * ir_rvalue in a dereference chain.
1080b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       */
1081b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return this->var;
1082b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
1083b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
1084c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1085c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1086c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1087c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1088c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1089f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
109036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
109136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   /**
109236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    * Object being dereferenced.
109336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    */
109436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_variable *var;
109570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
109670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
109770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
109870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference {
109970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
110070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
110170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
110270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
110370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
1104ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_dereference_array *clone(struct hash_table *) const;
11054b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1106b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual ir_dereference_array *as_dereference_array()
1107b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   {
1108b145e903694fa932ab1e0d955e889555193ab604Eric Anholt      return this;
1109b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   }
1110b145e903694fa932ab1e0d955e889555193ab604Eric Anholt
111170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
111270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
111370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
111470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
111570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
111636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->array->variable_referenced();
111770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
111870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
1119c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1120c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1121c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1122c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1123c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1124f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
112570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
112636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array;
112736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array_index;
112836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
112970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate:
113070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   void set_array(ir_rvalue *value);
113170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
113270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
113370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
113470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference {
113570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
113670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_rvalue *value, const char *field);
113770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
113870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_variable *var, const char *field);
113970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
1140ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_dereference_record *clone(struct hash_table *) const;
11414b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
114270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
114370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
114470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
114570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
114670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
114736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->record->variable_referenced();
114870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1149f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1150c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1151c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1152c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1153c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1154c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1155f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
115636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
115736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *record;
115836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   const char *field;
1159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1162be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/**
1163be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick * Data stored in an ir_constant
1164be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick */
1165be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanickunion ir_constant_data {
1166be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      unsigned u[16];
1167be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      int i[16];
1168be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      float f[16];
1169be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      bool b[16];
1170be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick};
1171be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1172be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1173fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
1174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
1175824b659d917a5f14a1f66b891d25036ef9f9adc6Ian Romanick   ir_constant(const struct glsl_type *type, const ir_constant_data *data);
11763c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
11773c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
11783c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
11793c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
1180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1181989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   /**
1182756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    * Construct an ir_constant from a list of ir_constant values
1183756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    */
1184756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   ir_constant(const struct glsl_type *type, exec_list *values);
1185756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick
1186756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   /**
1187989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * Construct an ir_constant from a scalar component of another ir_constant
1188989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1189989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * The new \c ir_constant inherits the type of the component from the
1190989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * source constant.
1191989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1192989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * \note
1193989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * In the case of a matrix constant, the new constant is a scalar, \b not
1194989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * a vector.
1195989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    */
1196989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   ir_constant(const ir_constant *c, unsigned i);
1197989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick
1198ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick   virtual ir_constant *clone(struct hash_table *) const;
11994b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
12005c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual ir_constant *as_constant()
12015c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   {
12025c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt      return this;
12035c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   }
12045c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt
120578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
120678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
120778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
120878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
120978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
12108895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
12118895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
121331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * Get a particular component of a constant as a specific type
121431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    *
121531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * This is useful, for example, to get a value from an integer constant
121631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * as a float or bool.  This appears frequently when constructors are
121731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * called with all constant parameters.
121831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    */
121931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@{*/
122031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   bool get_bool_component(unsigned i) const;
122131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   float get_float_component(unsigned i) const;
122231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   int get_int_component(unsigned i) const;
122331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   unsigned get_uint_component(unsigned i) const;
122431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@}*/
122531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick
1226b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick   ir_constant *get_record_field(const char *name);
1227b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick
122831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /**
12291e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    * Determine whether a constant has the same value as another constant
12301e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    */
12311e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick   bool has_value(const ir_constant *) const;
12321e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick
12331e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick   /**
1234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
1235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
1237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
1238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
1239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1240be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick   union ir_constant_data value;
12417f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick
12427f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick   exec_list components;
1243710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick
1244710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanickprivate:
1245710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   /**
1246710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    * Parameterless constructor only used by the clone method
1247710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    */
1248710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   ir_constant(void);
1249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
125170b74928a220aff024664714877defb0caedf33fEric Anholtvoid
125270b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor);
1253adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
125453cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholtvoid validate_ir_tree(exec_list *instructions);
125553cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholt
1256f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick/**
1257f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * Make a clone of each IR instruction in a list
1258f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick *
1259f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param in   List of IR instructions that are to be cloned
1260f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param out  List to hold the cloned instructions
1261f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick */
1262f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanickvoid
1263f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanickclone_ir_list(exec_list *out, const exec_list *in);
1264f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick
1265adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
1266adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
1267adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
1268e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
1269c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
1270c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions,
1271c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt				struct _mesa_glsl_parse_state *state);
1272c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
1273e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
1274