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
29497baf4e4a6a0a2f247c7bfb9bf69a2b93c2c19fIan Romanick#include <stdio.h>
30497baf4e4a6a0a2f247c7bfb9bf69a2b93c2c19fIan Romanick#include <stdlib.h>
31ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt
32d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke#include "ralloc.h"
3311d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick#include "glsl_types.h"
340044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h"
3578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h"
368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick#include "ir_hierarchical_visitor.h"
37cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry#include "main/mtypes.h"
380044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick
39e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
40e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \defgroup IR Intermediate representation nodes
41e053d62aa573651abdd78666d299272c8219a3aaIan Romanick *
42e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * @{
43e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
44e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
45e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
46e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Class tags
47e053d62aa573651abdd78666d299272c8219a3aaIan Romanick *
48e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Each concrete class derived from \c ir_instruction has a value in this
49e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * enumerant.  The value for the type is stored in \c ir_instruction::ir_type
50e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * by the constructor.  While using type tags is not very C++, it is extremely
51e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * convenient.  For example, during debugging you can simply inspect
52e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to find out the actual type of the object.
53e053d62aa573651abdd78666d299272c8219a3aaIan Romanick *
54e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * In addition, it is possible to use a switch-statement based on \c
55e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to select different behavior for different object
56e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types.  For functions that have only slight differences for several object
57e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types, this allows writing very straightforward, readable code.
58e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
59d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholtenum ir_node_type {
60e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
61e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Zero is unused so that the IR validator can detect cases where
62e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \c ir_instruction::ir_type has not been initialized.
63e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
64d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_unset,
65d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_variable,
66d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_assignment,
67d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_call,
68d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_constant,
69d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_array,
70d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_record,
71d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_variable,
72d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_discard,
73d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_expression,
74d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_function,
75d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_function_signature,
76d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_if,
77d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_loop,
78d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_loop_jump,
79d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_return,
80d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_swizzle,
81d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_texture,
826dc89d221d43fad5f3edbb903997160af071bec0Brian Paul   ir_type_max /**< maximum ir_type enum number, for validation */
83d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt};
84d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt
85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions
87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
880044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node {
89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
90d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   enum ir_node_type ir_type;
91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
92a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt   /**
93a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt    * GCC 4.7+ and clang warn when deleting an ir_instruction unless
94a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt    * there's a virtual destructor present.  Because we almost
95a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt    * universally use ralloc for our memory management of
96a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt    * ir_instructions, the destructor doesn't need to do any work.
97a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt    */
98a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt   virtual ~ir_instruction()
99a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt   {
100a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt   }
101a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt
102e46a454305af64710ce8deadafc718f75363ac7eEric Anholt   /** ir_print_visitor helper for debugging. */
1034b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   void print(void) const;
104e46a454305af64710ce8deadafc718f75363ac7eEric Anholt
10578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *) = 0;
1068895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
1078273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_instruction *clone(void *mem_ctx,
1088273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt				 struct hash_table *ht) const = 0;
10978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
11044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /**
11144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \name IR instruction downcast functions
11244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    *
11344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * These functions either cast the object to a derived class or return
11444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \c NULL if the object's type does not match the specified derived class.
11544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * Additional downcast functions will be added as needed.
11644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    */
11744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@{*/
11844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_variable *          as_variable()         { return NULL; }
1196202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual class ir_function *          as_function()         { return NULL; }
12044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_dereference *       as_dereference()      { return NULL; }
121b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual class ir_dereference_array *	as_dereference_array() { return NULL; }
122d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual class ir_dereference_variable *as_dereference_variable() { return NULL; }
1236d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   virtual class ir_expression *        as_expression()       { return NULL; }
124fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual class ir_rvalue *            as_rvalue()           { return NULL; }
12501f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual class ir_loop *              as_loop()             { return NULL; }
126cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_assignment *        as_assignment()       { return NULL; }
127cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_call *              as_call()             { return NULL; }
128cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_return *            as_return()           { return NULL; }
1295ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual class ir_if *                as_if()               { return NULL; }
1307d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual class ir_swizzle *           as_swizzle()          { return NULL; }
1315c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual class ir_constant *          as_constant()         { return NULL; }
1321eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke   virtual class ir_discard *           as_discard()          { return NULL; }
13344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@}*/
13444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
13644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   ir_instruction()
137d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
138d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_unset;
139d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
143807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke/**
144807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke * The base class for all "values"/expression trees.
145807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke */
146fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction {
147fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic:
148f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke   const struct glsl_type *type;
149f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke
150807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke   virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const;
151ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick
152807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke   virtual void accept(ir_visitor *v)
153807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke   {
154807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke      v->visit(this);
155807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke   }
156807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke
157807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
158807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke
1596e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert   virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL);
160fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
161fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue * as_rvalue()
162fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
163fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return this;
164fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
165fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
16602939d643f878ce3a3dcd2e7b2c6f035c64ecda7Eric Anholt   ir_rvalue *as_rvalue_to_saturate();
16702939d643f878ce3a3dcd2e7b2c6f035c64ecda7Eric Anholt
168a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual bool is_lvalue() const
169fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
170fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return false;
171fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
172fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
1732b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
1742b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
1752b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
176a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const
1772b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   {
1782b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick      return NULL;
1792b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   }
1802b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
181b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
182b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   /**
183b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * If an r-value is a reference to a whole variable, get that variable
184b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    *
185b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * \return
186b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * Pointer to a variable that is completely dereferenced by the r-value.  If
187b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * the r-value is not a dereference or the dereference does not access the
188b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * entire variable (i.e., it's just one array element, struct field), \c NULL
189b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * is returned.
190b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    */
191b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
192b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
193b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return NULL;
194b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
195b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
196ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   /**
197ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * Determine if an r-value has the value zero
198ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
199ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * The base implementation of this function always returns \c false.  The
200ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * \c ir_constant class over-rides this function to return \c true \b only
201ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * for vector and scalar types that have all elements set to the value
202ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * zero (or \c false for booleans).
203ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
2049aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    * \sa ir_constant::has_value, ir_rvalue::is_one, ir_rvalue::is_negative_one,
2059aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    *     ir_constant::is_basis
206ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    */
207ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_zero() const;
208ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick
209ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   /**
210ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * Determine if an r-value has the value one
211ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
212ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * The base implementation of this function always returns \c false.  The
213ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * \c ir_constant class over-rides this function to return \c true \b only
214ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * for vector and scalar types that have all elements set to the value
215ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * one (or \c true for booleans).
216ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
2179aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_negative_one,
2189aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    *     ir_constant::is_basis
219ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    */
220ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_one() const;
221ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick
2228e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick   /**
2238e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * Determine if an r-value has the value negative one
2248e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    *
2258e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * The base implementation of this function always returns \c false.  The
2268e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * \c ir_constant class over-rides this function to return \c true \b only
2278e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * for vector and scalar types that have all elements set to the value
2289aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    * negative one.  For boolean types, the result is always \c false.
2298e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    *
2308e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one
2319aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    *     ir_constant::is_basis
2328e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    */
2338e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick   virtual bool is_negative_one() const;
2348e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick
2359aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner   /**
2369aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    * Determine if an r-value is a basis vector
2379aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    *
2389aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    * The base implementation of this function always returns \c false.  The
2399aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    * \c ir_constant class over-rides this function to return \c true \b only
2409aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    * for vector and scalar types that have one element set to the value one,
2419aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    * and the other elements set to the value zero.  For boolean types, the
2429aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    * result is always \c false.
2439aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    *
2449aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one,
2459aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    *     is_constant::is_negative_one
2469aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    */
2479aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner   virtual bool is_basis() const;
2489aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner
249807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke
250807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke   /**
251807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke    * Return a generic value of error_type.
252807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke    *
253807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke    * Allocation will be performed with 'mem_ctx' as ralloc owner.
254807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke    */
255807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke   static ir_rvalue *error_value(void *mem_ctx);
256807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke
257fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected:
2580a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke   ir_rvalue();
259fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke};
260fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
261fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
262e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
263e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Variable storage classes
264e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
266e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_var_auto = 0,     /**< Function local variables and globals. */
267e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_var_uniform,      /**< Variable declared as a uniform. */
268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
2707e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_var_inout,
271819d57fce94b20fa0d34da6f037f0a53c4a5bdc2Kenneth Graunke   ir_var_const_in,	/**< "in" param that must be a constant expression */
2727ce186358e881d1e30eda716a8dea73d2dab2ee9Brian Paul   ir_var_system_value, /**< Ex: front-face, instance-id, etc. */
2737e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_var_temporary	/**< Temporary variable generated during compilation. */
274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2765fc57f471b10e74546f999269a2a8f9186da9731Chad Versace/**
2775fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * \brief Layout qualifiers for gl_FragDepth.
2785fc57f471b10e74546f999269a2a8f9186da9731Chad Versace *
279b9eb4d8a59699e233255113acafae220c3d8fe3cKenneth Graunke * The AMD/ARB_conservative_depth extensions allow gl_FragDepth to be redeclared
2805fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * with a layout qualifier.
2815fc57f471b10e74546f999269a2a8f9186da9731Chad Versace */
2825fc57f471b10e74546f999269a2a8f9186da9731Chad Versaceenum ir_depth_layout {
2835fc57f471b10e74546f999269a2a8f9186da9731Chad Versace    ir_depth_layout_none, /**< No depth layout is specified. */
2845fc57f471b10e74546f999269a2a8f9186da9731Chad Versace    ir_depth_layout_any,
2855fc57f471b10e74546f999269a2a8f9186da9731Chad Versace    ir_depth_layout_greater,
2865fc57f471b10e74546f999269a2a8f9186da9731Chad Versace    ir_depth_layout_less,
2875fc57f471b10e74546f999269a2a8f9186da9731Chad Versace    ir_depth_layout_unchanged
2885fc57f471b10e74546f999269a2a8f9186da9731Chad Versace};
2895fc57f471b10e74546f999269a2a8f9186da9731Chad Versace
2905fc57f471b10e74546f999269a2a8f9186da9731Chad Versace/**
2915fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * \brief Convert depth layout qualifier to string.
2925fc57f471b10e74546f999269a2a8f9186da9731Chad Versace */
2935fc57f471b10e74546f999269a2a8f9186da9731Chad Versaceconst char*
2945fc57f471b10e74546f999269a2a8f9186da9731Chad Versacedepth_layout_string(ir_depth_layout layout);
295fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
29689d81ab16c05818b290ed735c1343d3abde449bfIan Romanick/**
29789d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * Description of built-in state associated with a uniform
29889d81ab16c05818b290ed735c1343d3abde449bfIan Romanick *
29989d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * \sa ir_variable::state_slots
30089d81ab16c05818b290ed735c1343d3abde449bfIan Romanick */
30189d81ab16c05818b290ed735c1343d3abde449bfIan Romanickstruct ir_state_slot {
30289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   int tokens[5];
30389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   int swizzle;
30489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick};
30589d81ab16c05818b290ed735c1343d3abde449bfIan Romanick
306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
3087e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_variable(const struct glsl_type *, const char *, ir_variable_mode);
309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3108273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const;
3114b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
31244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_variable *as_variable()
31344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
31444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
31544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
31644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
31778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
31878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
31978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
32078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
32178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
3228895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
3238895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3242d394d4877794d19756c3760d711524dca89f772Ian Romanick
325950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   /**
326950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * Get the string value for the interpolation qualifier
327950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    *
328046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * \return The string that would be used in a shader to specify \c
329046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * mode will be returned.
330046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    *
331c488150dea083a9677429b4185c6b20d7facd52bPaul Berry    * This function is used to generate error messages of the form "shader
332c488150dea083a9677429b4185c6b20d7facd52bPaul Berry    * uses %s interpolation qualifier", so in the case where there is no
333c488150dea083a9677429b4185c6b20d7facd52bPaul Berry    * interpolation qualifier, it returns "no".
334c488150dea083a9677429b4185c6b20d7facd52bPaul Berry    *
335046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * This function should only be used on a shader input or output variable.
336950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    */
337950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   const char *interpolation_string() const;
338950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick
3398b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick   /**
340baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry    * Determine how this variable should be interpolated based on its
341baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry    * interpolation qualifier (if present), whether it is gl_Color or
342baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry    * gl_SecondaryColor, and whether flatshading is enabled in the current GL
343baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry    * state.
344baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry    *
345baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry    * The return value will always be either INTERP_QUALIFIER_SMOOTH,
346baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry    * INTERP_QUALIFIER_NOPERSPECTIVE, or INTERP_QUALIFIER_FLAT.
347baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry    */
348baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry   glsl_interp_qualifier determine_interpolation_mode(bool flat_shade);
349baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry
350baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry   /**
351f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke    * Declared type of the variable
352f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke    */
353f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke   const struct glsl_type *type;
354f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke
355f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke   /**
35636b3ee2ffca2f260c9e5eb248b6e2b4ca2bf6fb1Brian Paul    * Declared name of the variable
357e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
360b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   /**
361b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Highest element accessed with a constant expression array index
362b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    *
363b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Not used for non-array variables.
364b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    */
365b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   unsigned max_array_access;
366b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
367e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
368e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Is the variable read-only?
369e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
370e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * This is set for variables declared as \c const, shader inputs,
371e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * and uniforms.
372e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
375a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
376a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
377e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
378bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    * Has this variable been used for reading or writing?
379bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    *
380bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    * Several GLSL semantic checks require knowledge of whether or not a
381bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    * variable has been used.  For example, it is an error to redeclare a
382bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    * variable as invariant after it has been used.
383f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt    *
384f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt    * This is only maintained in the ast_to_hir.cpp path, not in
385f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt    * Mesa's fixed function or ARB program paths.
386bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    */
387bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick   unsigned used:1;
388bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick
389bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick   /**
390f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt    * Has this variable been statically assigned?
391f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt    *
392f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt    * This answers whether the variable was assigned in any path of
393f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt    * the shader during ast_to_hir.  This doesn't answer whether it is
394f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt    * still written after dead code removal, nor is it maintained in
395f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt    * non-ast_to_hir.cpp (GLSL parsing) paths.
396f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt    */
397f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt   unsigned assigned:1;
398f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt
399f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt   /**
400e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Storage class of the variable.
401e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
402e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \sa ir_variable_mode
403e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
405e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
406e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
407e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Interpolation mode for shader inputs / outputs
408e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
409e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \sa ir_variable_interpolation
410e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
4129d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick
4139d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   /**
414e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \name ARB_fragment_coord_conventions
415e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * @{
416e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
4174a962170d7cf4243d6ae156fca20a6167388925dEric Anholt   unsigned origin_upper_left:1;
4184a962170d7cf4243d6ae156fca20a6167388925dEric Anholt   unsigned pixel_center_integer:1;
419e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /*@}*/
4204a962170d7cf4243d6ae156fca20a6167388925dEric Anholt
421326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   /**
422eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * Was the location explicitly set in the shader?
423eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    *
424eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * If the location is explicitly set in the shader, it \b cannot be changed
425eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * by the linker or by the API (e.g., calls to \c glBindAttribLocation have
426eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * no effect).
427eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    */
428eee68d3631813580a14fa51fda6f0c959279256cIan Romanick   unsigned explicit_location:1;
4291256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie   unsigned explicit_index:1;
430eee68d3631813580a14fa51fda6f0c959279256cIan Romanick
431eee68d3631813580a14fa51fda6f0c959279256cIan Romanick   /**
432f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    * Does this variable have an initializer?
433f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    *
434f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    * This is used by the linker to cross-validiate initializers of global
435f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    * variables.
436f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    */
437f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick   unsigned has_initializer:1;
438f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick
439f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick   /**
44022af08b410f47227ea27b06cce097ccbe0130540Ian Romanick    * \brief Layout qualifier for gl_FragDepth.
44122af08b410f47227ea27b06cce097ccbe0130540Ian Romanick    *
44222af08b410f47227ea27b06cce097ccbe0130540Ian Romanick    * This is not equal to \c ir_depth_layout_none if and only if this
44322af08b410f47227ea27b06cce097ccbe0130540Ian Romanick    * variable is \c gl_FragDepth and a layout qualifier is specified.
44422af08b410f47227ea27b06cce097ccbe0130540Ian Romanick    */
44522af08b410f47227ea27b06cce097ccbe0130540Ian Romanick   ir_depth_layout depth_layout;
44622af08b410f47227ea27b06cce097ccbe0130540Ian Romanick
44722af08b410f47227ea27b06cce097ccbe0130540Ian Romanick   /**
44869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * Storage location of the base of this variable
44969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
45069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * The precise meaning of this field depends on the nature of the variable.
45169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
45269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader input: one of the values from \c gl_vert_attrib.
45369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader output: one of the values from \c gl_vert_result.
45469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader input: one of the values from \c gl_frag_attrib.
45569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader output: one of the values from \c gl_frag_result.
456b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt    *   - Uniforms: Per-stage uniform slot number for default uniform block.
457b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt    *   - Uniforms: Index within the uniform block definition for UBO members.
45869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Other: This field is not currently used.
45969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
46069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * If the variable is a uniform, shader input, or shader output, and the
46169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * slot has not been assigned, the value will be -1.
46269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    */
46369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   int location;
46469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick
46569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   /**
466b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt    * Uniform block number for uniforms.
467b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt    *
468b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt    * This index is into the shader's list of uniform blocks, not the
469b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt    * linked program's merged list.
470b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt    *
471b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt    * If the variable is not in a uniform block, the value will be -1.
472b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt    */
473b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   int uniform_block;
474b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt
475b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt   /**
476f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie    * output index for dual source blending.
477f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie    */
478f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   int index;
479f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie
480f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie   /**
48189d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * Built-in state that backs this uniform
48289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    *
48389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * Once set at variable creation, \c state_slots must remain invariant.
48489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * This is because, ideally, this array would be shared by all clones of
48589d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * this variable in the IR tree.  In other words, we'd really like for it
48689d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * to be a fly-weight.
48789d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    *
48889d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * If the variable is not a uniform, \c num_state_slots will be zero and
48989d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * \c state_slots will be \c NULL.
49089d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    */
49189d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   /*@{*/
49289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   unsigned num_state_slots;    /**< Number of state slots used */
49389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   ir_state_slot *state_slots;  /**< State descriptors. */
49489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   /*@}*/
49589d81ab16c05818b290ed735c1343d3abde449bfIan Romanick
49689d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   /**
497c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    * Emit a warning if this variable is accessed.
498c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    */
499c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   const char *warn_extension;
500c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick
501c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   /**
502326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    * Value assigned in the initializer of a variable declared "const"
503326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    */
504326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   ir_constant *constant_value;
505f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick
506f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick   /**
507f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    * Constant expression assigned in the initializer of the variable
508f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    *
509f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    * \warning
510f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    * This field and \c ::constant_value are distinct.  Even if the two fields
511f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    * refer to constants with the same value, they must point to separate
512f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    * objects.
513f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick    */
514f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick   ir_constant *constant_initializer;
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
5199fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/**
5209fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or
5219fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype.
5229fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */
523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
524894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /* An ir_function_signature will be part of the list of signatures in
525894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    * an ir_function.
526894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    */
527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
528e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5308273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_function_signature *clone(void *mem_ctx,
5318273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					struct hash_table *ht) const;
53201a25bb64ecae156729794320f9a39733ff8eeaaKenneth Graunke   ir_function_signature *clone_prototype(void *mem_ctx,
53301a25bb64ecae156729794320f9a39733ff8eeaaKenneth Graunke					  struct hash_table *ht) const;
5344b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
53578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
53678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
53778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
53878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
53978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
5408895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
5418895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
5436e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert    * Attempt to evaluate this function as a constant expression,
5446e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert    * given a list of the actual parameters and the variable context.
5456e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert    * Returns NULL for non-built-ins.
546d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke    */
5476e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert   ir_constant *constant_expression_value(exec_list *actual_parameters, struct hash_table *variable_context);
548d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke
549d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke   /**
5500f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    * Get the name of the function for which this is a signature
5510f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    */
5520f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   const char *function_name() const;
5530f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
5540f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   /**
555df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * Get a handle to the function for which this is a signature
556df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    *
557df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * There is no setter function, this function returns a \c const pointer,
558df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * and \c ir_function_signature::_function is private for a reason.  The
559df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * only way to make a connection between a function and function signature
560df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * is via \c ir_function::add_signature.  This helps ensure that certain
561df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * invariants (i.e., a function signature is in the list of signatures for
562df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * its \c _function) are met.
563df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    *
564df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * \sa ir_function::add_signature
565df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    */
566df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   inline const class ir_function *function() const
567df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   {
568df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      return this->_function;
569df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   }
570df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick
571df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   /**
572abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * Check whether the qualifiers match between this signature's parameters
573abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * and the supplied parameter list.  If not, returns the name of the first
574abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * parameter with mismatched qualifiers (for use in error messages).
575abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    */
576abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   const char *qualifiers_match(exec_list *params);
577abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke
578abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   /**
579bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * Replace the current parameter list with the given one.  This is useful
580bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * if the current information came from a prototype, and either has invalid
581bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * or missing parameter names.
582bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    */
583bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   void replace_parameters(exec_list *new_params);
584bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke
585bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   /**
586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
593f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_variable of function parameters.
594f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    *
595f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * This represents the storage.  The paramaters passed in a particular
596f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * call will be in ir_call::actual_paramaters.
597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
5980044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
6009fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   /** Whether or not this function has a body (which may be empty). */
6019fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   unsigned is_defined:1;
6026a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
603f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke   /** Whether or not this function signature is a built-in. */
604f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke   unsigned is_builtin:1;
605f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke
606894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /** Body of instructions in the function. */
607894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   struct exec_list body;
608894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt
6096a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate:
6106a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   /** Function of which this signature is one overload. */
611df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   class ir_function *_function;
6126a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
6132ff7b121cad2892698ff1aa7690dd361ea2739a7Olivier Galibert   /** Function signature of which this one is a prototype clone */
6142ff7b121cad2892698ff1aa7690dd361ea2739a7Olivier Galibert   const ir_function_signature *origin;
6152ff7b121cad2892698ff1aa7690dd361ea2739a7Olivier Galibert
6166a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   friend class ir_function;
617363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert
618363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert   /**
619363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert    * Helper function to run a list of instructions for constant
620363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert    * expression evaluation.
621363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert    *
622363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert    * The hash table represents the values of the visible variables.
623363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert    * There are no scoping issues because the table is indexed on
624363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert    * ir_variable pointers, not variable names.
625363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert    *
626363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert    * Returns false if the expression is not constant, true otherwise,
627363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert    * and the value in *result if result is non-NULL.
628363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert    */
629363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert   bool constant_expression_evaluate_expression_list(const struct exec_list &body,
630363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert						     struct hash_table *variable_context,
631363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert						     ir_constant **result);
632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
634a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
635a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
6369fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name.
6379fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the
6389fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions.
639a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
640a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
641a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
642882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
643a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
6448273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const;
6454b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
6466202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual ir_function *as_function()
6476202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   {
6486202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke      return this;
6496202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   }
6506202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke
65178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
65278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
65378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
65478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
65578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
6568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
6578895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
6586a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   void add_signature(ir_function_signature *sig)
6596a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   {
660df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      sig->_function = this;
661df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      this->signatures.push_tail(sig);
6626a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   }
6636a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
664a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
66595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    * Get an iterator for the set of function signatures
66695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    */
66795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   exec_list_iterator iterator()
66895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   {
66995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick      return signatures.iterator();
67095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   }
67195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick
67295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   /**
6730d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that matches a set of actual parameters, taking implicit
674861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke    * conversions into account.  Also flags whether the match was exact.
675861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke    */
676861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke   ir_function_signature *matching_signature(const exec_list *actual_param,
677861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke					     bool *match_is_exact);
678861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke
679861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke   /**
680861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke    * Find a signature that matches a set of actual parameters, taking implicit
6810d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * conversions into account.
682471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
683b95897b89d36a25c237a021c299a4eb295856476Ian Romanick   ir_function_signature *matching_signature(const exec_list *actual_param);
684471471f83471481db0445e73f8c89e6a9149838eIan Romanick
685471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
6860d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that exactly matches a set of actual parameters without
6870d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * any implicit type conversions.
6880d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    */
689b95897b89d36a25c237a021c299a4eb295856476Ian Romanick   ir_function_signature *exact_matching_signature(const exec_list *actual_ps);
6900d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke
6910d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   /**
692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
695a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
69681f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke   /** Whether or not this function has a signature that isn't a built-in. */
69781f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke   bool has_user_signature();
698b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke
699471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
700f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_function_signature for each overloaded function with this name.
701471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
7020044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
703a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
7040f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
7050f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const
7060f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{
707df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   return this->_function->name;
7080f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick}
709a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
711a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
7123c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/**
7133c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements
7143c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */
7153c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction {
7163c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic:
7173c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if(ir_rvalue *condition)
7183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      : condition(condition)
7193c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
720d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_if;
7213c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
7223c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
7238273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const;
7244b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
7255ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual ir_if *as_if()
7265ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   {
7275ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt      return this;
7285ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   }
7295ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt
7303c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void accept(ir_visitor *v)
7313c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
7323c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      v->visit(this);
7333c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
7343c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
7358895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
7368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
7373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *condition;
738f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the then branch */
7393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  then_instructions;
740f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the else branch */
7413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  else_instructions;
7423c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick};
7433c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
7443c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
745fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/**
746fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure.
747fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */
748fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction {
749fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic:
7503b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_loop();
751fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
7528273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const;
7534b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
754fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   virtual void accept(ir_visitor *v)
755fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
756fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      v->visit(this);
757fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
758fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
7598895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
7608895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
76101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual ir_loop *as_loop()
76201f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   {
76301f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick      return this;
76401f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   }
76501f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick
766fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
767fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * Get an iterator for the instructions of the loop body
768fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
769fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list_iterator iterator()
770fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
771fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      return body_instructions.iterator();
772fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
773fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
774f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction that make up the body of the loop. */
775fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list body_instructions;
776fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
777fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
778fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * \name Loop counter and controls
7793b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
7803b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * Represents a loop like a FORTRAN \c do-loop.
7813b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
7823b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * \note
7833b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * If \c from and \c to are the same value, the loop will execute once.
784fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
785fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@{*/
7863b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_rvalue *from;             /** Value of the loop counter on the first
7873b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 * iteration of the loop.
7883b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 */
7893b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_rvalue *to;               /** Value of the loop counter on the last
7903b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 * iteration of the loop.
7913b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 */
792fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *increment;
793fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_variable *counter;
7943b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick
7953b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   /**
7963b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * Comparison operation in the loop terminator.
7973b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
7983b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * If any of the loop control fields are non-\c NULL, this field must be
7993b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal,
8003b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal.
8013b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    */
8023b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   int cmp;
803fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@}*/
804fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick};
805fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
806fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
8073c033637de7def553559c11d037f2e8bbb750f77Kenneth Graunkeclass ir_assignment : public ir_instruction {
808a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
809e617a53a74cd27a322fd2dd05ff1c66c6437fde3Eric Anholt   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition = NULL);
810a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
8115a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
8125a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Construct an assignment with an explicit write mask
8135a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
8145a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * \note
8155a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Since a write mask is supplied, the LHS must already be a bare
8165a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * \c ir_dereference.  The cannot be any swizzles in the LHS.
8175a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
8185a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition,
8195a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick		 unsigned write_mask);
8205a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
8218273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const;
8224b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
8236e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert   virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL);
824fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
82578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
82678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
82778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
82878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
82978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
8308895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
8318895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
832cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_assignment * as_assignment()
833cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
834cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
835cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
836cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
837a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
8385a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Get a whole variable written by an assignment
8395a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
8405a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * If the LHS of the assignment writes a whole variable, the variable is
8415a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * returned.  Otherwise \c NULL is returned.  Examples of whole-variable
8425a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * assignment are:
8435a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
8445a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Assigning to a scalar
8455a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Assigning to all components of a vector
8465a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Whole array (or matrix) assignment
8475a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Whole structure assignment
8485a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
8495a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_variable *whole_variable_written();
8505a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
8515a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
8525a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Set the LHS of an assignment
8535a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
8545a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   void set_lhs(ir_rvalue *lhs);
8555a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
8565a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
857a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
8585a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
8595a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * This should be treated as read only.  If you need to set the LHS of an
8605a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * assignment, use \c ir_assignment::set_lhs.
861a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
8625a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_dereference *lhs;
863a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
864a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
865a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
866a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
867fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
868a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
869a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
870a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
871a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
872fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
8735a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
8745a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
8755a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
8765a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Component mask written
8775a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
8785a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * For non-vector types in the LHS, this field will be zero.  For vector
8795a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * types, a bit will be set for each component that is written.  Note that
8805a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * for \c vec2 and \c vec3 types only the lower bits will ever be set.
881b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *
882b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * A partially-set write mask means that each enabled channel gets
883b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * the value from a consecutive channel of the rhs.  For example,
884b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * to write just .xyw of gl_FrontColor with color:
885b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *
886b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * (assign (constant bool (1)) (xyw)
887b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *     (var_ref gl_FragColor)
888b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *     (swiz xyw (var_ref color)))
8895a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
8905a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   unsigned write_mask:4;
891a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
892a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
8933b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when
894160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list.
8953b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */
896a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
897a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
898a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
899a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
900a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
901a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke   ir_unop_sign,
902a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
903a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
90444d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
905500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_exp,         /**< Log base e on gentype */
906500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_log,	        /**< Natural log on gentype */
90701665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
90801665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
909500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_f2i,         /**< Float-to-integer conversion. */
9108e31f961e6cfd9680b33647c053b0f708abb8a18Paul Berry   ir_unop_f2u,         /**< Float-to-unsigned conversion. */
911500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_i2f,         /**< Integer-to-float conversion. */
912500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_f2b,         /**< Float-to-boolean conversion */
913500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_b2f,         /**< Boolean-to-float conversion */
914500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_i2b,         /**< int-to-boolean conversion */
915500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_b2i,         /**< Boolean-to-int conversion */
916500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_u2f,         /**< Unsigned-to-float conversion. */
917500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_i2u,         /**< Integer-to-unsigned conversion. */
918500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_u2i,         /**< Unsigned-to-integer conversion. */
919500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_bitcast_i2f, /**< Bit-identical int-to-float "conversion" */
920500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_bitcast_f2i, /**< Bit-identical float-to-int "conversion" */
921500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_bitcast_u2f, /**< Bit-identical uint-to-float "conversion" */
922500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert   ir_unop_bitcast_f2u, /**< Bit-identical float-to-uint "conversion" */
9235e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt   ir_unop_any,
924a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
925a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
926a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
927a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
928a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
929a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
930a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
931a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
932d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt   ir_unop_fract,
933d85d25dd1f4fd281bd210ba6ba5135ba1e3b535fKenneth Graunke   ir_unop_round_even,
934a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
935a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
93657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /**
93757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    * \name Trigonometric operations.
93857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    */
93957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@{*/
94057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_sin,
94157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_cos,
942f2616e56de8a48360cae8f269727b58490555f4dIan Romanick   ir_unop_sin_reduced,    /**< Reduced range sin. [-pi, pi] */
943f2616e56de8a48360cae8f269727b58490555f4dIan Romanick   ir_unop_cos_reduced,    /**< Reduced range cos. [-pi, pi] */
94457e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@}*/
94557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke
946b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /**
947b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    * \name Partial derivatives.
948b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    */
949b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@{*/
950b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdx,
951b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdy,
952b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@}*/
953b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke
9543a5ce85cfa4914711e56c8cf831699242618928eIan Romanick   ir_unop_noise,
9553a5ce85cfa4914711e56c8cf831699242618928eIan Romanick
956007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   /**
957007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    * A sentinel marking the last of the unary operations.
958007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    */
959007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   ir_last_unop = ir_unop_noise,
960007f4881503b69055d65cfb20bd237673779786bKenneth Graunke
961a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
962a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
963a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
964a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
9658a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt
9668a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt   /**
9678a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Takes one of two combinations of arguments:
9688a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
9698a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, vecN)
9708a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, float)
9718a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
9728a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Does not take integer types.
9738a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    */
974a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
975a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
976a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
97714eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke    * \name Binary comparison operators which return a boolean vector.
97814eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke    * The type of both operands must be equal.
979a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
980a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
981a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
982a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
983a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
984a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
9854dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_equal,
9864dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_nequal,
987832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt   /**
988832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * Returns single boolean for whether all components of operands[0]
989832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * equal the components of operands[1].
990832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    */
9914dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_all_equal,
992832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt   /**
993832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * Returns single boolean for whether any component of operands[0]
994832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * is not equal to the corresponding component of operands[1].
995832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    */
9964dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_any_nequal,
997a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
998a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
999a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
1000a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
1001a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1002a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
1003a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
1004a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
1005a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
1006a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
1007a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
1008a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
1009a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1010a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
1011a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
1012a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
1013a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1014a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
1015a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
1016a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
1017a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1018007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   ir_binop_pow,
1019007f4881503b69055d65cfb20bd237673779786bKenneth Graunke
1020007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   /**
10212ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt    * Load a value the size of a given GLSL type from a uniform block.
10222ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt    *
10232ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt    * operand0 is the ir_constant uniform block index in the linked shader.
10242ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt    * operand1 is a byte offset within the uniform block.
10252ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt    */
10262ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt   ir_binop_ubo_load,
10272ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt
10282ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt   /**
1029007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    * A sentinel marking the last of the binary operations.
1030007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    */
10312ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt   ir_last_binop = ir_binop_ubo_load,
1032007f4881503b69055d65cfb20bd237673779786bKenneth Graunke
103311d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick   ir_quadop_vector,
103411d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick
1035007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   /**
1036007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    * A sentinel marking the last of all operations.
1037007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    */
1038d3de40742f50340789ae0df9af582e702e963300Ian Romanick   ir_last_opcode = ir_quadop_vector
1039a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1040a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1041fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
1042a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
104313f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick   /**
104413f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick    * Constructor for unary operation expressions
104513f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick    */
104613f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick   ir_expression(int op, const struct glsl_type *type, ir_rvalue *);
10476b937465d4aeab72fabcfe5250d477cf6790a521Eric Anholt   ir_expression(int op, ir_rvalue *);
104813f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick
104913f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick   /**
105013f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick    * Constructor for binary operation expressions
105113f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick    */
1052a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
1053fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
10546b937465d4aeab72fabcfe5250d477cf6790a521Eric Anholt   ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1);
1055a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
105611d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick   /**
105711d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick    * Constructor for quad operator expressions
105811d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick    */
105911d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick   ir_expression(int op, const struct glsl_type *type,
106011d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick		 ir_rvalue *, ir_rvalue *, ir_rvalue *, ir_rvalue *);
106111d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick
10626d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   virtual ir_expression *as_expression()
10636d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   {
10646d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt      return this;
10656d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   }
10666d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt
10678273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const;
10684b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1069e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
1070e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Attempt to constant-fold the expression
1071e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
10726e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert    * The "variable_context" hash table links ir_variable * to ir_constant *
10736e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert    * that represent the variables' values.  \c NULL represents an empty
10746e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert    * context.
10756e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert    *
1076e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * If the expression cannot be constant folded, this method will return
1077e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \c NULL.
1078e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
10796e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert   virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL);
1080fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
1081e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
1082e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Determine the number of operands used by an expression
1083e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
10847dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   static unsigned int get_num_operands(ir_expression_operation);
1085e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
1086e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
1087e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Determine the number of operands used by an expression
1088e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
10894b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   unsigned int get_num_operands() const
10907dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   {
109111d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick      return (this->operation == ir_quadop_vector)
109211d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick	 ? this->type->vector_elements : get_num_operands(operation);
10937dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   }
1094160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt
10953b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
10963b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Return a string representing this expression's operator.
10973b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
10983b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   const char *operator_string();
10993b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
11003b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
1101351525d534268b08c090f9ce42a67e9329a969aeIan Romanick    * Return a string representing this expression's operator.
1102351525d534268b08c090f9ce42a67e9329a969aeIan Romanick    */
1103351525d534268b08c090f9ce42a67e9329a969aeIan Romanick   static const char *operator_string(ir_expression_operation);
1104351525d534268b08c090f9ce42a67e9329a969aeIan Romanick
1105351525d534268b08c090f9ce42a67e9329a969aeIan Romanick
1106351525d534268b08c090f9ce42a67e9329a969aeIan Romanick   /**
11073b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Do a reverse-lookup to translate the given string into an operator.
11083b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
11093b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   static ir_expression_operation get_operator(const char *);
11103b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
111178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
111278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
111378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
111478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
111578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
11168895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
11178895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
111911d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick   ir_rvalue *operands[4];
1120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1123ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
1124d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke * HIR instruction representing a high-level function call, containing a list
1125d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke * of parameters and returning a value in the supplied temporary.
1126ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
1127d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunkeclass ir_call : public ir_instruction {
1128ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
1129d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke   ir_call(ir_function_signature *callee,
1130d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke	   ir_dereference_variable *return_deref,
1131d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke	   exec_list *actual_parameters)
1132d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke      : return_deref(return_deref), callee(callee)
1133ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
1134d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_call;
11359e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
1136471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
113766f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick      this->use_builtin = callee->is_builtin;
1138ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
1139ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
11408273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const;
11414b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
11426e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert   virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL);
1143fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
1144cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_call *as_call()
1145cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
1146cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
1147cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
1148cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
1149ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
1150ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
1151ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
1152ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
1153ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
11548895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
11558895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1156ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
11579878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
11589878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
11599878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
11609878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
11619878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
11629878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
11639878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
116493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
116593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
116693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
116793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
116893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
11690f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick      return callee->function_name();
117093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
117193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
1172e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
1173cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * Generates an inline version of the function before @ir,
1174d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke    * storing the return value in return_deref.
1175cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    */
1176d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke   void generate_inline(ir_instruction *ir);
1177d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke
1178d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke   /**
1179d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke    * Storage for the function's return value.
1180d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke    * This must be NULL if the return type is void.
1181d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke    */
1182d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke   ir_dereference_variable *return_deref;
1183cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
118482065fa20ee3f2880a070f1f4f75509b910ceddeKenneth Graunke   /**
118582065fa20ee3f2880a070f1f4f75509b910ceddeKenneth Graunke    * The specific function signature being called.
118682065fa20ee3f2880a070f1f4f75509b910ceddeKenneth Graunke    */
118782065fa20ee3f2880a070f1f4f75509b910ceddeKenneth Graunke   ir_function_signature *callee;
118882065fa20ee3f2880a070f1f4f75509b910ceddeKenneth Graunke
1189a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick   /* List of ir_rvalue of paramaters passed in this call. */
1190a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick   exec_list actual_parameters;
1191a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick
119266f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick   /** Should this call only bind to a built-in function? */
119366f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick   bool use_builtin;
1194ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
1195ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
1196ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
11979578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
11989578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
11999578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
12009578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
12019578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
12029578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
12039578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
12049578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
12059578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
12069578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
1207d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_unset;
12089578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
12099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
12109578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
12119578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
12129578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
12139578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
12149578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
12159578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
1216d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_return;
12179578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
12189578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
1219fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
12209578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
12219578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
1222d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_return;
12239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
12249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
12258273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_return *clone(void *mem_ctx, struct hash_table *) const;
12264b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1227cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_return *as_return()
1228cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
1229cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
1230cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
1231cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
1232fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
12339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
12349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
12359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
12369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
12379578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
12389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
12399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
12409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
12419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
12428895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
12438895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1244fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
12459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
1246f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1247f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1248f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/**
1249f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops
1250f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
1251f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue.  The \c break within a loop is
1252f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement.
1253f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
1254f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump
1255f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */
1256f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump {
1257f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic:
1258f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode {
1259f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_break,
1260f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_continue
1261f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   };
1262f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
12634b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   ir_loop_jump(jump_mode mode)
1264f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1265d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_loop_jump;
12660c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt      this->mode = mode;
1267f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1268f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
12698273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const;
12704b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1271f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   virtual void accept(ir_visitor *v)
1272f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1273f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      v->visit(this);
1274f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1275f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
12768895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
12778895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1278f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_break() const
1279f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1280f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_break;
1281f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1282f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1283f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_continue() const
1284f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1285f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_continue;
1286f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1287f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1288f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Mode selector for the jump instruction. */
1289f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode mode;
1290f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick};
129116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
129216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke/**
129316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke * IR instruction representing discard statements.
129416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke */
129516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeclass ir_discard : public ir_jump {
129616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkepublic:
129716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard()
129816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
1299d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_discard;
130016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = NULL;
130116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
130216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
130316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard(ir_rvalue *cond)
130416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
130584ee01f40acf88185484df386b7715034e7685c9Aras Pranckevicius      this->ir_type = ir_type_discard;
130616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = cond;
130716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
130816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
13098273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const;
131016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
131116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual void accept(ir_visitor *v)
131216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
131316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      v->visit(this);
131416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
131516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
131616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
131716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
13181eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke   virtual ir_discard *as_discard()
13191eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke   {
13201eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke      return this;
13211eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke   }
13221eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke
132316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_rvalue *condition;
132416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke};
13259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
13269578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
13279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
132881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
132981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture
133081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
133181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode {
1332e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_tex,		/**< Regular texture look-up */
1333e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_txb,		/**< Texture look-up with LOD bias */
1334e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_txl,		/**< Texture look-up with explicit LOD */
1335e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_txd,		/**< Texture look-up with partial derivatvies */
13361e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke   ir_txf,		/**< Texel fetch with explicit LOD */
13371e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke   ir_txs		/**< Texture size */
133881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
133981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
134081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
134181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
134281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture
134381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
134481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value
134581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes.  In the printed IR, these will
134681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as:
134781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
1348233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke *                                    Texel offset (0 or an expression)
1349233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke *                                    | Projection divisor
1350233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke *                                    | |  Shadow comparitor
1351233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke *                                    | |  |
1352233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke *                                    v v  v
1353233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (tex <type> <sampler> <coordinate> 0 1 ( ))
1354233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txb <type> <sampler> <coordinate> 0 1 ( ) <bias>)
1355233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txl <type> <sampler> <coordinate> 0 1 ( ) <lod>)
1356233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txd <type> <sampler> <coordinate> 0 1 ( ) (dPdx dPdy))
1357233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txf <type> <sampler> <coordinate> 0       <lod>)
13581e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke * (txs <type> <sampler> <lod>)
135981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
136081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue {
136181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic:
136281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_texture(enum ir_texture_opcode op)
1363b656df990f8c1d7468e11afa2079511d8b1febf4Kenneth Graunke      : op(op), coordinate(NULL), projector(NULL), shadow_comparitor(NULL),
1364b656df990f8c1d7468e11afa2079511d8b1febf4Kenneth Graunke        offset(NULL)
136581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   {
1366d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_texture;
136781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   }
136881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
13698273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const;
13704b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
13716e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert   virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL);
1372fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
137326d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual void accept(ir_visitor *v)
137426d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   {
137526d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke      v->visit(this);
137626d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   }
137726d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
137826d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
137926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
1380c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
1381c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Return a string representing the ir_texture_opcode.
1382c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
1383c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   const char *opcode_string();
1384c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
1385233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke   /** Set the sampler and type. */
1386233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke   void set_sampler(ir_dereference *sampler, const glsl_type *type);
138756d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke
1388c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
1389c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Do a reverse-lookup to translate a string into an ir_texture_opcode.
1390c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
1391c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   static ir_texture_opcode get_opcode(const char *);
1392c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
139381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   enum ir_texture_opcode op;
139481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
139581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Sampler to use for the texture access. */
139681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_dereference *sampler;
139781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
139881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Texture coordinate to sample */
139981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *coordinate;
140081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
140181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
140281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Value used for projective divide.
140381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
140481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no projective divide (the common case), this will be
140581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c NULL.  Optimization passes should check for this to point to a constant
140681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * of 1.0 and replace that with \c NULL.
140781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
140881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *projector;
140981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
141081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
141181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Coordinate used for comparison on shadow look-ups.
141281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
141381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no shadow comparison, this will be \c NULL.  For the
141481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c ir_txf opcode, this *must* be \c NULL.
141581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
141681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *shadow_comparitor;
141781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
1418c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke   /** Texel offset. */
1419c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke   ir_rvalue *offset;
142081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
142181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   union {
142281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *lod;		/**< Floating point LOD */
142381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *bias;		/**< Floating point LOD bias */
142481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      struct {
142581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdx;	/**< Partial derivative of coordinate wrt X */
142681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdy;	/**< Partial derivative of coordinate wrt Y */
142781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      } grad;
142881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   } lod_info;
142981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
143081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
143181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
1432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
1433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
1434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
1435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
1436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
1437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
1439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
1440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1441f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
1442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
1444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
1445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
1447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
1449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1451affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1452affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
1453affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
1454affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
1455affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
14566315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
14576315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count);
14586315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
145905a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt   ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
1460cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
14618273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const;
14624b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
14636e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert   virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL);
1464fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
14657d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual ir_swizzle *as_swizzle()
14667d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   {
14677d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt      return this;
14687d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   }
14697d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt
1470affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
1471affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
1472affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
1473affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
1474affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1475affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
1476affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
1477affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
1478affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
1479affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
14808895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
14818895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1482a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   bool is_lvalue() const
1483affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
1484a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
1485affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
1486affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
14872b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
14882b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
14892b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
1490a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const;
14912b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
1492affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
1493affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
14946315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
14956315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanickprivate:
14966315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   /**
14976315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * Initialize the mask component of a swizzle
14986315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    *
14996315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * This is used by the \c ir_swizzle constructors.
15006315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    */
15016315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   void init_mask(const unsigned *components, unsigned count);
1502affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
1503affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1504affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1505fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
1506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
15078273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0;
1508ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick
150944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
151044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
151144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
151244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
151344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
1514a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   bool is_lvalue() const;
1515fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
15162b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
15172b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
15182b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
1519a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const = 0;
1520a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert
1521a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert   /**
1522a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * Get the constant that is ultimately referenced by an r-value,
1523a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * in a constant expression evaluation context.
1524a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    *
1525a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * The offset is used when the reference is to a specific column of
1526a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * a matrix.
1527a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    */
1528a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert  virtual void constant_referenced(struct hash_table *variable_context, ir_constant *&store, int &offset) const = 0;
152970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
153070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
153170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
153270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference {
153370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
153470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_variable(ir_variable *var);
153570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
15368273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_variable *clone(void *mem_ctx,
15378273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					  struct hash_table *) const;
15384b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
15396e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert   virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL);
1540fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
1541d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual ir_dereference_variable *as_dereference_variable()
1542d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   {
1543d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt      return this;
1544d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   }
1545d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt
154670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
154770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
154870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
1549a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const
155070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
155136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->var;
155270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1553f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1554a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert   /**
1555a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * Get the constant that is ultimately referenced by an r-value,
1556a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * in a constant expression evaluation context.
1557a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    *
1558a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * The offset is used when the reference is to a specific column of
1559a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * a matrix.
1560a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    */
1561a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert   virtual void constant_referenced(struct hash_table *variable_context, ir_constant *&store, int &offset) const;
1562a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert
1563b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
1564b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
1565b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      /* ir_dereference_variable objects always dereference the entire
1566b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * variable.  However, if this dereference is dereferenced by anything
1567b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * else, the complete deferefernce chain is not a whole-variable
1568b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * dereference.  This method should only be called on the top most
1569b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * ir_rvalue in a dereference chain.
1570b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       */
1571b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return this->var;
1572b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
1573b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
1574c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1575c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1576c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1577c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1578c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1579f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
158036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
158136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   /**
158236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    * Object being dereferenced.
158336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    */
158436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_variable *var;
158570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
158670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
158770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
158870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference {
158970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
159070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
159170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
159270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
159370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
15948273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_array *clone(void *mem_ctx,
15958273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt				       struct hash_table *) const;
15964b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
15976e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert   virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL);
1598fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
1599b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual ir_dereference_array *as_dereference_array()
1600b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   {
1601b145e903694fa932ab1e0d955e889555193ab604Eric Anholt      return this;
1602b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   }
1603b145e903694fa932ab1e0d955e889555193ab604Eric Anholt
160470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
160570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
160670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
1607a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const
160870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
160936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->array->variable_referenced();
161070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
161170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
1612a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert   /**
1613a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * Get the constant that is ultimately referenced by an r-value,
1614a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * in a constant expression evaluation context.
1615a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    *
1616a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * The offset is used when the reference is to a specific column of
1617a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * a matrix.
1618a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    */
1619a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert   virtual void constant_referenced(struct hash_table *variable_context, ir_constant *&store, int &offset) const;
1620a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert
1621c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1622c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1623c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1624c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1625c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1626f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
162770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
162836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array;
162936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array_index;
163036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
163170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate:
163270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   void set_array(ir_rvalue *value);
163370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
163470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
163570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
163670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference {
163770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
163870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_rvalue *value, const char *field);
163970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
164070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_variable *var, const char *field);
164170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
16428273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_record *clone(void *mem_ctx,
16438273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					struct hash_table *) const;
16444b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
16456e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert   virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL);
1646fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
164770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
164870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
164970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
1650a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const
165170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
165236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->record->variable_referenced();
165370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1654f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1655a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert   /**
1656a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * Get the constant that is ultimately referenced by an r-value,
1657a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * in a constant expression evaluation context.
1658a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    *
1659a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * The offset is used when the reference is to a specific column of
1660a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    * a matrix.
1661a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert    */
1662a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert   virtual void constant_referenced(struct hash_table *variable_context, ir_constant *&store, int &offset) const;
1663a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert
1664c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1665c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1666c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1667c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1668c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1669f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
167036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
167136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *record;
167236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   const char *field;
1673a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1674a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1675a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1676be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/**
1677be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick * Data stored in an ir_constant
1678be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick */
1679be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanickunion ir_constant_data {
1680be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      unsigned u[16];
1681be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      int i[16];
1682be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      float f[16];
1683be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      bool b[16];
1684be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick};
1685be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1686be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1687fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
1688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
1689824b659d917a5f14a1f66b891d25036ef9f9adc6Ian Romanick   ir_constant(const struct glsl_type *type, const ir_constant_data *data);
16903c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
16913c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
16923c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
16933c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
1694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1695989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   /**
1696756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    * Construct an ir_constant from a list of ir_constant values
1697756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    */
1698756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   ir_constant(const struct glsl_type *type, exec_list *values);
1699756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick
1700756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   /**
1701989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * Construct an ir_constant from a scalar component of another ir_constant
1702989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1703989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * The new \c ir_constant inherits the type of the component from the
1704989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * source constant.
1705989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1706989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * \note
1707989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * In the case of a matrix constant, the new constant is a scalar, \b not
1708989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * a vector.
1709989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    */
1710989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   ir_constant(const ir_constant *c, unsigned i);
1711989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick
1712ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke   /**
1713ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke    * Return a new ir_constant of the specified type containing all zeros.
1714ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke    */
1715ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke   static ir_constant *zero(void *mem_ctx, const glsl_type *type);
1716ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke
17178273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const;
17184b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
17196e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert   virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL);
1720fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
17215c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual ir_constant *as_constant()
17225c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   {
17235c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt      return this;
17245c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   }
17255c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt
172678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
172778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
172878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
172978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
173078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
17318895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
17328895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1733a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
173431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * Get a particular component of a constant as a specific type
173531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    *
173631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * This is useful, for example, to get a value from an integer constant
173731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * as a float or bool.  This appears frequently when constructors are
173831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * called with all constant parameters.
173931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    */
174031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@{*/
174131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   bool get_bool_component(unsigned i) const;
174231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   float get_float_component(unsigned i) const;
174331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   int get_int_component(unsigned i) const;
174431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   unsigned get_uint_component(unsigned i) const;
174531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@}*/
174631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick
174774e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   ir_constant *get_array_element(unsigned i) const;
174874e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke
1749b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick   ir_constant *get_record_field(const char *name);
1750b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick
175131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /**
17528ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    * Copy the values on another constant at a given offset.
17538ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    *
17548ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    * The offset is ignored for array or struct copies, it's only for
17558ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    * scalars or vectors into vectors or matrices.
17568ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    *
17578ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    * With identical types on both sides and zero offset it's clone()
17588ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    * without creating a new object.
17598ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    */
17608ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert
17618ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert   void copy_offset(ir_constant *src, int offset);
17628ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert
17638ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert   /**
17648ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    * Copy the values on another constant at a given offset and
17658ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    * following an assign-like mask.
17668ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    *
17678ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    * The mask is ignored for scalars.
17688ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    *
17698ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    * Note that this function only handles what assign can handle,
17708ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    * i.e. at most a vector as source and a column of a matrix as
17718ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    * destination.
17728ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert    */
17738ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert
17748ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert   void copy_masked_offset(ir_constant *src, int offset, unsigned int mask);
17758ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert
17768ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert   /**
17771e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    * Determine whether a constant has the same value as another constant
177838e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick    *
17798e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * \sa ir_constant::is_zero, ir_constant::is_one,
17809aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner    * ir_constant::is_negative_one, ir_constant::is_basis
17811e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    */
17821e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick   bool has_value(const ir_constant *) const;
17831e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick
1784ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_zero() const;
1785ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_one() const;
17868e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick   virtual bool is_negative_one() const;
17879aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner   virtual bool is_basis() const;
178838e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick
178938e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick   /**
1790a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
1791a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1792a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
1793a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
1794a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
1795a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1796be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick   union ir_constant_data value;
17977f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick
179874e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   /* Array elements */
179974e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   ir_constant **array_elements;
180074e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke
180174e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   /* Structure fields */
18027f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick   exec_list components;
1803710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick
1804710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanickprivate:
1805710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   /**
1806710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    * Parameterless constructor only used by the clone method
1807710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    */
1808710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   ir_constant(void);
1809a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1810a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1811e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/*@}*/
1812e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
1813e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
1814e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Apply a visitor to each IR node in a list
1815e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
181670b74928a220aff024664714877defb0caedf33fEric Anholtvoid
181770b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor);
1818adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
1819e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
1820e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Validate invariants on each IR node in a list
1821e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
182253cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholtvoid validate_ir_tree(exec_list *instructions);
182353cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholt
182402c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickstruct _mesa_glsl_parse_state;
182502c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickstruct gl_shader_program;
182602c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick
182702c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick/**
182802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * Detect whether an unlinked shader contains static recursion
182902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick *
183002c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * If the list of instructions is determined to contain static recursion,
183102c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c _mesa_glsl_error will be called to emit error messages for each function
183202c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * that is in the recursion cycle.
183302c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick */
183402c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickvoid
183502c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickdetect_recursion_unlinked(struct _mesa_glsl_parse_state *state,
183602c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick			  exec_list *instructions);
183702c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick
183802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick/**
183902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * Detect whether a linked shader contains static recursion
184002c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick *
184102c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * If the list of instructions is determined to contain static recursion,
184202c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c link_error_printf will be called to emit error messages for each function
184302c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * that is in the recursion cycle.  In addition,
184402c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c gl_shader_program::LinkStatus will be set to false.
184502c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick */
184602c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickvoid
184702c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickdetect_recursion_linked(struct gl_shader_program *prog,
184802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick			exec_list *instructions);
184902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick
1850f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick/**
1851f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * Make a clone of each IR instruction in a list
1852f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick *
1853f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param in   List of IR instructions that are to be cloned
1854f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param out  List to hold the cloned instructions
1855f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick */
1856f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanickvoid
18578273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholtclone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in);
1858f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick
1859adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
1860adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
1861adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
1862e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
1863c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
186481168351a7f493fcde55e621af046c9301aa93e9Kenneth Graunke_mesa_glsl_initialize_functions(_mesa_glsl_parse_state *state);
1865c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
186660e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickextern void
1867d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick_mesa_glsl_release_functions(void);
1868d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick
1869d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanickextern void
187060e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickreparent_ir(exec_list *list, void *mem_ctx);
187160e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanick
18721cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonsecastruct glsl_symbol_table;
18734ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick
18744ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickextern void
18754ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickimport_prototypes(const exec_list *source, exec_list *dest,
18761cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonseca		  struct glsl_symbol_table *symbols, void *mem_ctx);
18774ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick
18789f82806c7b5109553cf806a5652e6b6198665094Eric Anholtextern bool
18799f82806c7b5109553cf806a5652e6b6198665094Eric Anholtir_has_call(ir_instruction *ir);
18809f82806c7b5109553cf806a5652e6b6198665094Eric Anholt
1881925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtextern void
1882cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berrydo_set_program_inouts(exec_list *instructions, struct gl_program *prog,
1883cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry                      bool is_fragment_shader);
1884925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt
18851ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanickextern char *
18861ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanickprototype_string(const glsl_type *return_type, const char *name,
18871ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick		 exec_list *parameters);
18881ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick
1889e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
1890