ir.h revision ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74e
1986b8f798272d3ae2898617c8fb089156a5941c0Ian Romanick/* -*- c++ -*- */
2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*
3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation
4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"),
7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation
8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions:
11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next
13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the
14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software.
15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE.
23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
25e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#pragma once
26e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#ifndef IR_H
27e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#define IR_H
28e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
29ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt#include <cstdio>
30ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt#include <cstdlib>
31ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt
32f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worthextern "C" {
33f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worth#include <talloc.h>
34f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worth}
35f961e4458f1e894ca782c1627b69cdee993a16f8Carl Worth
360044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h"
3778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h"
388895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick#include "ir_hierarchical_visitor.h"
390044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick
40e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
41e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \defgroup IR Intermediate representation nodes
42e053d62aa573651abdd78666d299272c8219a3aaIan Romanick *
43e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * @{
44e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
45e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
46e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
47e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Class tags
48e053d62aa573651abdd78666d299272c8219a3aaIan Romanick *
49e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Each concrete class derived from \c ir_instruction has a value in this
50e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * enumerant.  The value for the type is stored in \c ir_instruction::ir_type
51e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * by the constructor.  While using type tags is not very C++, it is extremely
52e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * convenient.  For example, during debugging you can simply inspect
53e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to find out the actual type of the object.
54e053d62aa573651abdd78666d299272c8219a3aaIan Romanick *
55e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * In addition, it is possible to use a switch-statement based on \c
56e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to select different behavior for different object
57e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types.  For functions that have only slight differences for several object
58e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types, this allows writing very straightforward, readable code.
59e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
60d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholtenum ir_node_type {
61e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
62e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Zero is unused so that the IR validator can detect cases where
63e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \c ir_instruction::ir_type has not been initialized.
64e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
65d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_unset,
66d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_variable,
67d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_assignment,
68d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_call,
69d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_constant,
70d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_array,
71d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_record,
72d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_variable,
73d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_discard,
74d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_expression,
75d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_function,
76d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_function_signature,
77d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_if,
78d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_loop,
79d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_loop_jump,
80d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_return,
81d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_swizzle,
82d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_texture,
836dc89d221d43fad5f3edbb903997160af071bec0Brian Paul   ir_type_max /**< maximum ir_type enum number, for validation */
84d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt};
85d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt
86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions
88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
890044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node {
90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
91d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   enum ir_node_type ir_type;
92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
94e46a454305af64710ce8deadafc718f75363ac7eEric Anholt   /** ir_print_visitor helper for debugging. */
954b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   void print(void) const;
96e46a454305af64710ce8deadafc718f75363ac7eEric Anholt
9778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *) = 0;
988895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
998273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_instruction *clone(void *mem_ctx,
1008273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt				 struct hash_table *ht) const = 0;
10178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
10244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /**
10344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \name IR instruction downcast functions
10444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    *
10544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * These functions either cast the object to a derived class or return
10644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \c NULL if the object's type does not match the specified derived class.
10744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * Additional downcast functions will be added as needed.
10844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    */
10944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@{*/
11044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_variable *          as_variable()         { return NULL; }
1116202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual class ir_function *          as_function()         { return NULL; }
11244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_dereference *       as_dereference()      { return NULL; }
113b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual class ir_dereference_array *	as_dereference_array() { return NULL; }
114d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual class ir_dereference_variable *as_dereference_variable() { return NULL; }
1156d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   virtual class ir_expression *        as_expression()       { return NULL; }
116fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual class ir_rvalue *            as_rvalue()           { return NULL; }
11701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual class ir_loop *              as_loop()             { return NULL; }
118cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_assignment *        as_assignment()       { return NULL; }
119cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_call *              as_call()             { return NULL; }
120cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_return *            as_return()           { return NULL; }
1215ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual class ir_if *                as_if()               { return NULL; }
1227d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual class ir_swizzle *           as_swizzle()          { return NULL; }
1235c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual class ir_constant *          as_constant()         { return NULL; }
12444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@}*/
12544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
12744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   ir_instruction()
128d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
129d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_unset;
1300a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke      type = NULL;
131d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
135fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction {
136fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic:
1378273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const = 0;
138ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick
139fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value() = 0;
140fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
141fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue * as_rvalue()
142fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
143fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return this;
144fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
145fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
146fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual bool is_lvalue()
147fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
148fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return false;
149fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
150fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
1512b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
1522b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
1532b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
1542b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   virtual ir_variable *variable_referenced()
1552b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   {
1562b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick      return NULL;
1572b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   }
1582b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
159b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
160b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   /**
161b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * If an r-value is a reference to a whole variable, get that variable
162b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    *
163b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * \return
164b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * Pointer to a variable that is completely dereferenced by the r-value.  If
165b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * the r-value is not a dereference or the dereference does not access the
166b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * entire variable (i.e., it's just one array element, struct field), \c NULL
167b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * is returned.
168b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    */
169b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
170b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
171b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return NULL;
172b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
173b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
174ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   /**
175ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * Determine if an r-value has the value zero
176ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
177ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * The base implementation of this function always returns \c false.  The
178ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * \c ir_constant class over-rides this function to return \c true \b only
179ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * for vector and scalar types that have all elements set to the value
180ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * zero (or \c false for booleans).
181ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
182ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * \sa ir_constant::has_value, ir_rvalue::is_one
183ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    */
184ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_zero() const;
185ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick
186ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   /**
187ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * Determine if an r-value has the value one
188ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
189ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * The base implementation of this function always returns \c false.  The
190ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * \c ir_constant class over-rides this function to return \c true \b only
191ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * for vector and scalar types that have all elements set to the value
192ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * one (or \c true for booleans).
193ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
194ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * \sa ir_constant::has_value, ir_rvalue::is_zero
195ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    */
196ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_one() const;
197ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick
198fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected:
1990a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke   ir_rvalue();
200fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke};
201fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
202fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
203e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
204e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Variable storage classes
205e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
207e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_var_auto = 0,     /**< Function local variables and globals. */
208e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_var_uniform,      /**< Variable declared as a uniform. */
209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
2117e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_var_inout,
2127e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_var_temporary	/**< Temporary variable generated during compilation. */
213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
215a22426dc4c934673e8f0af5c70a67505a4de7aadCarl Worthenum ir_variable_interpolation {
216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
221fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
2247e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_variable(const struct glsl_type *, const char *, ir_variable_mode);
225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2268273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const;
2274b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
22844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_variable *as_variable()
22944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
23044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
23144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
23244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
23378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
23478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
23578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
23678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
23778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2388895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2398895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
2402d394d4877794d19756c3760d711524dca89f772Ian Romanick
241950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   /**
242950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * Get the string value for the interpolation qualifier
243950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    *
244046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * \return The string that would be used in a shader to specify \c
245046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * mode will be returned.
246046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    *
247046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * This function should only be used on a shader input or output variable.
248950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    */
249950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   const char *interpolation_string() const;
250950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick
2518b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick   /**
2528b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * Calculate the number of slots required to hold this variable
2538b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    *
2548b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * This is used to determine how many uniform or varying locations a variable
2558b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * occupies.  The count is in units of floating point components.
2568b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    */
2578b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick   unsigned component_slots() const;
2588b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick
259e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
260e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Delcared name of the variable
261e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
264b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   /**
265b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Highest element accessed with a constant expression array index
266b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    *
267b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Not used for non-array variables.
268b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    */
269b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   unsigned max_array_access;
270b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
271e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
272e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Is the variable read-only?
273e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
274e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * This is set for variables declared as \c const, shader inputs,
275e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * and uniforms.
276e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
281e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
282e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Storage class of the variable.
283e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
284e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \sa ir_variable_mode
285e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
287e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
288e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
289e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Interpolation mode for shader inputs / outputs
290e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
291e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \sa ir_variable_interpolation
292e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
2949d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick
2959d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   /**
2969d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * Flag that the whole array is assignable
2979d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    *
2989d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * In GLSL 1.20 and later whole arrays are assignable (and comparable for
2999d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * equality).  This flag enables this behavior.
3009d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    */
3019d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   unsigned array_lvalue:1;
302326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt
303e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
304e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \name ARB_fragment_coord_conventions
305e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * @{
306e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
3074a962170d7cf4243d6ae156fca20a6167388925dEric Anholt   unsigned origin_upper_left:1;
3084a962170d7cf4243d6ae156fca20a6167388925dEric Anholt   unsigned pixel_center_integer:1;
309e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /*@}*/
3104a962170d7cf4243d6ae156fca20a6167388925dEric Anholt
311326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   /**
312eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * Was the location explicitly set in the shader?
313eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    *
314eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * If the location is explicitly set in the shader, it \b cannot be changed
315eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * by the linker or by the API (e.g., calls to \c glBindAttribLocation have
316eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * no effect).
317eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    */
318eee68d3631813580a14fa51fda6f0c959279256cIan Romanick   unsigned explicit_location:1;
319eee68d3631813580a14fa51fda6f0c959279256cIan Romanick
320eee68d3631813580a14fa51fda6f0c959279256cIan Romanick   /**
32169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * Storage location of the base of this variable
32269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
32369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * The precise meaning of this field depends on the nature of the variable.
32469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
32569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader input: one of the values from \c gl_vert_attrib.
32669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader output: one of the values from \c gl_vert_result.
32769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader input: one of the values from \c gl_frag_attrib.
32869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader output: one of the values from \c gl_frag_result.
32969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Uniforms: Per-stage uniform slot number.
33069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Other: This field is not currently used.
33169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
33269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * If the variable is a uniform, shader input, or shader output, and the
33369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * slot has not been assigned, the value will be -1.
33469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    */
33569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   int location;
33669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick
33769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   /**
338c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    * Emit a warning if this variable is accessed.
339c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    */
340c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   const char *warn_extension;
341c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick
342c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   /**
343326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    * Value assigned in the initializer of a variable declared "const"
344326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    */
345326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   ir_constant *constant_value;
346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
348a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
349a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
3509fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/**
3519fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or
3529fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype.
3539fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */
354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
355894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /* An ir_function_signature will be part of the list of signatures in
356894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    * an ir_function.
357894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    */
358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
359e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3618273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_function_signature *clone(void *mem_ctx,
3628273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					struct hash_table *ht) const;
3634b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
36478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
36578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
36678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
36778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
36878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
3698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
3708895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
371a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
3720f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    * Get the name of the function for which this is a signature
3730f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    */
3740f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   const char *function_name() const;
3750f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
3760f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   /**
377df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * Get a handle to the function for which this is a signature
378df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    *
379df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * There is no setter function, this function returns a \c const pointer,
380df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * and \c ir_function_signature::_function is private for a reason.  The
381df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * only way to make a connection between a function and function signature
382df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * is via \c ir_function::add_signature.  This helps ensure that certain
383df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * invariants (i.e., a function signature is in the list of signatures for
384df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * its \c _function) are met.
385df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    *
386df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * \sa ir_function::add_signature
387df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    */
388df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   inline const class ir_function *function() const
389df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   {
390df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      return this->_function;
391df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   }
392df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick
393df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   /**
394abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * Check whether the qualifiers match between this signature's parameters
395abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * and the supplied parameter list.  If not, returns the name of the first
396abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * parameter with mismatched qualifiers (for use in error messages).
397abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    */
398abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   const char *qualifiers_match(exec_list *params);
399abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke
400abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   /**
401bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * Replace the current parameter list with the given one.  This is useful
402bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * if the current information came from a prototype, and either has invalid
403bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * or missing parameter names.
404bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    */
405bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   void replace_parameters(exec_list *new_params);
406bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke
407bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   /**
408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
415f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_variable of function parameters.
416f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    *
417f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * This represents the storage.  The paramaters passed in a particular
418f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * call will be in ir_call::actual_paramaters.
419a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
4200044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4229fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   /** Whether or not this function has a body (which may be empty). */
4239fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   unsigned is_defined:1;
4246a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
425f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke   /** Whether or not this function signature is a built-in. */
426f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke   unsigned is_builtin:1;
427f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke
428894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /** Body of instructions in the function. */
429894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   struct exec_list body;
430894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt
4316a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate:
4326a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   /** Function of which this signature is one overload. */
433df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   class ir_function *_function;
4346a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
4356a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   friend class ir_function;
436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
4409fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name.
4419fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the
4429fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions.
443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
446882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4488273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const;
4494b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
4506202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual ir_function *as_function()
4516202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   {
4526202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke      return this;
4536202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   }
4546202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke
45578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
45678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
45778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
45878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
45978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
4608895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4618895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
4626a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   void add_signature(ir_function_signature *sig)
4636a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   {
464df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      sig->_function = this;
465df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      this->signatures.push_tail(sig);
4666a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   }
4676a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
46995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    * Get an iterator for the set of function signatures
47095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    */
47195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   exec_list_iterator iterator()
47295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   {
47395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick      return signatures.iterator();
47495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   }
47595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick
47695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   /**
4770d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that matches a set of actual parameters, taking implicit
4780d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * conversions into account.
479471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
480b95897b89d36a25c237a021c299a4eb295856476Ian Romanick   ir_function_signature *matching_signature(const exec_list *actual_param);
481471471f83471481db0445e73f8c89e6a9149838eIan Romanick
482471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
4830d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that exactly matches a set of actual parameters without
4840d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * any implicit type conversions.
4850d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    */
486b95897b89d36a25c237a021c299a4eb295856476Ian Romanick   ir_function_signature *exact_matching_signature(const exec_list *actual_ps);
4870d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke
4880d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   /**
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
49381f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke   /** Whether or not this function has a signature that isn't a built-in. */
49481f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke   bool has_user_signature();
495b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke
496471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
497f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_function_signature for each overloaded function with this name.
498471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
4990044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
5010f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
5020f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const
5030f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{
504df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   return this->_function->name;
5050f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick}
506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5093c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/**
5103c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements
5113c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */
5123c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction {
5133c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic:
5143c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if(ir_rvalue *condition)
5153c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      : condition(condition)
5163c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
517d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_if;
5183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
5193c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
5208273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const;
5214b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
5225ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual ir_if *as_if()
5235ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   {
5245ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt      return this;
5255ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   }
5265ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt
5273c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void accept(ir_visitor *v)
5283c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
5293c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      v->visit(this);
5303c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
5313c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
5328895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
5338895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
5343c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *condition;
535f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the then branch */
5363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  then_instructions;
537f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the else branch */
5383c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  else_instructions;
5393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick};
5403c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
5413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
542fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/**
543fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure.
544fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */
545fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction {
546fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic:
5473b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_loop();
548fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
5498273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const;
5504b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
551fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   virtual void accept(ir_visitor *v)
552fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
553fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      v->visit(this);
554fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
555fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
5568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
5578895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
55801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual ir_loop *as_loop()
55901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   {
56001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick      return this;
56101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   }
56201f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick
563fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
564fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * Get an iterator for the instructions of the loop body
565fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
566fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list_iterator iterator()
567fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
568fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      return body_instructions.iterator();
569fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
570fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
571f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction that make up the body of the loop. */
572fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list body_instructions;
573fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
574fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
575fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * \name Loop counter and controls
5763b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
5773b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * Represents a loop like a FORTRAN \c do-loop.
5783b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
5793b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * \note
5803b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * If \c from and \c to are the same value, the loop will execute once.
581fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
582fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@{*/
5833b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_rvalue *from;             /** Value of the loop counter on the first
5843b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 * iteration of the loop.
5853b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 */
5863b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_rvalue *to;               /** Value of the loop counter on the last
5873b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 * iteration of the loop.
5883b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 */
589fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *increment;
590fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_variable *counter;
5913b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick
5923b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   /**
5933b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * Comparison operation in the loop terminator.
5943b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
5953b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * If any of the loop control fields are non-\c NULL, this field must be
5963b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal,
5973b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal.
5983b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    */
5993b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   int cmp;
600fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@}*/
601fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick};
602fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
603fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
6043c033637de7def553559c11d037f2e8bbb750f77Kenneth Graunkeclass ir_assignment : public ir_instruction {
605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
606fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
6085a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
6095a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Construct an assignment with an explicit write mask
6105a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
6115a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * \note
6125a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Since a write mask is supplied, the LHS must already be a bare
6135a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * \c ir_dereference.  The cannot be any swizzles in the LHS.
6145a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
6155a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition,
6165a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick		 unsigned write_mask);
6175a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
6188273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const;
6194b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
620fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
621fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
62278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
62378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
62478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
62578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
62678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
6278895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
6288895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
629cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_assignment * as_assignment()
630cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
631cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
632cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
633cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
634a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
6355a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Get a whole variable written by an assignment
6365a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
6375a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * If the LHS of the assignment writes a whole variable, the variable is
6385a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * returned.  Otherwise \c NULL is returned.  Examples of whole-variable
6395a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * assignment are:
6405a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
6415a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Assigning to a scalar
6425a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Assigning to all components of a vector
6435a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Whole array (or matrix) assignment
6445a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Whole structure assignment
6455a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
6465a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_variable *whole_variable_written();
6475a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
6485a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
6495a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Set the LHS of an assignment
6505a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
6515a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   void set_lhs(ir_rvalue *lhs);
6525a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
6535a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
654a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
6555a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
6565a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * This should be treated as read only.  If you need to set the LHS of an
6575a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * assignment, use \c ir_assignment::set_lhs.
658a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
6595a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_dereference *lhs;
660a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
661a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
662a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
663a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
664fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
665a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
666a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
667a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
668a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
669fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
6705a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
6715a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
6725a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
6735a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Component mask written
6745a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
6755a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * For non-vector types in the LHS, this field will be zero.  For vector
6765a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * types, a bit will be set for each component that is written.  Note that
6775a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * for \c vec2 and \c vec3 types only the lower bits will ever be set.
678b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *
679b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * A partially-set write mask means that each enabled channel gets
680b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * the value from a consecutive channel of the rhs.  For example,
681b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * to write just .xyw of gl_FrontColor with color:
682b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *
683b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * (assign (constant bool (1)) (xyw)
684b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *     (var_ref gl_FragColor)
685b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *     (swiz xyw (var_ref color)))
6865a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
6875a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   unsigned write_mask:4;
688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
689a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
6903b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when
691160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list.
6923b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */
693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
695a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
696a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
697a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
698a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke   ir_unop_sign,
699a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
700a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
70144d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
702bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt   ir_unop_exp,      /**< Log base e on gentype */
703bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt   ir_unop_log,	     /**< Natural log on gentype */
70401665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
70501665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
706a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
707a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
708dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_f2b,      /**< Float-to-boolean conversion */
709dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_b2f,      /**< Boolean-to-float conversion */
710c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_i2b,      /**< int-to-boolean conversion */
711c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_b2i,      /**< Boolean-to-int conversion */
7126c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
7135e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt   ir_unop_any,
714a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
715a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
716a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
717a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
718a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
719a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
720a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
721a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
722d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt   ir_unop_fract,
723d85d25dd1f4fd281bd210ba6ba5135ba1e3b535fKenneth Graunke   ir_unop_round_even,
724a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
725a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
72657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /**
72757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    * \name Trigonometric operations.
72857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    */
72957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@{*/
73057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_sin,
73157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_cos,
73257e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@}*/
73357e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke
734b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /**
735b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    * \name Partial derivatives.
736b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    */
737b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@{*/
738b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdx,
739b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdy,
740b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@}*/
741b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke
7423a5ce85cfa4914711e56c8cf831699242618928eIan Romanick   ir_unop_noise,
7433a5ce85cfa4914711e56c8cf831699242618928eIan Romanick
744007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   /**
745007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    * A sentinel marking the last of the unary operations.
746007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    */
747007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   ir_last_unop = ir_unop_noise,
748007f4881503b69055d65cfb20bd237673779786bKenneth Graunke
749a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
750a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
751a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
752a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
7538a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt
7548a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt   /**
7558a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Takes one of two combinations of arguments:
7568a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
7578a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, vecN)
7588a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, float)
7598a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
7608a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Does not take integer types.
7618a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    */
762a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
763a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
764a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
76514eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke    * \name Binary comparison operators which return a boolean vector.
76614eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke    * The type of both operands must be equal.
767a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
768a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
769a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
770a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
771a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
772a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
7734dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_equal,
7744dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_nequal,
775832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt   /**
776832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * Returns single boolean for whether all components of operands[0]
777832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * equal the components of operands[1].
778832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    */
7794dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_all_equal,
780832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt   /**
781832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * Returns single boolean for whether any component of operands[0]
782832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * is not equal to the corresponding component of operands[1].
783832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    */
7844dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_any_nequal,
785a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
786a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
787a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
788a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
789a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
790a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
791a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
792a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
793a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
794a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
795a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
796a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
797a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
798a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
799a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
800a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
801a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
802a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
803a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
804a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
805a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
806007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   ir_binop_pow,
807007f4881503b69055d65cfb20bd237673779786bKenneth Graunke
808007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   /**
809007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    * A sentinel marking the last of the binary operations.
810007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    */
811007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   ir_last_binop = ir_binop_pow,
812007f4881503b69055d65cfb20bd237673779786bKenneth Graunke
813007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   /**
814007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    * A sentinel marking the last of all operations.
815007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    */
816007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   ir_last_opcode = ir_last_binop
817a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
818a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
819fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
820a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
821a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
822fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
823a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
8246d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   virtual ir_expression *as_expression()
8256d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   {
8266d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt      return this;
8276d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   }
8286d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt
8298273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const;
8304b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
831e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
832e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Attempt to constant-fold the expression
833e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
834e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * If the expression cannot be constant folded, this method will return
835e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \c NULL.
836e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
837fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
838fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
839e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
840e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Determine the number of operands used by an expression
841e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
8427dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   static unsigned int get_num_operands(ir_expression_operation);
843e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
844e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
845e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Determine the number of operands used by an expression
846e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
8474b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   unsigned int get_num_operands() const
8487dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   {
8497dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke      return get_num_operands(operation);
8507dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   }
851160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt
8523b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
8533b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Return a string representing this expression's operator.
8543b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
8553b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   const char *operator_string();
8563b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
8573b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
858351525d534268b08c090f9ce42a67e9329a969aeIan Romanick    * Return a string representing this expression's operator.
859351525d534268b08c090f9ce42a67e9329a969aeIan Romanick    */
860351525d534268b08c090f9ce42a67e9329a969aeIan Romanick   static const char *operator_string(ir_expression_operation);
861351525d534268b08c090f9ce42a67e9329a969aeIan Romanick
862351525d534268b08c090f9ce42a67e9329a969aeIan Romanick
863351525d534268b08c090f9ce42a67e9329a969aeIan Romanick   /**
8643b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Do a reverse-lookup to translate the given string into an operator.
8653b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
8663b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   static ir_expression_operation get_operator(const char *);
8673b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
86878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
86978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
87078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
87178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
87278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
8738895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
8748895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
875a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
876fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *operands[2];
877a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
878a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
879a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
880ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
881ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
882ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
883fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue {
884ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
8851f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_call(ir_function_signature *callee, exec_list *actual_parameters)
886b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(callee)
887ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
888d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_call;
8899e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
8909e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      type = callee->return_type;
891471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
892ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
893ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
8948273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const;
8954b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
896fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
897fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
898cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_call *as_call()
899cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
900cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
901cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
902cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
903ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
904ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
905ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
906ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
907ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
9088895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
9098895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
910ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
911ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
912e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth    *
913e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth    * Any allocation will be performed with 'ctx' as talloc owner.
914ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
915e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth   static ir_call *get_error_instruction(void *ctx);
916ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
9179878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   /**
9189878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
9199878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
9209878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
9219878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
9229878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
9239878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
9249878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
92593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
92693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
92793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
92893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
92993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
9300f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick      return callee->function_name();
93193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
93293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
933e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
934e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Get the function signature bound to this function call
935e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
9361f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_function_signature *get_callee()
937cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
938cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return callee;
939cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
940cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
941cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   /**
942792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick    * Set the function call target
943792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick    */
9441f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   void set_callee(ir_function_signature *sig);
945792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick
946792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick   /**
947cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * Generates an inline version of the function before @ir,
948cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * returning the return value of the function.
949cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    */
950cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_rvalue *generate_inline(ir_instruction *ir);
951cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
952a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick   /* List of ir_rvalue of paramaters passed in this call. */
953a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick   exec_list actual_parameters;
954a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick
955ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
956471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
957b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(NULL)
958471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
959d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_call;
960471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
961471471f83471481db0445e73f8c89e6a9149838eIan Romanick
9621f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_function_signature *callee;
963ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
964ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
965ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
9669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
9679578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
9689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
9699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
9709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
9719578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
9729578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
9739578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
9749578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
9759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
976d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_unset;
9779578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
9789578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
9799578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
9809578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
9819578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
9829578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
9839578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
9849578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
985d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_return;
9869578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
9879578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
988fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
9899578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
9909578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
991d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_return;
9929578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
9939578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
9948273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_return *clone(void *mem_ctx, struct hash_table *) const;
9954b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
996cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_return *as_return()
997cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
998cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
999cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
1000cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
1001fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
10029578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
10039578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
10049578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
10059578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
10069578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
10079578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
10089578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
10099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
10109578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
10118895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
10128895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1013fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
10149578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
1015f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1016f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1017f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/**
1018f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops
1019f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
1020f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue.  The \c break within a loop is
1021f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement.
1022f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
1023f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump
1024f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */
1025f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump {
1026f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic:
1027f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode {
1028f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_break,
1029f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_continue
1030f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   };
1031f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
10324b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   ir_loop_jump(jump_mode mode)
1033f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1034d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_loop_jump;
10350c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt      this->mode = mode;
10360c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt      this->loop = loop;
1037f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1038f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
10398273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const;
10404b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1041f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   virtual void accept(ir_visitor *v)
1042f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1043f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      v->visit(this);
1044f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1045f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
10468895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
10478895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1048f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_break() const
1049f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1050f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_break;
1051f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1052f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1053f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_continue() const
1054f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1055f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_continue;
1056f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1057f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1058f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Mode selector for the jump instruction. */
1059f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode mode;
10600c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholtprivate:
10610c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt   /** Loop containing this break instruction. */
10620c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt   ir_loop *loop;
1063f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick};
106416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
106516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke/**
106616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke * IR instruction representing discard statements.
106716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke */
106816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeclass ir_discard : public ir_jump {
106916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkepublic:
107016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard()
107116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
1072d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_discard;
107316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = NULL;
107416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
107516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
107616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard(ir_rvalue *cond)
107716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
107884ee01f40acf88185484df386b7715034e7685c9Aras Pranckevicius      this->ir_type = ir_type_discard;
107916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = cond;
108016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
108116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
10828273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const;
108316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
108416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual void accept(ir_visitor *v)
108516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
108616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      v->visit(this);
108716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
108816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
108916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
109016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
109116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_rvalue *condition;
109216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke};
10939578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
10949578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
10959578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
109681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
109781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture
109881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
109981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode {
1100e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_tex,		/**< Regular texture look-up */
1101e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_txb,		/**< Texture look-up with LOD bias */
1102e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_txl,		/**< Texture look-up with explicit LOD */
1103e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_txd,		/**< Texture look-up with partial derivatvies */
1104e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_txf		/**< Texel fetch with explicit LOD */
110581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
110681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
110781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
110881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
110981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture
111081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
111181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value
111281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes.  In the printed IR, these will
111381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as:
111481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
111581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              Texel offset
111681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       Projection divisor
111781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       |   Shadow comparitor
111881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              |       |   |
111981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *                              v       v   v
112081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (tex (sampler) (coordinate) (0 0 0) (1) ( ))
112181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias))
112281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod))
112381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy))
112481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * (txf (sampler) (coordinate) (0 0 0)         (lod))
112581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
112681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue {
112781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic:
112881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_texture(enum ir_texture_opcode op)
1129b97efa5db5fce2e0d9a4c61a939c85b240c89170Kenneth Graunke      : op(op), projector(NULL), shadow_comparitor(NULL)
113081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   {
1131d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_texture;
113281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   }
113381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
11348273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const;
11354b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1136fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1137fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
113826d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual void accept(ir_visitor *v)
113926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   {
114026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke      v->visit(this);
114126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   }
114226d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
114326d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
114426d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
1145c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
1146c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Return a string representing the ir_texture_opcode.
1147c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
1148c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   const char *opcode_string();
1149c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
115056d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke   /** Set the sampler and infer the type. */
115156d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke   void set_sampler(ir_dereference *sampler);
115256d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke
1153c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
1154c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Do a reverse-lookup to translate a string into an ir_texture_opcode.
1155c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
1156c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   static ir_texture_opcode get_opcode(const char *);
1157c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
115881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   enum ir_texture_opcode op;
115981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
116081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Sampler to use for the texture access. */
116181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_dereference *sampler;
116281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
116381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Texture coordinate to sample */
116481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *coordinate;
116581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
116681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
116781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Value used for projective divide.
116881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
116981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no projective divide (the common case), this will be
117081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c NULL.  Optimization passes should check for this to point to a constant
117181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * of 1.0 and replace that with \c NULL.
117281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
117381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *projector;
117481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
117581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
117681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Coordinate used for comparison on shadow look-ups.
117781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
117881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no shadow comparison, this will be \c NULL.  For the
117981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c ir_txf opcode, this *must* be \c NULL.
118081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
118181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *shadow_comparitor;
118281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
118381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Explicit texel offsets. */
118481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   signed char offsets[3];
118581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
118681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   union {
118781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *lod;		/**< Floating point LOD */
118881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *bias;		/**< Floating point LOD bias */
118981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      struct {
119081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdx;	/**< Partial derivative of coordinate wrt X */
119181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdy;	/**< Partial derivative of coordinate wrt Y */
119281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      } grad;
119381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   } lod_info;
119481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
119581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
119681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
1197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
1198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
1199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
1200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
1201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
1202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
1204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
1205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1206f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
1207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
1209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
1210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
1212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
1214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1216affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1217affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
1218affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
1219affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
1220affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
12216315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
12226315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count);
12236315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
122405a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt   ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
1225cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
12268273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const;
12274b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1228fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1229fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
12307d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual ir_swizzle *as_swizzle()
12317d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   {
12327d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt      return this;
12337d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   }
12347d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt
1235affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
1236affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
1237affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
1238affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
1239affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1240affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
1241affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
1242affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
1243affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
1244affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
12458895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
12468895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1247affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   bool is_lvalue()
1248affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
1249a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
1250affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
1251affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
12522b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
12532b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
12542b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
12552b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   virtual ir_variable *variable_referenced();
12562b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
1257affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
1258affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
12596315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
12606315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanickprivate:
12616315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   /**
12626315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * Initialize the mask component of a swizzle
12636315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    *
12646315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * This is used by the \c ir_swizzle constructors.
12656315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    */
12666315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   void init_mask(const unsigned *components, unsigned count);
1267affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
1268affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1269affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1270fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
1271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
12728273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0;
1273ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick
127444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
127544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
127644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
127744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
127844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
1279c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt   bool is_lvalue();
1280fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
12812b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
12822b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
12832b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
128470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced() = 0;
128570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
128670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
128770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
128870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference {
128970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
129070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_variable(ir_variable *var);
129170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
12928273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_variable *clone(void *mem_ctx,
12938273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					  struct hash_table *) const;
12944b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1295fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1296fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
1297d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual ir_dereference_variable *as_dereference_variable()
1298d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   {
1299d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt      return this;
1300d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   }
1301d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt
130270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
130370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
130470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
130570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
130670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
130736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->var;
130870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1309f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1310b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
1311b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
1312b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      /* ir_dereference_variable objects always dereference the entire
1313b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * variable.  However, if this dereference is dereferenced by anything
1314b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * else, the complete deferefernce chain is not a whole-variable
1315b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * dereference.  This method should only be called on the top most
1316b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * ir_rvalue in a dereference chain.
1317b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       */
1318b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return this->var;
1319b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
1320b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
1321c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1322c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1323c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1324c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1325c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1326f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
132736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
132836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   /**
132936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    * Object being dereferenced.
133036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    */
133136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_variable *var;
133270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
133370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
133470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
133570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference {
133670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
133770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
133870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
133970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
134070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
13418273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_array *clone(void *mem_ctx,
13428273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt				       struct hash_table *) const;
13434b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1344fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1345fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
1346b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual ir_dereference_array *as_dereference_array()
1347b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   {
1348b145e903694fa932ab1e0d955e889555193ab604Eric Anholt      return this;
1349b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   }
1350b145e903694fa932ab1e0d955e889555193ab604Eric Anholt
135170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
135270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
135370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
135470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
135570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
135636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->array->variable_referenced();
135770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
135870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
1359c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1360c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1361c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1362c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1363c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1364f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
136570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
136636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array;
136736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array_index;
136836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
136970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate:
137070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   void set_array(ir_rvalue *value);
137170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
137270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
137370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
137470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference {
137570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
137670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_rvalue *value, const char *field);
137770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
137870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_variable *var, const char *field);
137970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
13808273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_record *clone(void *mem_ctx,
13818273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					struct hash_table *) const;
13824b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1383fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1384fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
138570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
138670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
138770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
138870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   virtual ir_variable *variable_referenced()
138970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
139036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->record->variable_referenced();
139170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1392f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1393c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1394c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1395c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1396c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1397c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1398f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
139936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
140036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *record;
140136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   const char *field;
1402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1405be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/**
1406be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick * Data stored in an ir_constant
1407be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick */
1408be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanickunion ir_constant_data {
1409be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      unsigned u[16];
1410be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      int i[16];
1411be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      float f[16];
1412be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      bool b[16];
1413be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick};
1414be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1415be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1416fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
1417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
1418824b659d917a5f14a1f66b891d25036ef9f9adc6Ian Romanick   ir_constant(const struct glsl_type *type, const ir_constant_data *data);
14193c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
14203c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
14213c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
14223c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
1423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1424989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   /**
1425756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    * Construct an ir_constant from a list of ir_constant values
1426756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    */
1427756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   ir_constant(const struct glsl_type *type, exec_list *values);
1428756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick
1429756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   /**
1430989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * Construct an ir_constant from a scalar component of another ir_constant
1431989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1432989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * The new \c ir_constant inherits the type of the component from the
1433989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * source constant.
1434989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1435989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * \note
1436989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * In the case of a matrix constant, the new constant is a scalar, \b not
1437989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * a vector.
1438989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    */
1439989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   ir_constant(const ir_constant *c, unsigned i);
1440989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick
1441ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke   /**
1442ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke    * Return a new ir_constant of the specified type containing all zeros.
1443ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke    */
1444ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke   static ir_constant *zero(void *mem_ctx, const glsl_type *type);
1445ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke
14468273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const;
14474b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1448fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1449fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
14505c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual ir_constant *as_constant()
14515c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   {
14525c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt      return this;
14535c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   }
14545c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt
145578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
145678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
145778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
145878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
145978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
14608895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
14618895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
146331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * Get a particular component of a constant as a specific type
146431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    *
146531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * This is useful, for example, to get a value from an integer constant
146631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * as a float or bool.  This appears frequently when constructors are
146731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * called with all constant parameters.
146831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    */
146931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@{*/
147031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   bool get_bool_component(unsigned i) const;
147131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   float get_float_component(unsigned i) const;
147231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   int get_int_component(unsigned i) const;
147331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   unsigned get_uint_component(unsigned i) const;
147431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@}*/
147531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick
147674e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   ir_constant *get_array_element(unsigned i) const;
147774e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke
1478b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick   ir_constant *get_record_field(const char *name);
1479b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick
148031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /**
14811e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    * Determine whether a constant has the same value as another constant
148238e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick    *
148338e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick    * \sa ir_constant::is_zero, ir_constant::is_one
14841e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    */
14851e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick   bool has_value(const ir_constant *) const;
14861e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick
1487ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_zero() const;
1488ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_one() const;
148938e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick
149038e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick   /**
1491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
1492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
1494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
1495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
1496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1497be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick   union ir_constant_data value;
14987f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick
149974e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   /* Array elements */
150074e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   ir_constant **array_elements;
150174e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke
150274e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   /* Structure fields */
15037f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick   exec_list components;
1504710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick
1505710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanickprivate:
1506710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   /**
1507710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    * Parameterless constructor only used by the clone method
1508710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    */
1509710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   ir_constant(void);
1510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1512e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/*@}*/
1513e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
1514e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
1515e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Apply a visitor to each IR node in a list
1516e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
151770b74928a220aff024664714877defb0caedf33fEric Anholtvoid
151870b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor);
1519adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
1520e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
1521e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Validate invariants on each IR node in a list
1522e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
152353cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholtvoid validate_ir_tree(exec_list *instructions);
152453cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholt
1525f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick/**
1526f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * Make a clone of each IR instruction in a list
1527f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick *
1528f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param in   List of IR instructions that are to be cloned
1529f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param out  List to hold the cloned instructions
1530f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick */
1531f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanickvoid
15328273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholtclone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in);
1533f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick
1534adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
1535adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
1536adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
1537e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
1538c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
1539c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions,
1540c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt				struct _mesa_glsl_parse_state *state);
1541c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
154260e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickextern void
1543d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick_mesa_glsl_release_functions(void);
1544d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick
1545d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanickextern void
154660e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickreparent_ir(exec_list *list, void *mem_ctx);
154760e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanick
15481cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonsecastruct glsl_symbol_table;
15494ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick
15504ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickextern void
15514ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickimport_prototypes(const exec_list *source, exec_list *dest,
15521cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonseca		  struct glsl_symbol_table *symbols, void *mem_ctx);
15534ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick
15549f82806c7b5109553cf806a5652e6b6198665094Eric Anholtextern bool
15559f82806c7b5109553cf806a5652e6b6198665094Eric Anholtir_has_call(ir_instruction *ir);
15569f82806c7b5109553cf806a5652e6b6198665094Eric Anholt
1557925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtextern void
1558925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtdo_set_program_inouts(exec_list *instructions, struct gl_program *prog);
1559925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt
1560e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
1561