ir.h revision a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8
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
290044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h"
3078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h"
310044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick
32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_program {
33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   void *bong_hits;
34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions
38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
390044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node {
40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *) = 0;
4478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
4544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /**
4644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \name IR instruction downcast functions
4744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    *
4844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * These functions either cast the object to a derived class or return
4944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \c NULL if the object's type does not match the specified derived class.
5044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * Additional downcast functions will be added as needed.
5144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    */
5244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@{*/
5344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_variable *          as_variable()         { return NULL; }
5444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_dereference *       as_dereference()      { return NULL; }
55fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual class ir_rvalue *            as_rvalue()           { return NULL; }
5644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@}*/
5744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
5944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   ir_instruction()
60d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
61d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick      /* empty */
62d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
63a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
66fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction {
67fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic:
68fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue * as_rvalue()
69fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
70fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return this;
71fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
72fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
73fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual bool is_lvalue()
74fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
75fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return false;
76fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
77fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
78fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected:
79fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue() : ir_instruction() { }
80fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke};
81fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
82fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_auto = 0,
85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_uniform,
86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_inout
89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation {
92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
97fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_variable(const struct glsl_type *, const char *);
101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
10244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_variable *as_variable()
10344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
10444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
10544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
10644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
10778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
10878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
10978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
11078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
11178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction {
124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label(const char *label);
126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
12778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
12878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
12978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
13078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
13178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *label;
133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
139e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
14178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
14278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
14378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
14478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
14578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * List of function parameters stored as ir_variable objects.
155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1560044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Pointer to the label that begins the function definition.
160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label *definition;
162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table
167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
170882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
17278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
17378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
17478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
17578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
17678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
178471471f83471481db0445e73f8c89e6a9149838eIan Romanick    * Find a signature that matches a set of actual parameters.
179471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
180471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *matching_signature(exec_list *actual_param);
181471471f83471481db0445e73f8c89e6a9149838eIan Romanick
182471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
187471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
188471471f83471481db0445e73f8c89e6a9149838eIan Romanick    * Set of overloaded functions with this name.
189471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
1900044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
195fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue {
196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
197fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
19978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
20078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
20178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
20278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
20378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
207fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *lhs;
208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
212fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
217fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
220e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt/* Update ir_print_visitor.cpp when updating this list. */
221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
22844d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_exp,
230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_log,
23101665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
23201665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
2356c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_not,
279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
287fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
290fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
29278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
29378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
29478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
29578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
29678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
298fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *operands[2];
299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
302ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
303ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
304ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
305fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue {
306ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
307471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call(const ir_function_signature *callee, exec_list *actual_parameters)
308fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      : ir_rvalue(), callee(callee)
309ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
3109e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
3119e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      type = callee->return_type;
312471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
313ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
314ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
315ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
316ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
317ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
318ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
319ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
320ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
321ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
322ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
323ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   static ir_call *get_error_instruction();
324ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
3259878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   /**
3269878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
3279878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
3289878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
3299878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
3309878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
3319878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
3329878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
33393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
33493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
33593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
33693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
33793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
33893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick      /* FINISHME: This only works for functions that have definitions. */
33993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick      return callee->definition->label;
34093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
34193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
342ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
343471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
344fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      : ir_rvalue(), callee(NULL)
345471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
346471471f83471481db0445e73f8c89e6a9149838eIan Romanick      /* empty */
347471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
348471471f83471481db0445e73f8c89e6a9149838eIan Romanick
349471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *callee;
350ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   exec_list actual_parameters;
351ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
352ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
353ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
3549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
3559578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
3569578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
3579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
3589578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
3599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
3609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
3619578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
3629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
36344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      : ir_instruction()
3649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
3659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
3669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
3679578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
3689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
3699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
3709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
3719578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
3729578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
3739578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
3749578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
3759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
3769578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
377fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
3789578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
3799578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
3809578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
3819578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
3829578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
383fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
3849578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
3859578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
3869578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
3879578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
3889578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
3899578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
3909578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
3919578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
3929578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
3939578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate:
394fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
3959578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
3969578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
3979578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
3989578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
405a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
408f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
418affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
419affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
420affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
421affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
422affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
423affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
424affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
425affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
426affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
427affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
428affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
429affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
430affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
431affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
432affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
433affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   bool is_lvalue()
434affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
435a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
436affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
437affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
438affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
439affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
440affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
441affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
442affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
443fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_dereference(struct ir_instruction *);
446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
447fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_dereference(ir_instruction *variable, ir_rvalue *array_index);
448954699773681842dac9f8f0d9ba4629513232196Ian Romanick
44944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
45044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
45144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
45244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
45344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
45478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
45578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
45678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
45778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
45878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
459fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   bool is_lvalue()
460fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
461c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt      ir_variable *as_var;
462c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt
463c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt      if (var == NULL)
464c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt	 return NULL;
465c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt
466c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt      as_var = var->as_variable();
467c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt
468c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt      if (as_var == NULL)
469c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt	 return NULL;
470c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt
471c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt      return !as_var->read_only;
472fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
473fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
474a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum {
475a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_variable,
476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_array,
477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_record
478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Object being dereferenced.
482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
483fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke    * Must be either an \c ir_variable or an \c ir_rvalue.
484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *var;
486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
488fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      ir_rvalue *array_index;
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      const char *field;
490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } selector;
491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
494fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_constant(const struct glsl_type *type, const void *data);
4973c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
4983c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
4993c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
5003c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
50278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
50378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
50478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
50578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
50678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned u[16];
516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int i[16];
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      float f[16];
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      bool b[16];
519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } value;
520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
522adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
523adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
524adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
525adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
526e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
527c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
528c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions,
529c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt				struct _mesa_glsl_parse_state *state);
530c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
531e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
532