ir.h revision a52b53b56e2b5d5853345d8bcd2a4ff50e495c20
1986b8f798272d3ae2898617c8fb089156a5941c0Ian Romanick/* -*- c++ -*- */
2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*
3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation
4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"),
7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation
8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions:
11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next
13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the
14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software.
15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE.
23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
25e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#pragma once
26e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#ifndef IR_H
27e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#define IR_H
28e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
29497baf4e4a6a0a2f247c7bfb9bf69a2b93c2c19fIan Romanick#include <stdio.h>
30497baf4e4a6a0a2f247c7bfb9bf69a2b93c2c19fIan Romanick#include <stdlib.h>
31ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt
32d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke#include "ralloc.h"
3311d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick#include "glsl_types.h"
340044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h"
3578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h"
368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick#include "ir_hierarchical_visitor.h"
370044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick
38e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
39e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \defgroup IR Intermediate representation nodes
40e053d62aa573651abdd78666d299272c8219a3aaIan Romanick *
41e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * @{
42e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
43e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
44e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
45e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Class tags
46e053d62aa573651abdd78666d299272c8219a3aaIan Romanick *
47e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Each concrete class derived from \c ir_instruction has a value in this
48e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * enumerant.  The value for the type is stored in \c ir_instruction::ir_type
49e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * by the constructor.  While using type tags is not very C++, it is extremely
50e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * convenient.  For example, during debugging you can simply inspect
51e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to find out the actual type of the object.
52e053d62aa573651abdd78666d299272c8219a3aaIan Romanick *
53e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * In addition, it is possible to use a switch-statement based on \c
54e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to select different behavior for different object
55e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types.  For functions that have only slight differences for several object
56e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types, this allows writing very straightforward, readable code.
57e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
58d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholtenum ir_node_type {
59e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
60e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Zero is unused so that the IR validator can detect cases where
61e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \c ir_instruction::ir_type has not been initialized.
62e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
63d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_unset,
64d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_variable,
65d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_assignment,
66d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_call,
67d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_constant,
68d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_array,
69d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_record,
70d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_dereference_variable,
71d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_discard,
72d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_expression,
73d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_function,
74d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_function_signature,
75d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_if,
76d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_loop,
77d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_loop_jump,
78d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_return,
79d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_swizzle,
80d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   ir_type_texture,
816dc89d221d43fad5f3edbb903997160af071bec0Brian Paul   ir_type_max /**< maximum ir_type enum number, for validation */
82d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt};
83d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt
84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions
86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
870044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node {
88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
89d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt   enum ir_node_type ir_type;
90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
92e46a454305af64710ce8deadafc718f75363ac7eEric Anholt   /** ir_print_visitor helper for debugging. */
934b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   void print(void) const;
94e46a454305af64710ce8deadafc718f75363ac7eEric Anholt
9578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *) = 0;
968895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
978273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_instruction *clone(void *mem_ctx,
988273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt				 struct hash_table *ht) const = 0;
9978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
10044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /**
10144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \name IR instruction downcast functions
10244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    *
10344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * These functions either cast the object to a derived class or return
10444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \c NULL if the object's type does not match the specified derived class.
10544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * Additional downcast functions will be added as needed.
10644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    */
10744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@{*/
10844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_variable *          as_variable()         { return NULL; }
1096202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual class ir_function *          as_function()         { return NULL; }
11044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_dereference *       as_dereference()      { return NULL; }
111b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual class ir_dereference_array *	as_dereference_array() { return NULL; }
112d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual class ir_dereference_variable *as_dereference_variable() { return NULL; }
1136d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   virtual class ir_expression *        as_expression()       { return NULL; }
114fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual class ir_rvalue *            as_rvalue()           { return NULL; }
11501f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual class ir_loop *              as_loop()             { return NULL; }
116cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_assignment *        as_assignment()       { return NULL; }
117cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_call *              as_call()             { return NULL; }
118cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_return *            as_return()           { return NULL; }
1195ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual class ir_if *                as_if()               { return NULL; }
1207d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual class ir_swizzle *           as_swizzle()          { return NULL; }
1215c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual class ir_constant *          as_constant()         { return NULL; }
1221eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke   virtual class ir_discard *           as_discard()          { return NULL; }
12344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@}*/
12444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
12644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   ir_instruction()
127d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
128d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_unset;
1290a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke      type = NULL;
130d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
134fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction {
135fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic:
1368273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const = 0;
137ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick
138fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value() = 0;
139fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
140fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue * as_rvalue()
141fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
142fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return this;
143fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
144fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
14502939d643f878ce3a3dcd2e7b2c6f035c64ecda7Eric Anholt   ir_rvalue *as_rvalue_to_saturate();
14602939d643f878ce3a3dcd2e7b2c6f035c64ecda7Eric Anholt
147a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual bool is_lvalue() const
148fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
149fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return false;
150fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
151fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
1522b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
1532b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
1542b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
155a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const
1562b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   {
1572b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick      return NULL;
1582b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   }
1592b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
160b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
161b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   /**
162b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * If an r-value is a reference to a whole variable, get that variable
163b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    *
164b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * \return
165b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * Pointer to a variable that is completely dereferenced by the r-value.  If
166b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * the r-value is not a dereference or the dereference does not access the
167b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * entire variable (i.e., it's just one array element, struct field), \c NULL
168b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    * is returned.
169b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick    */
170b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
171b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
172b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return NULL;
173b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
174b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
175ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   /**
176ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * Determine if an r-value has the value zero
177ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
178ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * The base implementation of this function always returns \c false.  The
179ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * \c ir_constant class over-rides this function to return \c true \b only
180ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * for vector and scalar types that have all elements set to the value
181ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * zero (or \c false for booleans).
182ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
1838e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * \sa ir_constant::has_value, ir_rvalue::is_one, ir_rvalue::is_negative_one
184ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    */
185ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_zero() const;
186ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick
187ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   /**
188ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * Determine if an r-value has the value one
189ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
190ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * The base implementation of this function always returns \c false.  The
191ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * \c ir_constant class over-rides this function to return \c true \b only
192ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * for vector and scalar types that have all elements set to the value
193ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    * one (or \c true for booleans).
194ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    *
1958e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_negative_one
196ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick    */
197ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_one() const;
198ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick
1998e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick   /**
2008e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * Determine if an r-value has the value negative one
2018e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    *
2028e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * The base implementation of this function always returns \c false.  The
2038e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * \c ir_constant class over-rides this function to return \c true \b only
2048e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * for vector and scalar types that have all elements set to the value
2058e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * negative one.  For boolean times, the result is always \c false.
2068e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    *
2078e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one
2088e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    */
2098e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick   virtual bool is_negative_one() const;
2108e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick
211fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected:
2120a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke   ir_rvalue();
213fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke};
214fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
215fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
216e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
217e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Variable storage classes
218e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
220e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_var_auto = 0,     /**< Function local variables and globals. */
221e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_var_uniform,      /**< Variable declared as a uniform. */
222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
2247e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_var_inout,
225819d57fce94b20fa0d34da6f037f0a53c4a5bdc2Kenneth Graunke   ir_var_const_in,	/**< "in" param that must be a constant expression */
2267ce186358e881d1e30eda716a8dea73d2dab2ee9Brian Paul   ir_var_system_value, /**< Ex: front-face, instance-id, etc. */
2277e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_var_temporary	/**< Temporary variable generated during compilation. */
228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
230a22426dc4c934673e8f0af5c70a67505a4de7aadCarl Worthenum ir_variable_interpolation {
231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2365fc57f471b10e74546f999269a2a8f9186da9731Chad Versace/**
2375fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * \brief Layout qualifiers for gl_FragDepth.
2385fc57f471b10e74546f999269a2a8f9186da9731Chad Versace *
2395fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * The AMD_conservative_depth extension allows gl_FragDepth to be redeclared
2405fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * with a layout qualifier.
2415fc57f471b10e74546f999269a2a8f9186da9731Chad Versace */
2425fc57f471b10e74546f999269a2a8f9186da9731Chad Versaceenum ir_depth_layout {
2435fc57f471b10e74546f999269a2a8f9186da9731Chad Versace    ir_depth_layout_none, /**< No depth layout is specified. */
2445fc57f471b10e74546f999269a2a8f9186da9731Chad Versace    ir_depth_layout_any,
2455fc57f471b10e74546f999269a2a8f9186da9731Chad Versace    ir_depth_layout_greater,
2465fc57f471b10e74546f999269a2a8f9186da9731Chad Versace    ir_depth_layout_less,
2475fc57f471b10e74546f999269a2a8f9186da9731Chad Versace    ir_depth_layout_unchanged
2485fc57f471b10e74546f999269a2a8f9186da9731Chad Versace};
2495fc57f471b10e74546f999269a2a8f9186da9731Chad Versace
2505fc57f471b10e74546f999269a2a8f9186da9731Chad Versace/**
2515fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * \brief Convert depth layout qualifier to string.
2525fc57f471b10e74546f999269a2a8f9186da9731Chad Versace */
2535fc57f471b10e74546f999269a2a8f9186da9731Chad Versaceconst char*
2545fc57f471b10e74546f999269a2a8f9186da9731Chad Versacedepth_layout_string(ir_depth_layout layout);
255fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
25689d81ab16c05818b290ed735c1343d3abde449bfIan Romanick/**
25789d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * Description of built-in state associated with a uniform
25889d81ab16c05818b290ed735c1343d3abde449bfIan Romanick *
25989d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * \sa ir_variable::state_slots
26089d81ab16c05818b290ed735c1343d3abde449bfIan Romanick */
26189d81ab16c05818b290ed735c1343d3abde449bfIan Romanickstruct ir_state_slot {
26289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   int tokens[5];
26389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   int swizzle;
26489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick};
26589d81ab16c05818b290ed735c1343d3abde449bfIan Romanick
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
2687e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick   ir_variable(const struct glsl_type *, const char *, ir_variable_mode);
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2708273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const;
2714b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
27244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_variable *as_variable()
27344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
27444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
27544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
27644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
27778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
27878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
27978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
28078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
28178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2828895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2838895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
2842d394d4877794d19756c3760d711524dca89f772Ian Romanick
285950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   /**
286950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    * Get the string value for the interpolation qualifier
287950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    *
288046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * \return The string that would be used in a shader to specify \c
289046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * mode will be returned.
290046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    *
291046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt    * This function should only be used on a shader input or output variable.
292950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick    */
293950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick   const char *interpolation_string() const;
294950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick
2958b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick   /**
2968b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * Calculate the number of slots required to hold this variable
2978b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    *
2988b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * This is used to determine how many uniform or varying locations a variable
2998b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    * occupies.  The count is in units of floating point components.
3008b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick    */
3018b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick   unsigned component_slots() const;
3028b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick
303e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
304e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Delcared name of the variable
305e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
308b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   /**
309b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Highest element accessed with a constant expression array index
310b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    *
311b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Not used for non-array variables.
312b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    */
313b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   unsigned max_array_access;
314b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
315e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
316e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Is the variable read-only?
317e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
318e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * This is set for variables declared as \c const, shader inputs,
319e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * and uniforms.
320e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
325e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
326bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    * Has this variable been used for reading or writing?
327bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    *
328bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    * Several GLSL semantic checks require knowledge of whether or not a
329bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    * variable has been used.  For example, it is an error to redeclare a
330bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    * variable as invariant after it has been used.
331bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick    */
332bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick   unsigned used:1;
333bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick
334bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick   /**
335e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Storage class of the variable.
336e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
337e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \sa ir_variable_mode
338e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
340e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
341e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
342e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Interpolation mode for shader inputs / outputs
343e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
344e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \sa ir_variable_interpolation
345e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
3479d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick
3489d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   /**
3499d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * Flag that the whole array is assignable
3509d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    *
3519d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * In GLSL 1.20 and later whole arrays are assignable (and comparable for
3529d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * equality).  This flag enables this behavior.
3539d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    */
3549d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   unsigned array_lvalue:1;
355326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt
356e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
357e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \name ARB_fragment_coord_conventions
358e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * @{
359e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
3604a962170d7cf4243d6ae156fca20a6167388925dEric Anholt   unsigned origin_upper_left:1;
3614a962170d7cf4243d6ae156fca20a6167388925dEric Anholt   unsigned pixel_center_integer:1;
362e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /*@}*/
3634a962170d7cf4243d6ae156fca20a6167388925dEric Anholt
364326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   /**
365bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace    * \brief Layout qualifier for gl_FragDepth.
366bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace    *
367bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace    * This is not equal to \c ir_depth_layout_none if and only if this
368bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace    * variable is \c gl_FragDepth and a layout qualifier is specified.
369bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace    */
370bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace   ir_depth_layout depth_layout;
371bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace
372bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace   /**
373eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * Was the location explicitly set in the shader?
374eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    *
375eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * If the location is explicitly set in the shader, it \b cannot be changed
376eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * by the linker or by the API (e.g., calls to \c glBindAttribLocation have
377eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    * no effect).
378eee68d3631813580a14fa51fda6f0c959279256cIan Romanick    */
379eee68d3631813580a14fa51fda6f0c959279256cIan Romanick   unsigned explicit_location:1;
380eee68d3631813580a14fa51fda6f0c959279256cIan Romanick
381eee68d3631813580a14fa51fda6f0c959279256cIan Romanick   /**
38269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * Storage location of the base of this variable
38369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
38469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * The precise meaning of this field depends on the nature of the variable.
38569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
38669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader input: one of the values from \c gl_vert_attrib.
38769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Vertex shader output: one of the values from \c gl_vert_result.
38869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader input: one of the values from \c gl_frag_attrib.
38969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Fragment shader output: one of the values from \c gl_frag_result.
39069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Uniforms: Per-stage uniform slot number.
39169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *   - Other: This field is not currently used.
39269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    *
39369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * If the variable is a uniform, shader input, or shader output, and the
39469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    * slot has not been assigned, the value will be -1.
39569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick    */
39669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   int location;
39769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick
39869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick   /**
39989d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * Built-in state that backs this uniform
40089d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    *
40189d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * Once set at variable creation, \c state_slots must remain invariant.
40289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * This is because, ideally, this array would be shared by all clones of
40389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * this variable in the IR tree.  In other words, we'd really like for it
40489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * to be a fly-weight.
40589d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    *
40689d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * If the variable is not a uniform, \c num_state_slots will be zero and
40789d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    * \c state_slots will be \c NULL.
40889d81ab16c05818b290ed735c1343d3abde449bfIan Romanick    */
40989d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   /*@{*/
41089d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   unsigned num_state_slots;    /**< Number of state slots used */
41189d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   ir_state_slot *state_slots;  /**< State descriptors. */
41289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   /*@}*/
41389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick
41489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick   /**
415c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    * Emit a warning if this variable is accessed.
416c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    */
417c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   const char *warn_extension;
418c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick
419c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   /**
420326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    * Value assigned in the initializer of a variable declared "const"
421326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    */
422326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   ir_constant *constant_value;
423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
4279fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/**
4289fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or
4299fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype.
4309fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */
431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
432894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /* An ir_function_signature will be part of the list of signatures in
433894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    * an ir_function.
434894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    */
435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
436e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4388273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_function_signature *clone(void *mem_ctx,
4398273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					struct hash_table *ht) const;
44001a25bb64ecae156729794320f9a39733ff8eeaaKenneth Graunke   ir_function_signature *clone_prototype(void *mem_ctx,
44101a25bb64ecae156729794320f9a39733ff8eeaaKenneth Graunke					  struct hash_table *ht) const;
4424b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
44378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
44478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
44578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
44678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
44778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
4488895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4498895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
4510f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    * Get the name of the function for which this is a signature
4520f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    */
4530f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   const char *function_name() const;
4540f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
4550f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   /**
456df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * Get a handle to the function for which this is a signature
457df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    *
458df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * There is no setter function, this function returns a \c const pointer,
459df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * and \c ir_function_signature::_function is private for a reason.  The
460df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * only way to make a connection between a function and function signature
461df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * is via \c ir_function::add_signature.  This helps ensure that certain
462df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * invariants (i.e., a function signature is in the list of signatures for
463df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * its \c _function) are met.
464df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    *
465df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    * \sa ir_function::add_signature
466df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick    */
467df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   inline const class ir_function *function() const
468df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   {
469df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      return this->_function;
470df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   }
471df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick
472df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   /**
473abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * Check whether the qualifiers match between this signature's parameters
474abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * and the supplied parameter list.  If not, returns the name of the first
475abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * parameter with mismatched qualifiers (for use in error messages).
476abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    */
477abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   const char *qualifiers_match(exec_list *params);
478abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke
479abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   /**
480bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * Replace the current parameter list with the given one.  This is useful
481bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * if the current information came from a prototype, and either has invalid
482bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * or missing parameter names.
483bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    */
484bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   void replace_parameters(exec_list *new_params);
485bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke
486bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   /**
487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
494f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_variable of function parameters.
495f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    *
496f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * This represents the storage.  The paramaters passed in a particular
497f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * call will be in ir_call::actual_paramaters.
498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
4990044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5019fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   /** Whether or not this function has a body (which may be empty). */
5029fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   unsigned is_defined:1;
5036a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
504f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke   /** Whether or not this function signature is a built-in. */
505f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke   unsigned is_builtin:1;
506f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke
507894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /** Body of instructions in the function. */
508894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   struct exec_list body;
509894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt
5106a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate:
5116a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   /** Function of which this signature is one overload. */
512df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   class ir_function *_function;
5136a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
5146a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   friend class ir_function;
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
5199fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name.
5209fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the
5219fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions.
522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
525882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5278273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const;
5284b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
5296202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual ir_function *as_function()
5306202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   {
5316202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke      return this;
5326202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   }
5336202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke
53478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
53578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
53678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
53778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
53878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
5398895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
5408895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
5416a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   void add_signature(ir_function_signature *sig)
5426a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   {
543df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      sig->_function = this;
544df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick      this->signatures.push_tail(sig);
5456a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   }
5466a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
54895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    * Get an iterator for the set of function signatures
54995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    */
55095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   exec_list_iterator iterator()
55195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   {
55295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick      return signatures.iterator();
55395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   }
55495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick
55595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   /**
5560d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that matches a set of actual parameters, taking implicit
5570d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * conversions into account.
558471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
559b95897b89d36a25c237a021c299a4eb295856476Ian Romanick   ir_function_signature *matching_signature(const exec_list *actual_param);
560471471f83471481db0445e73f8c89e6a9149838eIan Romanick
561471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
5620d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that exactly matches a set of actual parameters without
5630d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * any implicit type conversions.
5640d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    */
565b95897b89d36a25c237a021c299a4eb295856476Ian Romanick   ir_function_signature *exact_matching_signature(const exec_list *actual_ps);
5660d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke
5670d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   /**
568a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
57281f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke   /** Whether or not this function has a signature that isn't a built-in. */
57381f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke   bool has_user_signature();
574b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke
575471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
576f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_function_signature for each overloaded function with this name.
577471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
5780044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
5800f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
5810f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const
5820f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{
583df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick   return this->_function->name;
5840f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick}
585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5883c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/**
5893c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements
5903c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */
5913c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction {
5923c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic:
5933c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if(ir_rvalue *condition)
5943c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      : condition(condition)
5953c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
596d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_if;
5973c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
5983c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
5998273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const;
6004b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
6015ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual ir_if *as_if()
6025ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   {
6035ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt      return this;
6045ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   }
6055ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt
6063c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void accept(ir_visitor *v)
6073c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
6083c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      v->visit(this);
6093c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
6103c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
6118895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
6128895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
6133c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *condition;
614f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the then branch */
6153c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  then_instructions;
616f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the else branch */
6173c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  else_instructions;
6183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick};
6193c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
6203c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
621fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/**
622fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure.
623fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */
624fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction {
625fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic:
6263b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_loop();
627fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
6288273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const;
6294b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
630fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   virtual void accept(ir_visitor *v)
631fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
632fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      v->visit(this);
633fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
634fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
6358895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
6368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
63701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual ir_loop *as_loop()
63801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   {
63901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick      return this;
64001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   }
64101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick
642fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
643fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * Get an iterator for the instructions of the loop body
644fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
645fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list_iterator iterator()
646fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
647fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      return body_instructions.iterator();
648fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
649fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
650f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction that make up the body of the loop. */
651fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list body_instructions;
652fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
653fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
654fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * \name Loop counter and controls
6553b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
6563b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * Represents a loop like a FORTRAN \c do-loop.
6573b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
6583b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * \note
6593b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * If \c from and \c to are the same value, the loop will execute once.
660fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
661fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@{*/
6623b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_rvalue *from;             /** Value of the loop counter on the first
6633b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 * iteration of the loop.
6643b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 */
6653b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   ir_rvalue *to;               /** Value of the loop counter on the last
6663b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 * iteration of the loop.
6673b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick				 */
668fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *increment;
669fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_variable *counter;
6703b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick
6713b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   /**
6723b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * Comparison operation in the loop terminator.
6733b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    *
6743b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * If any of the loop control fields are non-\c NULL, this field must be
6753b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal,
6763b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal.
6773b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick    */
6783b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick   int cmp;
679fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@}*/
680fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick};
681fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
682fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
6833c033637de7def553559c11d037f2e8bbb750f77Kenneth Graunkeclass ir_assignment : public ir_instruction {
684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
685e617a53a74cd27a322fd2dd05ff1c66c6437fde3Eric Anholt   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition = NULL);
686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
6875a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
6885a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Construct an assignment with an explicit write mask
6895a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
6905a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * \note
6915a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Since a write mask is supplied, the LHS must already be a bare
6925a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * \c ir_dereference.  The cannot be any swizzles in the LHS.
6935a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
6945a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition,
6955a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick		 unsigned write_mask);
6965a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
6978273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const;
6984b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
699fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
700fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
70178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
70278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
70378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
70478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
70578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
7068895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
7078895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
708cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_assignment * as_assignment()
709cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
710cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
711cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
712cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
713a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
7145a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Get a whole variable written by an assignment
7155a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
7165a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * If the LHS of the assignment writes a whole variable, the variable is
7175a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * returned.  Otherwise \c NULL is returned.  Examples of whole-variable
7185a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * assignment are:
7195a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
7205a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Assigning to a scalar
7215a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Assigning to all components of a vector
7225a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Whole array (or matrix) assignment
7235a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *  - Whole structure assignment
7245a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
7255a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_variable *whole_variable_written();
7265a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
7275a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
7285a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Set the LHS of an assignment
7295a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
7305a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   void set_lhs(ir_rvalue *lhs);
7315a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
7325a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
733a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
7345a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
7355a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * This should be treated as read only.  If you need to set the LHS of an
7365a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * assignment, use \c ir_assignment::set_lhs.
737a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
7385a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   ir_dereference *lhs;
739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
740a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
741a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
742a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
743fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
744a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
745a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
746a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
747a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
748fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
7495a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
7505a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick
7515a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   /**
7525a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * Component mask written
7535a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    *
7545a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * For non-vector types in the LHS, this field will be zero.  For vector
7555a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * types, a bit will be set for each component that is written.  Note that
7565a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    * for \c vec2 and \c vec3 types only the lower bits will ever be set.
757b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *
758b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * A partially-set write mask means that each enabled channel gets
759b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * the value from a consecutive channel of the rhs.  For example,
760b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * to write just .xyw of gl_FrontColor with color:
761b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *
762b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    * (assign (constant bool (1)) (xyw)
763b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *     (var_ref gl_FragColor)
764b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt    *     (swiz xyw (var_ref color)))
7655a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick    */
7665a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick   unsigned write_mask:4;
767a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
768a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
7693b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when
770160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list.
7713b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */
772a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
773a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
774a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
775a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
776a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
777a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke   ir_unop_sign,
778a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
779a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
78044d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
781bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt   ir_unop_exp,      /**< Log base e on gentype */
782bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt   ir_unop_log,	     /**< Natural log on gentype */
78301665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
78401665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
785a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
786a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
787dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_f2b,      /**< Float-to-boolean conversion */
788dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_b2f,      /**< Boolean-to-float conversion */
789c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_i2b,      /**< int-to-boolean conversion */
790c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_b2i,      /**< Boolean-to-int conversion */
7916c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
79220ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain   ir_unop_i2u,      /**< Integer-to-unsigned conversion. */
79320ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain   ir_unop_u2i,      /**< Unsigned-to-integer conversion. */
7945e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt   ir_unop_any,
795a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
796a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
797a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
798a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
799a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
800a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
801a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
802a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
803d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt   ir_unop_fract,
804d85d25dd1f4fd281bd210ba6ba5135ba1e3b535fKenneth Graunke   ir_unop_round_even,
805a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
806a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
80757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /**
80857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    * \name Trigonometric operations.
80957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke    */
81057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@{*/
81157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_sin,
81257e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   ir_unop_cos,
813f2616e56de8a48360cae8f269727b58490555f4dIan Romanick   ir_unop_sin_reduced,    /**< Reduced range sin. [-pi, pi] */
814f2616e56de8a48360cae8f269727b58490555f4dIan Romanick   ir_unop_cos_reduced,    /**< Reduced range cos. [-pi, pi] */
81557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke   /*@}*/
81657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke
817b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /**
818b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    * \name Partial derivatives.
819b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke    */
820b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@{*/
821b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdx,
822b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   ir_unop_dFdy,
823b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke   /*@}*/
824b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke
8253a5ce85cfa4914711e56c8cf831699242618928eIan Romanick   ir_unop_noise,
8263a5ce85cfa4914711e56c8cf831699242618928eIan Romanick
827007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   /**
828007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    * A sentinel marking the last of the unary operations.
829007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    */
830007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   ir_last_unop = ir_unop_noise,
831007f4881503b69055d65cfb20bd237673779786bKenneth Graunke
832a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
833a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
834a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
835a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
8368a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt
8378a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt   /**
8388a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Takes one of two combinations of arguments:
8398a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
8408a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, vecN)
8418a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * - mod(vecN, float)
8428a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    *
8438a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    * Does not take integer types.
8448a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt    */
845a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
846a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
847a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
84814eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke    * \name Binary comparison operators which return a boolean vector.
84914eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke    * The type of both operands must be equal.
850a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
851a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
852a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
853a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
854a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
855a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
8564dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_equal,
8574dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_nequal,
858832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt   /**
859832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * Returns single boolean for whether all components of operands[0]
860832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * equal the components of operands[1].
861832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    */
8624dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_all_equal,
863832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt   /**
864832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * Returns single boolean for whether any component of operands[0]
865832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    * is not equal to the corresponding component of operands[1].
866832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt    */
8674dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri   ir_binop_any_nequal,
868a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
869a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
870a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
871a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
872a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
873a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
874a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
875a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
876a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
877a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
878a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
879a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
880a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
881a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
882a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
883a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
884a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
885a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
886a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
887a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
888a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
889007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   ir_binop_pow,
890007f4881503b69055d65cfb20bd237673779786bKenneth Graunke
891007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   /**
892007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    * A sentinel marking the last of the binary operations.
893007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    */
894007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   ir_last_binop = ir_binop_pow,
895007f4881503b69055d65cfb20bd237673779786bKenneth Graunke
89611d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick   ir_quadop_vector,
89711d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick
898007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   /**
899007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    * A sentinel marking the last of all operations.
900007f4881503b69055d65cfb20bd237673779786bKenneth Graunke    */
901007f4881503b69055d65cfb20bd237673779786bKenneth Graunke   ir_last_opcode = ir_last_binop
902a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
903a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
904fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
905a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
90613f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick   /**
90713f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick    * Constructor for unary operation expressions
90813f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick    */
90913f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick   ir_expression(int op, const struct glsl_type *type, ir_rvalue *);
9106b937465d4aeab72fabcfe5250d477cf6790a521Eric Anholt   ir_expression(int op, ir_rvalue *);
91113f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick
91213f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick   /**
91313f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick    * Constructor for binary operation expressions
91413f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick    */
915a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
916fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
9176b937465d4aeab72fabcfe5250d477cf6790a521Eric Anholt   ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1);
918a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
91911d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick   /**
92011d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick    * Constructor for quad operator expressions
92111d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick    */
92211d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick   ir_expression(int op, const struct glsl_type *type,
92311d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick		 ir_rvalue *, ir_rvalue *, ir_rvalue *, ir_rvalue *);
92411d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick
9256d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   virtual ir_expression *as_expression()
9266d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   {
9276d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt      return this;
9286d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt   }
9296d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt
9308273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const;
9314b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
932e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
933e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Attempt to constant-fold the expression
934e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    *
935e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * If the expression cannot be constant folded, this method will return
936e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * \c NULL.
937e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
938fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
939fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
940e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
941e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Determine the number of operands used by an expression
942e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
9437dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   static unsigned int get_num_operands(ir_expression_operation);
944e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
945e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
946e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Determine the number of operands used by an expression
947e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
9484b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   unsigned int get_num_operands() const
9497dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   {
95011d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick      return (this->operation == ir_quadop_vector)
95111d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick	 ? this->type->vector_elements : get_num_operands(operation);
9527dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   }
953160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt
9543b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
9553b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Return a string representing this expression's operator.
9563b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
9573b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   const char *operator_string();
9583b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
9593b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   /**
960351525d534268b08c090f9ce42a67e9329a969aeIan Romanick    * Return a string representing this expression's operator.
961351525d534268b08c090f9ce42a67e9329a969aeIan Romanick    */
962351525d534268b08c090f9ce42a67e9329a969aeIan Romanick   static const char *operator_string(ir_expression_operation);
963351525d534268b08c090f9ce42a67e9329a969aeIan Romanick
964351525d534268b08c090f9ce42a67e9329a969aeIan Romanick
965351525d534268b08c090f9ce42a67e9329a969aeIan Romanick   /**
9663b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    * Do a reverse-lookup to translate the given string into an operator.
9673b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke    */
9683b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke   static ir_expression_operation get_operator(const char *);
9693b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke
97078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
97178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
97278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
97378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
97478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
9758895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
9768895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
977a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
97811d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick   ir_rvalue *operands[4];
979a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
980a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
981a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
982ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
983ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
984ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
985fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue {
986ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
9871f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_call(ir_function_signature *callee, exec_list *actual_parameters)
988b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(callee)
989ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
990d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_call;
9919e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
9929e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      type = callee->return_type;
993471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
99466f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick      this->use_builtin = callee->is_builtin;
995ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
996ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
9978273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const;
9984b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
999fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1000fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
1001cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_call *as_call()
1002cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
1003cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
1004cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
1005cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
1006ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
1007ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
1008ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
1009ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
1010ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
10118895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
10128895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1013ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
1014ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
1015e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth    *
1016d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke    * Any allocation will be performed with 'ctx' as ralloc owner.
1017ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
1018e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth   static ir_call *get_error_instruction(void *ctx);
1019ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
10209878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   /**
10219878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
10229878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
10239878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
10249878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
10259878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
10269878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
10279878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
102893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
102993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
103093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
103193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
103293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
10330f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick      return callee->function_name();
103493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
103593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
1036e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   /**
1037e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    * Get the function signature bound to this function call
1038e053d62aa573651abdd78666d299272c8219a3aaIan Romanick    */
10391f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_function_signature *get_callee()
1040cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
1041cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return callee;
1042cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
1043cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
1044cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   /**
1045792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick    * Set the function call target
1046792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick    */
10471f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   void set_callee(ir_function_signature *sig);
1048792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick
1049792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick   /**
1050cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * Generates an inline version of the function before @ir,
1051cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * returning the return value of the function.
1052cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    */
1053cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_rvalue *generate_inline(ir_instruction *ir);
1054cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
1055a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick   /* List of ir_rvalue of paramaters passed in this call. */
1056a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick   exec_list actual_parameters;
1057a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick
105866f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick   /** Should this call only bind to a built-in function? */
105966f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick   bool use_builtin;
106066f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick
1061ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
1062471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
1063b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(NULL)
1064471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
1065d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_call;
1066471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
1067471471f83471481db0445e73f8c89e6a9149838eIan Romanick
10681f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt   ir_function_signature *callee;
1069ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
1070ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
1071ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
10729578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
10739578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
10749578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
10759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
10769578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
10779578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
10789578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
10799578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
10809578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
10819578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
1082d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      ir_type = ir_type_unset;
10839578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
10849578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
10859578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
10869578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
10879578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
10889578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
10899578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
10909578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
1091d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_return;
10929578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
10939578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
1094fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
10959578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
10969578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
1097d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_return;
10989578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
10999578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
11008273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_return *clone(void *mem_ctx, struct hash_table *) const;
11014b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1102cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_return *as_return()
1103cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
1104cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
1105cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
1106cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
1107fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
11089578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
11099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
11109578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
11119578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
11129578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
11139578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
11149578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
11159578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
11169578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
11178895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
11188895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1119fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
11209578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
1121f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1122f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1123f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/**
1124f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops
1125f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
1126f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue.  The \c break within a loop is
1127f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement.
1128f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
1129f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump
1130f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */
1131f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump {
1132f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic:
1133f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode {
1134f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_break,
1135f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_continue
1136f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   };
1137f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
11384b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt   ir_loop_jump(jump_mode mode)
1139f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1140d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_loop_jump;
11410c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt      this->mode = mode;
11420c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt      this->loop = loop;
1143f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1144f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
11458273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const;
11464b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1147f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   virtual void accept(ir_visitor *v)
1148f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1149f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      v->visit(this);
1150f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1151f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
11528895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
11538895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1154f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_break() const
1155f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1156f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_break;
1157f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1158f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1159f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_continue() const
1160f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
1161f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_continue;
1162f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
1163f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
1164f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Mode selector for the jump instruction. */
1165f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode mode;
11660c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholtprivate:
11670c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt   /** Loop containing this break instruction. */
11680c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt   ir_loop *loop;
1169f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick};
117016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
117116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke/**
117216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke * IR instruction representing discard statements.
117316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke */
117416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeclass ir_discard : public ir_jump {
117516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkepublic:
117616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard()
117716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
1178d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_discard;
117916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = NULL;
118016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
118116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
118216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_discard(ir_rvalue *cond)
118316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
118484ee01f40acf88185484df386b7715034e7685c9Aras Pranckevicius      this->ir_type = ir_type_discard;
118516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      this->condition = cond;
118616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
118716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
11888273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const;
118916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
119016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual void accept(ir_visitor *v)
119116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   {
119216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      v->visit(this);
119316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
119416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
119516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
119616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
11971eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke   virtual ir_discard *as_discard()
11981eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke   {
11991eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke      return this;
12001eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke   }
12011eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke
120216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_rvalue *condition;
120316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke};
12049578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
12059578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
12069578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
120781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
120881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture
120981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
121081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode {
1211e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_tex,		/**< Regular texture look-up */
1212e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_txb,		/**< Texture look-up with LOD bias */
1213e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_txl,		/**< Texture look-up with explicit LOD */
1214e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_txd,		/**< Texture look-up with partial derivatvies */
1215e053d62aa573651abdd78666d299272c8219a3aaIan Romanick   ir_txf		/**< Texel fetch with explicit LOD */
121681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
121781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
121881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
121981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/**
122081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture
122181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
122281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value
122381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes.  In the printed IR, these will
122481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as:
122581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick *
1226233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke *                                    Texel offset (0 or an expression)
1227233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke *                                    | Projection divisor
1228233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke *                                    | |  Shadow comparitor
1229233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke *                                    | |  |
1230233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke *                                    v v  v
1231233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (tex <type> <sampler> <coordinate> 0 1 ( ))
1232233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txb <type> <sampler> <coordinate> 0 1 ( ) <bias>)
1233233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txl <type> <sampler> <coordinate> 0 1 ( ) <lod>)
1234233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txd <type> <sampler> <coordinate> 0 1 ( ) (dPdx dPdy))
1235233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txf <type> <sampler> <coordinate> 0       <lod>)
123681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */
123781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue {
123881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic:
123981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_texture(enum ir_texture_opcode op)
1240c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke      : op(op), projector(NULL), shadow_comparitor(NULL), offset(NULL)
124181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   {
1242d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt      this->ir_type = ir_type_texture;
124381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   }
124481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
12458273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const;
12464b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1247fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1248fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
124926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual void accept(ir_visitor *v)
125026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   {
125126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke      v->visit(this);
125226d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   }
125326d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
125426d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
125526d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
1256c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
1257c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Return a string representing the ir_texture_opcode.
1258c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
1259c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   const char *opcode_string();
1260c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
1261233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke   /** Set the sampler and type. */
1262233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke   void set_sampler(ir_dereference *sampler, const glsl_type *type);
126356d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke
1264c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   /**
1265c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    * Do a reverse-lookup to translate a string into an ir_texture_opcode.
1266c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke    */
1267c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke   static ir_texture_opcode get_opcode(const char *);
1268c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke
126981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   enum ir_texture_opcode op;
127081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
127181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Sampler to use for the texture access. */
127281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_dereference *sampler;
127381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
127481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /** Texture coordinate to sample */
127581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *coordinate;
127681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
127781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
127881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Value used for projective divide.
127981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
128081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no projective divide (the common case), this will be
128181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c NULL.  Optimization passes should check for this to point to a constant
128281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * of 1.0 and replace that with \c NULL.
128381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
128481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *projector;
128581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
128681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   /**
128781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * Coordinate used for comparison on shadow look-ups.
128881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    *
128981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * If there is no shadow comparison, this will be \c NULL.  For the
129081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    * \c ir_txf opcode, this *must* be \c NULL.
129181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick    */
129281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   ir_rvalue *shadow_comparitor;
129381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
1294c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke   /** Texel offset. */
1295c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke   ir_rvalue *offset;
129681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
129781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   union {
129881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *lod;		/**< Floating point LOD */
129981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      ir_rvalue *bias;		/**< Floating point LOD bias */
130081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      struct {
130181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdx;	/**< Partial derivative of coordinate wrt X */
130281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick	 ir_rvalue *dPdy;	/**< Partial derivative of coordinate wrt Y */
130381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick      } grad;
130481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick   } lod_info;
130581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick};
130681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
130781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick
1308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
1309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
1310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
1311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
1312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
1313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
1315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
1316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1317f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
1318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
1320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
1321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
1323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
1325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1327affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1328affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
1329affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
1330affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
1331affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
13326315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
13336315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count);
13346315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
133505a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt   ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
1336cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
13378273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const;
13384b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1339fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1340fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
13417d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual ir_swizzle *as_swizzle()
13427d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   {
13437d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt      return this;
13447d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   }
13457d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt
1346affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
1347affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
1348affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
1349affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
1350affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1351affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
1352affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
1353affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
1354affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
1355affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
13568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
13578895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1358a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   bool is_lvalue() const
1359affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
1360a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
1361affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
1362affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
13632b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
13642b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
13652b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
1366a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const;
13672b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick
1368affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
1369affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
13706315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick
13716315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanickprivate:
13726315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   /**
13736315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * Initialize the mask component of a swizzle
13746315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    *
13756315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    * This is used by the \c ir_swizzle constructors.
13766315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick    */
13776315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick   void init_mask(const unsigned *components, unsigned count);
1378affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
1379affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1380affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
1381fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
1382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
13838273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0;
1384ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick
138544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
138644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
138744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
138844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
138944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
1390a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   bool is_lvalue() const;
1391fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
13922b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick   /**
13932b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    * Get the variable that is ultimately referenced by an r-value
13942b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick    */
1395a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const = 0;
139670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
139770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
139870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
139970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference {
140070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
140170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_variable(ir_variable *var);
140270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
14038273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_variable *clone(void *mem_ctx,
14048273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					  struct hash_table *) const;
14054b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1406fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1407fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
1408d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   virtual ir_dereference_variable *as_dereference_variable()
1409d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   {
1410d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt      return this;
1411d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt   }
1412d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt
141370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
141470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
141570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
1416a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const
141770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
141836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->var;
141970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1420f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1421b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   virtual ir_variable *whole_variable_referenced()
1422b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   {
1423b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      /* ir_dereference_variable objects always dereference the entire
1424b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * variable.  However, if this dereference is dereferenced by anything
1425b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * else, the complete deferefernce chain is not a whole-variable
1426b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * dereference.  This method should only be called on the top most
1427b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       * ir_rvalue in a dereference chain.
1428b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick       */
1429b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick      return this->var;
1430b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick   }
1431b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick
1432c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1433c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1434c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1435c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1436c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1437f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
143836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
143936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   /**
144036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    * Object being dereferenced.
144136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick    */
144236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_variable *var;
144370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
144470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
144570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
144670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference {
144770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
144870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
144970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
145070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
145170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
14528273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_array *clone(void *mem_ctx,
14538273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt				       struct hash_table *) const;
14544b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1455fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1456fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
1457b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   virtual ir_dereference_array *as_dereference_array()
1458b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   {
1459b145e903694fa932ab1e0d955e889555193ab604Eric Anholt      return this;
1460b145e903694fa932ab1e0d955e889555193ab604Eric Anholt   }
1461b145e903694fa932ab1e0d955e889555193ab604Eric Anholt
146270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
146370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
146470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
1465a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const
146670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
146736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->array->variable_referenced();
146870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
146970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
1470c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1471c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1472c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1473c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1474c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1475f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
147670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
147736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array;
147836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *array_index;
147936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
148070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate:
148170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   void set_array(ir_rvalue *value);
148270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick};
148370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
148470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
148570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference {
148670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic:
148770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_rvalue *value, const char *field);
148870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
148970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   ir_dereference_record(ir_variable *var, const char *field);
149070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick
14918273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_dereference_record *clone(void *mem_ctx,
14928273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt					struct hash_table *) const;
14934b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1494fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1495fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
149670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   /**
149770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    * Get the variable that is ultimately referenced by an r-value
149870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick    */
1499a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry   virtual ir_variable *variable_referenced() const
150070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   {
150136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick      return this->record->variable_referenced();
150270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   }
1503f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
1504c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void accept(ir_visitor *v)
1505c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   {
1506c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick      v->visit(this);
1507c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   }
1508c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick
1509f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
151036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick
151136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   ir_rvalue *record;
151236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   const char *field;
1513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1516be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/**
1517be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick * Data stored in an ir_constant
1518be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick */
1519be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanickunion ir_constant_data {
1520be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      unsigned u[16];
1521be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      int i[16];
1522be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      float f[16];
1523be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick      bool b[16];
1524be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick};
1525be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1526be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick
1527fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
1528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
1529824b659d917a5f14a1f66b891d25036ef9f9adc6Ian Romanick   ir_constant(const struct glsl_type *type, const ir_constant_data *data);
15303c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
15313c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
15323c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
15333c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
1534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1535989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   /**
1536756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    * Construct an ir_constant from a list of ir_constant values
1537756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick    */
1538756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   ir_constant(const struct glsl_type *type, exec_list *values);
1539756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick
1540756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick   /**
1541989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * Construct an ir_constant from a scalar component of another ir_constant
1542989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1543989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * The new \c ir_constant inherits the type of the component from the
1544989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * source constant.
1545989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    *
1546989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * \note
1547989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * In the case of a matrix constant, the new constant is a scalar, \b not
1548989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    * a vector.
1549989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick    */
1550989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick   ir_constant(const ir_constant *c, unsigned i);
1551989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick
1552ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke   /**
1553ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke    * Return a new ir_constant of the specified type containing all zeros.
1554ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke    */
1555ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke   static ir_constant *zero(void *mem_ctx, const glsl_type *type);
1556ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke
15578273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt   virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const;
15584b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt
1559fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke   virtual ir_constant *constant_expression_value();
1560fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke
15615c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   virtual ir_constant *as_constant()
15625c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   {
15635c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt      return this;
15645c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt   }
15655c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt
156678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
156778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
156878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
156978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
157078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
15718895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
15728895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1573a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
157431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * Get a particular component of a constant as a specific type
157531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    *
157631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * This is useful, for example, to get a value from an integer constant
157731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * as a float or bool.  This appears frequently when constructors are
157831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    * called with all constant parameters.
157931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick    */
158031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@{*/
158131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   bool get_bool_component(unsigned i) const;
158231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   float get_float_component(unsigned i) const;
158331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   int get_int_component(unsigned i) const;
158431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   unsigned get_uint_component(unsigned i) const;
158531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /*@}*/
158631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick
158774e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   ir_constant *get_array_element(unsigned i) const;
158874e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke
1589b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick   ir_constant *get_record_field(const char *name);
1590b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick
159131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick   /**
15921e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    * Determine whether a constant has the same value as another constant
159338e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick    *
15948e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * \sa ir_constant::is_zero, ir_constant::is_one,
15958e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick    * ir_constant::is_negative_one
15961e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick    */
15971e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick   bool has_value(const ir_constant *) const;
15981e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick
1599ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_zero() const;
1600ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick   virtual bool is_one() const;
16018e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick   virtual bool is_negative_one() const;
160238e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick
160338e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick   /**
1604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
1605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
1607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
1608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
1609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1610be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick   union ir_constant_data value;
16117f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick
161274e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   /* Array elements */
161374e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   ir_constant **array_elements;
161474e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke
161574e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke   /* Structure fields */
16167f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick   exec_list components;
1617710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick
1618710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanickprivate:
1619710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   /**
1620710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    * Parameterless constructor only used by the clone method
1621710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick    */
1622710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick   ir_constant(void);
1623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
1624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1625e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/*@}*/
1626e053d62aa573651abdd78666d299272c8219a3aaIan Romanick
1627e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
1628e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Apply a visitor to each IR node in a list
1629e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
163070b74928a220aff024664714877defb0caedf33fEric Anholtvoid
163170b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor);
1632adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
1633e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/**
1634e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Validate invariants on each IR node in a list
1635e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */
163653cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholtvoid validate_ir_tree(exec_list *instructions);
163753cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholt
163802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickstruct _mesa_glsl_parse_state;
163902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickstruct gl_shader_program;
164002c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick
164102c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick/**
164202c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * Detect whether an unlinked shader contains static recursion
164302c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick *
164402c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * If the list of instructions is determined to contain static recursion,
164502c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c _mesa_glsl_error will be called to emit error messages for each function
164602c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * that is in the recursion cycle.
164702c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick */
164802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickvoid
164902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickdetect_recursion_unlinked(struct _mesa_glsl_parse_state *state,
165002c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick			  exec_list *instructions);
165102c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick
165202c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick/**
165302c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * Detect whether a linked shader contains static recursion
165402c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick *
165502c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * If the list of instructions is determined to contain static recursion,
165602c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c link_error_printf will be called to emit error messages for each function
165702c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * that is in the recursion cycle.  In addition,
165802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c gl_shader_program::LinkStatus will be set to false.
165902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick */
166002c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickvoid
166102c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickdetect_recursion_linked(struct gl_shader_program *prog,
166202c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick			exec_list *instructions);
166302c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick
1664f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick/**
1665f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * Make a clone of each IR instruction in a list
1666f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick *
1667f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param in   List of IR instructions that are to be cloned
1668f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param out  List to hold the cloned instructions
1669f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick */
1670f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanickvoid
16718273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholtclone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in);
1672f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick
1673adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
1674adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
1675adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
1676e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
1677c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
167881168351a7f493fcde55e621af046c9301aa93e9Kenneth Graunke_mesa_glsl_initialize_functions(_mesa_glsl_parse_state *state);
1679c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
168060e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickextern void
1681d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick_mesa_glsl_release_functions(void);
1682d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick
1683d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanickextern void
168460e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickreparent_ir(exec_list *list, void *mem_ctx);
168560e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanick
16861cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonsecastruct glsl_symbol_table;
16874ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick
16884ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickextern void
16894ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickimport_prototypes(const exec_list *source, exec_list *dest,
16901cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonseca		  struct glsl_symbol_table *symbols, void *mem_ctx);
16914ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick
16929f82806c7b5109553cf806a5652e6b6198665094Eric Anholtextern bool
16939f82806c7b5109553cf806a5652e6b6198665094Eric Anholtir_has_call(ir_instruction *ir);
16949f82806c7b5109553cf806a5652e6b6198665094Eric Anholt
1695925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtextern void
1696925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtdo_set_program_inouts(exec_list *instructions, struct gl_program *prog);
1697925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt
16981ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanickextern char *
16991ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanickprototype_string(const glsl_type *return_type, const char *name,
17001ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick		 exec_list *parameters);
17011ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick
1702e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
1703