ir.h revision 3b85f1cc6cb12e9d4931e12cf29adde578f389fd
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
44d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholtenum ir_node_type {
45d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_unset,
46d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_variable,
47d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_assignment,
48d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_call,
49d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_constant,
50d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_array,
51d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_record,
52d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_variable,
53d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_discard,
54d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_expression,
55d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_function,
56d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_function_signature,
57d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_if,
58d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_loop,
59d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_loop_jump,
60d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_return,
61d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_swizzle,
62d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_texture,
636dc89d221d43fad5f3edbb903997160af071bec0Brian Paul   ir_type_max /**< maximum ir_type enum number, for validation */
64d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt};
65d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt
66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions
68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
690044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node {
70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
71d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   enum ir_node_type ir_type;
72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
74e46a454305af64710ce8deadafc718f75363ac7eEric Anholt   /** ir_print_visitor helper for debugging. */
754b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   void print(void) const;
76e46a454305af64710ce8deadafc718f75363ac7eEric Anholt
7778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *) = 0;
788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
798273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_instruction *clone(void *mem_ctx,
808273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt				 struct hash_table *ht) const = 0;
8178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
8244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /**
8344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \name IR instruction downcast functions
8444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    *
8544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * These functions either cast the object to a derived class or return
8644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \c NULL if the object's type does not match the specified derived class.
8744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * Additional downcast functions will be added as needed.
8844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    */
8944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@{*/
9044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_variable *          as_variable()         { return NULL; }
916202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual class ir_function *          as_function()         { return NULL; }
9244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_dereference *       as_dereference()      { return NULL; }
93b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual class ir_dereference_array *	as_dereference_array() { return NULL; }
94d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual class ir_dereference_variable *as_dereference_variable() { return NULL; }
956d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   virtual class ir_expression *        as_expression()       { return NULL; }
96fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual class ir_rvalue *            as_rvalue()           { return NULL; }
9701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual class ir_loop *              as_loop()             { return NULL; }
98cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_assignment *        as_assignment()       { return NULL; }
99cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_call *              as_call()             { return NULL; }
100cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_return *            as_return()           { return NULL; }
1015ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual class ir_if *                as_if()               { return NULL; }
1027d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual class ir_swizzle *           as_swizzle()          { return NULL; }
1035c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual class ir_constant *          as_constant()         { return NULL; }
10444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@}*/
10544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
10744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   ir_instruction()
108d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
109d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_unset;
1100a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke      type = NULL;
111d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
115fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction {
116fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic:
1178273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const = 0;
118ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick
119fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value() = 0;
120fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
121fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue * as_rvalue()
122fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
123fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return this;
124fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
125fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
126fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual bool is_lvalue()
127fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
128fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return false;
129fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
130fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
1312b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
1322b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
1332b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
1342b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   virtual ir_variable *variable_referenced()
1352b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   {
1362b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick      return NULL;
1372b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   }
1382b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
139b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
140b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   /**
141b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * If an r-value is a reference to a whole variable, get that variable
142b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    *
143b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * \return
144b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * Pointer to a variable that is completely dereferenced by the r-value.  If
145b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * the r-value is not a dereference or the dereference does not access the
146b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * entire variable (i.e., it's just one array element, struct field), \c NULL
147b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * is returned.
148b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    */
149b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
150b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
151b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return NULL;
152b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
153b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
154fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected:
1550a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke   ir_rvalue();
156fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke};
157fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
158fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_auto = 0,
161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_uniform,
162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
1647e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_var_inout,
1657e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_var_temporary	/**< Temporary variable generated during compilation. */
166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
168a22426dc4c934673e8f0af5c70a67505a4de7aadCarl Worthenum ir_variable_interpolation {
169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
174fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
1777e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_variable(const struct glsl_type *, const char *, ir_variable_mode);
178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1798273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const;
1804b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
18144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_variable *as_variable()
18244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
18344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
18444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
18544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
18678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
18778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
18878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
18978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
19078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
1918895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1928895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1932d394d4877794d19756c3760d711524dca89f772Ian Romanick
194950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   /**
195950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * Get the string value for the interpolation qualifier
196950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    *
197046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * \return The string that would be used in a shader to specify \c
198046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * mode will be returned.
199046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    *
200046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * This function should only be used on a shader input or output variable.
201950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    */
202950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   const char *interpolation_string() const;
203950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick
2048b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick   /**
2058b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * Calculate the number of slots required to hold this variable
2068b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    *
2078b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * This is used to determine how many uniform or varying locations a variable
2088b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * occupies.  The count is in units of floating point components.
2098b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    */
2108b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick   unsigned component_slots() const;
2118b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick
212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
214b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   /**
215b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Highest element accessed with a constant expression array index
216b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    *
217b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Not used for non-array variables.
218b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    */
219b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   unsigned max_array_access;
220b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
2279d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick
2289d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   /**
2299d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * Flag that the whole array is assignable
2309d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    *
2319d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * In GLSL 1.20 and later whole arrays are assignable (and comparable for
2329d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * equality).  This flag enables this behavior.
2339d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    */
2349d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   unsigned array_lvalue:1;
235326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt
2364a962170d7cf4243d6ae156fca20a6167388925dEric Anholt   /* ARB_fragment_coord_conventions */
2374a962170d7cf4243d6ae156fca20a6167388925dEric Anholt   unsigned origin_upper_left:1;
2384a962170d7cf4243d6ae156fca20a6167388925dEric Anholt   unsigned pixel_center_integer:1;
2394a962170d7cf4243d6ae156fca20a6167388925dEric Anholt
240326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   /**
24169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * Storage location of the base of this variable
24269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
24369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * The precise meaning of this field depends on the nature of the variable.
24469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
24569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader input: one of the values from \c gl_vert_attrib.
24669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader output: one of the values from \c gl_vert_result.
24769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader input: one of the values from \c gl_frag_attrib.
24869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader output: one of the values from \c gl_frag_result.
24969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Uniforms: Per-stage uniform slot number.
25069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Other: This field is not currently used.
25169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
25269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * If the variable is a uniform, shader input, or shader output, and the
25369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * slot has not been assigned, the value will be -1.
25469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    */
25569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   int location;
25669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick
25769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   /**
258c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    * Emit a warning if this variable is accessed.
259c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    */
260c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   const char *warn_extension;
261c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick
262c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   /**
263326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    * Value assigned in the initializer of a variable declared "const"
264326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    */
265326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   ir_constant *constant_value;
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
2709fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/**
2719fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or
2729fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype.
2739fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */
274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
275894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /* An ir_function_signature will be part of the list of signatures in
276894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    * an ir_function.
277894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    */
278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
279e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2818273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_function_signature *clone(void *mem_ctx,
2828273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					struct hash_table *ht) const;
2834b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
28478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
28578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
28678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
28778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
28878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2898895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2908895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
2920f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    * Get the name of the function for which this is a signature
2930f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    */
2940f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   const char *function_name() const;
2950f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
2960f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   /**
297df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * Get a handle to the function for which this is a signature
298df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    *
299df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * There is no setter function, this function returns a \c const pointer,
300df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * and \c ir_function_signature::_function is private for a reason.  The
301df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * only way to make a connection between a function and function signature
302df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * is via \c ir_function::add_signature.  This helps ensure that certain
303df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * invariants (i.e., a function signature is in the list of signatures for
304df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * its \c _function) are met.
305df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    *
306df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * \sa ir_function::add_signature
307df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    */
308df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   inline const class ir_function *function() const
309df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   {
310df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      return this->_function;
311df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   }
312df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick
313df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   /**
314abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * Check whether the qualifiers match between this signature's parameters
315abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * and the supplied parameter list.  If not, returns the name of the first
316abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * parameter with mismatched qualifiers (for use in error messages).
317abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    */
318abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   const char *qualifiers_match(exec_list *params);
319abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke
320abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   /**
321bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * Replace the current parameter list with the given one.  This is useful
322bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * if the current information came from a prototype, and either has invalid
323bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * or missing parameter names.
324bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    */
325bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   void replace_parameters(exec_list *new_params);
326bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke
327bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   /**
328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
335f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_variable of function parameters.
336f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    *
337f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * This represents the storage.  The paramaters passed in a particular
338f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * call will be in ir_call::actual_paramaters.
339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
3400044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3429fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   /** Whether or not this function has a body (which may be empty). */
3439fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   unsigned is_defined:1;
3446a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
345894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /** Body of instructions in the function. */
346894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   struct exec_list body;
347894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt
3486a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate:
3496a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   /** Function of which this signature is one overload. */
350df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   class ir_function *_function;
3516a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
3526a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   friend class ir_function;
353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
3579fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name.
3589fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the
3599fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions.
360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
363882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3658273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const;
3664b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
3676202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual ir_function *as_function()
3686202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   {
3696202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke      return this;
3706202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   }
3716202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke
37278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
37378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
37478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
37578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
37678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
3778895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
3788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3796a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   void add_signature(ir_function_signature *sig)
3806a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   {
381df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      sig->_function = this;
382df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      this->signatures.push_tail(sig);
3836a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   }
3846a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
38695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    * Get an iterator for the set of function signatures
38795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    */
38895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   exec_list_iterator iterator()
38995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   {
39095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick      return signatures.iterator();
39195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   }
39295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick
39395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   /**
3940d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that matches a set of actual parameters, taking implicit
3950d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * conversions into account.
396471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
397b95897b89d36a25c237a021c299a4eb295856476Ian Romanick   ir_function_signature *matching_signature(const exec_list *actual_param);
398471471f83471481db0445e73f8c89e6a9149838eIan Romanick
399471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
4000d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that exactly matches a set of actual parameters without
4010d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * any implicit type conversions.
4020d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    */
403b95897b89d36a25c237a021c299a4eb295856476Ian Romanick   ir_function_signature *exact_matching_signature(const exec_list *actual_ps);
4040d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke
4050d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   /**
406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
410b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke   /** Whether or not this function is a built-in. */
411b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke   unsigned is_builtin:1;
412b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke
413471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
414f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_function_signature for each overloaded function with this name.
415471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
4160044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
4180f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
4190f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const
4200f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{
421df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   return this->_function->name;
4220f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick}
423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4263c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/**
4273c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements
4283c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */
4293c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction {
4303c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic:
4313c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if(ir_rvalue *condition)
4323c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      : condition(condition)
4333c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
434d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_if;
4353c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
4363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
4378273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const;
4384b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
4395ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual ir_if *as_if()
4405ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   {
4415ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt      return this;
4425ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   }
4435ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt
4443c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void accept(ir_visitor *v)
4453c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
4463c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      v->visit(this);
4473c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
4483c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
4498895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4508895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
4513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *condition;
452f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the then branch */
4533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  then_instructions;
454f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the else branch */
4553c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  else_instructions;
4563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick};
4573c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
4583c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
459fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/**
460fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure.
461fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */
462fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction {
463fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic:
4643b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_loop();
465fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
4668273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const;
4674b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
468fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   virtual void accept(ir_visitor *v)
469fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
470fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      v->visit(this);
471fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
472fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
4738895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4748895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
47501f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual ir_loop *as_loop()
47601f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   {
47701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick      return this;
47801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   }
47901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick
480fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
481fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * Get an iterator for the instructions of the loop body
482fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
483fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list_iterator iterator()
484fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
485fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      return body_instructions.iterator();
486fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
487fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
488f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction that make up the body of the loop. */
489fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list body_instructions;
490fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
491fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
492fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * \name Loop counter and controls
4933b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
4943b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * Represents a loop like a FORTRAN \c do-loop.
4953b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
4963b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * \note
4973b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * If \c from and \c to are the same value, the loop will execute once.
498fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
499fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@{*/
5003b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_rvalue *from;             /** Value of the loop counter on the first
5013b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 * iteration of the loop.
5023b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 */
5033b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_rvalue *to;               /** Value of the loop counter on the last
5043b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 * iteration of the loop.
5053b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 */
506fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *increment;
507fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_variable *counter;
5083b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick
5093b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   /**
5103b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * Comparison operation in the loop terminator.
5113b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
5123b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * If any of the loop control fields are non-\c NULL, this field must be
5133b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal,
5143b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal.
5153b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    */
5163b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   int cmp;
517fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@}*/
518fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick};
519fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
520fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
5213c033637de7def553559c11d037f2e8bbb750f77Kenneth Graunkeclass ir_assignment : public ir_instruction {
522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
523fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5255a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
5265a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Construct an assignment with an explicit write mask
5275a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
5285a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * \note
5295a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Since a write mask is supplied, the LHS must already be a bare
5305a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * \c ir_dereference.  The cannot be any swizzles in the LHS.
5315a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
5325a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition,
5335a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick		 unsigned write_mask);
5345a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
5358273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const;
5364b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
537fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
538fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
53978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
54078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
54178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
54278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
54378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
5448895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
5458895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
546cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_assignment * as_assignment()
547cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
548cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
549cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
550cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
5525a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Get a whole variable written by an assignment
5535a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
5545a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * If the LHS of the assignment writes a whole variable, the variable is
5555a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * returned.  Otherwise \c NULL is returned.  Examples of whole-variable
5565a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * assignment are:
5575a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
5585a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Assigning to a scalar
5595a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Assigning to all components of a vector
5605a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Whole array (or matrix) assignment
5615a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Whole structure assignment
5625a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
5635a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_variable *whole_variable_written();
5645a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
5655a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
5665a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Set the LHS of an assignment
5675a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
5685a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   void set_lhs(ir_rvalue *lhs);
5695a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
5705a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
5725a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
5735a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * This should be treated as read only.  If you need to set the LHS of an
5745a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * assignment, use \c ir_assignment::set_lhs.
575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
5765a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_dereference *lhs;
577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
581fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
586fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
5875a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
5885a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
5895a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
5905a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Component mask written
5915a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
5925a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * For non-vector types in the LHS, this field will be zero.  For vector
5935a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * types, a bit will be set for each component that is written.  Note that
5945a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * for \c vec2 and \c vec3 types only the lower bits will ever be set.
5955a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
5965a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   unsigned write_mask:4;
597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5993b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when
600160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list.
6013b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */
602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
607a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke   ir_unop_sign,
608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
61044d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
611bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt   ir_unop_exp,      /**< Log base e on gentype */
612bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt   ir_unop_log,	     /**< Natural log on gentype */
61301665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
61401665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
616a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
617dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_f2b,      /**< Float-to-boolean conversion */
618dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_b2f,      /**< Boolean-to-float conversion */
619c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_i2b,      /**< int-to-boolean conversion */
620c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_b2i,      /**< Boolean-to-int conversion */
6216c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
6225e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt   ir_unop_any,
623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
627a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
628a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
630a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
631d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt   ir_unop_fract,
632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
63457e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /**
63557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    * \name Trigonometric operations.
63657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    */
63757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@{*/
63857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_sin,
63957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_cos,
64057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@}*/
64157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke
642b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /**
643b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    * \name Partial derivatives.
644b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    */
645b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@{*/
646b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdx,
647b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdy,
648b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@}*/
649b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke
650a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
651a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
652a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
653a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
6548a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt
6558a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt   /**
6568a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Takes one of two combinations of arguments:
6578a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
6588a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, vecN)
6598a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, float)
6608a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
6618a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Does not take integer types.
6628a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    */
663a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
664a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
665a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
666a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
667a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
668a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
669a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
670a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
671a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
672a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
673832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt   /**
674832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * Returns single boolean for whether all components of operands[0]
675832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * equal the components of operands[1].
676832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    */
677a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
678832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt   /**
679832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * Returns single boolean for whether any component of operands[0]
680832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * is not equal to the corresponding component of operands[1].
681832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    */
682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
683a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
685a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
687a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
689a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
691a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
695a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
696a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
697a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
698a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
699a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
700a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
7019be7f638130f46a9df2bfbcd4a03b36de9e4f3aaEric Anholt   ir_binop_cross,
702a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
703a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
704a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
705a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
706a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
707a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
708fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
709a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
711fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
712a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
7136d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   virtual ir_expression *as_expression()
7146d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   {
7156d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt      return this;
7166d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   }
7176d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt
7188273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const;
7194b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
720fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
721fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
7227dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   static unsigned int get_num_operands(ir_expression_operation);
7234b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   unsigned int get_num_operands() const
7247dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   {
7257dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke      return get_num_operands(operation);
7267dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   }
727160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt
7283b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
7293b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Return a string representing this expression's operator.
7303b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
7313b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   const char *operator_string();
7323b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
7333b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
7343b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Do a reverse-lookup to translate the given string into an operator.
7353b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
7363b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   static ir_expression_operation get_operator(const char *);
7373b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
73878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
73978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
74078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
74178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
74278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
7438895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
7448895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
745a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
746fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *operands[2];
747a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
748a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
749a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
750ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
751ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
752ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
753fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue {
754ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
7551f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_call(ir_function_signature *callee, exec_list *actual_parameters)
756b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(callee)
757ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
758d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_call;
7599e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
7609e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      type = callee->return_type;
761471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
762ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
763ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
7648273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const;
7654b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
766fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
767fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
768cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_call *as_call()
769cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
770cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
771cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
772cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
773ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
774ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
775ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
776ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
777ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
7788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
7798895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
780ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
781ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
782e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth    *
783e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth    * Any allocation will be performed with 'ctx' as talloc owner.
784ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
785e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth   static ir_call *get_error_instruction(void *ctx);
786ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
7879878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   /**
7889878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
7899878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
7909878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
7919878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
7929878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
7939878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
7949878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
79593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
79693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
79793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
79893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
79993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
8000f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick      return callee->function_name();
80193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
80293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
8031f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_function_signature *get_callee()
804cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
805cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return callee;
806cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
807cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
808cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   /**
809792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick    * Set the function call target
810792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick    */
8111f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   void set_callee(ir_function_signature *sig);
812792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick
813792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick   /**
814cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * Generates an inline version of the function before @ir,
815cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * returning the return value of the function.
816cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    */
817cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_rvalue *generate_inline(ir_instruction *ir);
818cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
819a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick   /* List of ir_rvalue of paramaters passed in this call. */
820a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick   exec_list actual_parameters;
821a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick
822ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
823471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
824b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(NULL)
825471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
826d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_call;
827471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
828471471f83471481db0445e73f8c89e6a9149838eIan Romanick
8291f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_function_signature *callee;
830ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
831ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
832ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
8339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
8349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
8359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
8369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
8379578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
8389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
8399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
8409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
8419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
8429578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
843d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_unset;
8449578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
8459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
8469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
8479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
8489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
8499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
8509578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
8519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
852d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_return;
8539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
8549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
855fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
8569578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
8579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
858d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_return;
8599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
8609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
8618273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_return *clone(void *mem_ctx, struct hash_table *) const;
8624b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
863cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_return *as_return()
864cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
865cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
866cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
867cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
868fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
8699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
8709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
8719578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
8729578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
8739578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
8749578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
8759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
8769578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
8779578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
8788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
8798895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
880fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
8819578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
882f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
883f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
884f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/**
885f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops
886f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
887f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue.  The \c break within a loop is
888f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement.
889f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
890f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump
891f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */
892f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump {
893f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic:
894f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode {
895f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_break,
896f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_continue
897f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   };
898f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
8994b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   ir_loop_jump(jump_mode mode)
900f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
901d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_loop_jump;
9020c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt      this->mode = mode;
9030c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt      this->loop = loop;
904f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
905f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
9068273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const;
9074b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
908f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   virtual void accept(ir_visitor *v)
909f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
910f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      v->visit(this);
911f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
912f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
9138895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
9148895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
915f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_break() const
916f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
917f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_break;
918f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
919f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
920f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_continue() const
921f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
922f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_continue;
923f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
924f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
925f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Mode selector for the jump instruction. */
926f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode mode;
9270c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholtprivate:
9280c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt   /** Loop containing this break instruction. */
9290c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt   ir_loop *loop;
930f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick};
93116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
93216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke/**
93316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke * IR instruction representing discard statements.
93416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke */
93516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeclass ir_discard : public ir_jump {
93616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkepublic:
93716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard()
93816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
939d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_discard;
94016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = NULL;
94116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
94216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
94316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard(ir_rvalue *cond)
94416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
94584ee01f40acf88185484df386b7715034e7685c9Aras Pranckevicius      this->ir_type = ir_type_discard;
94616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = cond;
94716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
94816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
9498273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const;
95016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
95116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual void accept(ir_visitor *v)
95216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
95316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      v->visit(this);
95416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
95516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
95616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
95716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
95816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_rvalue *condition;
95916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke};
9609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
9619578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
9629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
96381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
96481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture
96581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
96681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode {
96781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_tex,		/* Regular texture look-up */
96881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txb,		/* Texture look-up with LOD bias */
96981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txl,		/* Texture look-up with explicit LOD */
97081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txd,		/* Texture look-up with partial derivatvies */
97181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_txf		/* Texel fetch with explicit LOD */
97281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
97381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
97481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
97581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
97681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture
97781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
97881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value
97981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes.  In the printed IR, these will
98081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as:
98181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
98281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              Texel offset
98381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       Projection divisor
98481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       |   Shadow comparitor
98581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       |   |
98681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              v       v   v
98781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (tex (sampler) (coordinate) (0 0 0) (1) ( ))
98881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias))
98981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod))
99081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy))
99181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txf (sampler) (coordinate) (0 0 0)         (lod))
99281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
99381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue {
99481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic:
99581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_texture(enum ir_texture_opcode op)
996b97efa5db5fce2e0d9a4c61a939c85b240c89170Kenneth Graunke      : op(op), projector(NULL), shadow_comparitor(NULL)
99781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   {
998d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_texture;
99981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   }
100081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
10018273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const;
10024b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1003fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1004fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
100526d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual void accept(ir_visitor *v)
100626d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   {
100726d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke      v->visit(this);
100826d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   }
100926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
101026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
101126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
1012c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
1013c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Return a string representing the ir_texture_opcode.
1014c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
1015c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   const char *opcode_string();
1016c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
101756d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke   /** Set the sampler and infer the type. */
101856d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke   void set_sampler(ir_dereference *sampler);
101956d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke
1020c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
1021c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Do a reverse-lookup to translate a string into an ir_texture_opcode.
1022c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
1023c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   static ir_texture_opcode get_opcode(const char *);
1024c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
102581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   enum ir_texture_opcode op;
102681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
102781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Sampler to use for the texture access. */
102881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_dereference *sampler;
102981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
103081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Texture coordinate to sample */
103181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *coordinate;
103281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
103381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
103481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Value used for projective divide.
103581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
103681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no projective divide (the common case), this will be
103781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c NULL.  Optimization passes should check for this to point to a constant
103881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * of 1.0 and replace that with \c NULL.
103981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
104081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *projector;
104181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
104281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
104381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Coordinate used for comparison on shadow look-ups.
104481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
104581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no shadow comparison, this will be \c NULL.  For the
104681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c ir_txf opcode, this *must* be \c NULL.
104781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
104881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *shadow_comparitor;
104981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
105081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Explicit texel offsets. */
105181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   signed char offsets[3];
105281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
105381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   union {
105481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *lod;		/**< Floating point LOD */
105581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *bias;		/**< Floating point LOD bias */
105681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      struct {
105781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdx;	/**< Partial derivative of coordinate wrt X */
105881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdy;	/**< Partial derivative of coordinate wrt Y */
105981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      } grad;
106081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   } lod_info;
106181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
106281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
106381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
1064a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
1065a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
1066a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
1067a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
1068a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
1069a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1070a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
1071a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
1072a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1073f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
1074a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1075a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
1076a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
1077a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1078a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
1079a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1080a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
1081a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1082a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1083affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1084affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
1085affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
1086affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
1087affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
10886315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
10896315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count);
10906315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
109105a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt   ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
1092cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
10938273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const;
10944b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1095fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1096fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
10977d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual ir_swizzle *as_swizzle()
10987d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   {
10997d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt      return this;
11007d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   }
11017d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt
1102affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
1103affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
1104affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
1105affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
1106affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1107affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
1108affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
1109affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
1110affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
1111affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
11128895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
11138895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1114affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   bool is_lvalue()
1115affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
1116a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
1117affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
1118affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
11192b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
11202b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
11212b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
11222b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   virtual ir_variable *variable_referenced();
11232b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
1124affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
1125affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
11266315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
11276315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanickprivate:
11286315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   /**
11296315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * Initialize the mask component of a swizzle
11306315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    *
11316315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * This is used by the \c ir_swizzle constructors.
11326315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    */
11336315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   void init_mask(const unsigned *components, unsigned count);
1134affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
1135affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1136affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1137fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
1138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
11398273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0;
1140ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick
114144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
114244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
114344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
114444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
114544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
1146c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt   bool is_lvalue();
1147fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
11482b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
11492b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
11502b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
115170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced() = 0;
115270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
115370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
115470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
115570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference {
115670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
115770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_variable(ir_variable *var);
115870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
11598273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_variable *clone(void *mem_ctx,
11608273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					  struct hash_table *) const;
11614b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1162fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1163fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
1164d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual ir_dereference_variable *as_dereference_variable()
1165d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   {
1166d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt      return this;
1167d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   }
1168d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt
116970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
117070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
117170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
117270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
117370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
117436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->var;
117570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1176f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1177b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
1178b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
1179b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      /* ir_dereference_variable objects always dereference the entire
1180b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * variable.  However, if this dereference is dereferenced by anything
1181b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * else, the complete deferefernce chain is not a whole-variable
1182b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * dereference.  This method should only be called on the top most
1183b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * ir_rvalue in a dereference chain.
1184b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       */
1185b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return this->var;
1186b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
1187b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
1188c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1189c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1190c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1191c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1192c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1193f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
119436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
119536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   /**
119636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    * Object being dereferenced.
119736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    */
119836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_variable *var;
119970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
120070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
120170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
120270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference {
120370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
120470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
120570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
120670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
120770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
12088273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_array *clone(void *mem_ctx,
12098273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt				       struct hash_table *) const;
12104b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1211fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1212fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
1213b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual ir_dereference_array *as_dereference_array()
1214b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   {
1215b145e903694fa932ab1e0d955e889555193ab604Eric Anholt      return this;
1216b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   }
1217b145e903694fa932ab1e0d955e889555193ab604Eric Anholt
121870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
121970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
122070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
122170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
122270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
122336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->array->variable_referenced();
122470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
122570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
1226c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1227c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1228c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1229c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1230c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1231f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
123270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
123336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array;
123436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array_index;
123536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
123670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate:
123770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   void set_array(ir_rvalue *value);
123870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
123970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
124070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
124170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference {
124270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
124370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_rvalue *value, const char *field);
124470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
124570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_variable *var, const char *field);
124670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
12478273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_record *clone(void *mem_ctx,
12488273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					struct hash_table *) const;
12494b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1250fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1251fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
125270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
125370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
125470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
125570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
125670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
125736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->record->variable_referenced();
125870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1259f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1260c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1261c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1262c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1263c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1264c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1265f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
126636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
126736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *record;
126836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   const char *field;
1269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1272be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/**
1273be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick * Data stored in an ir_constant
1274be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick */
1275be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanickunion ir_constant_data {
1276be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      unsigned u[16];
1277be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      int i[16];
1278be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      float f[16];
1279be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      bool b[16];
1280be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick};
1281be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1282be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1283fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
1284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
1285824b659d917a5f14a1f66b891d25036ef9f9adc6Ian Romanick   ir_constant(const struct glsl_type *type, const ir_constant_data *data);
12863c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
12873c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
12883c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
12893c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
1290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1291989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   /**
1292756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    * Construct an ir_constant from a list of ir_constant values
1293756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    */
1294756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   ir_constant(const struct glsl_type *type, exec_list *values);
1295756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick
1296756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   /**
1297989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * Construct an ir_constant from a scalar component of another ir_constant
1298989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1299989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * The new \c ir_constant inherits the type of the component from the
1300989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * source constant.
1301989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1302989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * \note
1303989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * In the case of a matrix constant, the new constant is a scalar, \b not
1304989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * a vector.
1305989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    */
1306989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   ir_constant(const ir_constant *c, unsigned i);
1307989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick
1308ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke   /**
1309ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke    * Return a new ir_constant of the specified type containing all zeros.
1310ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke    */
1311ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke   static ir_constant *zero(void *mem_ctx, const glsl_type *type);
1312ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke
13138273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const;
13144b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1315fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1316fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
13175c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual ir_constant *as_constant()
13185c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   {
13195c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt      return this;
13205c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   }
13215c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt
132278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
132378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
132478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
132578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
132678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
13278895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
13288895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
133031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * Get a particular component of a constant as a specific type
133131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    *
133231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * This is useful, for example, to get a value from an integer constant
133331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * as a float or bool.  This appears frequently when constructors are
133431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * called with all constant parameters.
133531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    */
133631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@{*/
133731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   bool get_bool_component(unsigned i) const;
133831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   float get_float_component(unsigned i) const;
133931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   int get_int_component(unsigned i) const;
134031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   unsigned get_uint_component(unsigned i) const;
134131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@}*/
134231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick
134374e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   ir_constant *get_array_element(unsigned i) const;
134474e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke
1345b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick   ir_constant *get_record_field(const char *name);
1346b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick
134731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /**
13481e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    * Determine whether a constant has the same value as another constant
13491e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    */
13501e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick   bool has_value(const ir_constant *) const;
13511e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick
13521e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick   /**
1353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
1354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
1356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
1357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
1358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1359be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick   union ir_constant_data value;
13607f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick
136174e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   /* Array elements */
136274e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   ir_constant **array_elements;
136374e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke
136474e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   /* Structure fields */
13657f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick   exec_list components;
1366710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick
1367710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanickprivate:
1368710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   /**
1369710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    * Parameterless constructor only used by the clone method
1370710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    */
1371710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   ir_constant(void);
1372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
137470b74928a220aff024664714877defb0caedf33fEric Anholtvoid
137570b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor);
1376adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
137753cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholtvoid validate_ir_tree(exec_list *instructions);
137853cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholt
1379f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick/**
1380f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * Make a clone of each IR instruction in a list
1381f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick *
1382f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param in   List of IR instructions that are to be cloned
1383f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param out  List to hold the cloned instructions
1384f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick */
1385f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanickvoid
13868273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholtclone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in);
1387f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick
1388adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
1389adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
1390adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
1391e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
1392c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
1393c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions,
1394c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt				struct _mesa_glsl_parse_state *state);
1395c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
139660e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickextern void
1397d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick_mesa_glsl_release_functions(void);
1398d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick
1399d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanickextern void
140060e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickreparent_ir(exec_list *list, void *mem_ctx);
140160e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanick
14021cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonsecastruct glsl_symbol_table;
14034ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick
14044ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickextern void
14054ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickimport_prototypes(const exec_list *source, exec_list *dest,
14061cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonseca		  struct glsl_symbol_table *symbols, void *mem_ctx);
14074ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick
14089f82806c7b5109553cf806a5652e6b6198665094Eric Anholtextern bool
14099f82806c7b5109553cf806a5652e6b6198665094Eric Anholtir_has_call(ir_instruction *ir);
14109f82806c7b5109553cf806a5652e6b6198665094Eric Anholt
1411925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtextern void
1412925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtdo_set_program_inouts(exec_list *instructions, struct gl_program *prog);
1413925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt
1414e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
1415