ir.h revision 471471f83471481db0445e73f8c89e6a9149838e
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
250044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h"
2678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h"
270044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick
28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_program {
29a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   void *bong_hits;
30a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_opcodes {
34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_var_decl,
35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_assign,
36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_expression,
37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_dereference,
38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_jump,
39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_label,
40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_constant,
41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_func_sig,
42ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   ir_op_func,
43ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   ir_op_call,
44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions
48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
490044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node {
50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode;
52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
53a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *) = 0;
5578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
57d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   ir_instruction(int mode)
58d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick      : mode(mode)
59d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
60d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick      /* empty */
61d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
62a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
63a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprivate:
64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Dummy constructor to catch bad constructors in derived classes.
66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Every derived must use the constructor that sets the instructions
68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * mode.  Having the \c void constructor private prevents derived classes
69a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * from accidentally doing the wrong thing.
70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
71a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction(void);
72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
75a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_auto = 0,
77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_uniform,
78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
80a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_inout
81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation {
84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_variable(const struct glsl_type *, const char *);
92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
9378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
9478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
9578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
9678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
9778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction {
110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label(const char *label);
112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
11378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
11478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
11578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
11678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
11778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *label;
119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_function_signature(void);
126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
12778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
12878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
12978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
13078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
13178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * List of function parameters stored as ir_variable objects.
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1420044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Pointer to the label that begins the function definition.
146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label *definition;
148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_function(void);
157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
15878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
15978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
16078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
16178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
16278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
164471471f83471481db0445e73f8c89e6a9149838eIan Romanick    * Find a signature that matches a set of actual parameters.
165471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
166471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *matching_signature(exec_list *actual_param);
167471471f83471481db0445e73f8c89e6a9149838eIan Romanick
168471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
173471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
174471471f83471481db0445e73f8c89e6a9149838eIan Romanick    * Set of overloaded functions with this name.
175471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
1760044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression;
181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference;
182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_assignment : public ir_instruction {
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_assignment(ir_instruction *lhs, ir_instruction *rhs,
186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		 ir_expression *condition);
187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
18878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
18978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
19078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
19178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
19278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
195a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_dereference *lhs;
197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * This should be either \c ir_op_expression or \c ir_op_deference.
202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *rhs;
204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression *condition;
209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_exp,
220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_log,
221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_not,
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression : public ir_instruction {
275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		 ir_instruction *, ir_instruction *);
278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
27978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
28078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
28178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
28278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
28378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *operands[2];
286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
289ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
290ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
291ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
292ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickclass ir_call : public ir_instruction {
293ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
294471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call(const ir_function_signature *callee, exec_list *actual_parameters)
295471471f83471481db0445e73f8c89e6a9149838eIan Romanick      : ir_instruction(ir_op_call), callee(callee)
296ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
297471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
298ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
299ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
300ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
301ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
302ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
303ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
304ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
305ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
306ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
307ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
308ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   static ir_call *get_error_instruction();
309ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
310ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
311471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
312471471f83471481db0445e73f8c89e6a9149838eIan Romanick      : ir_instruction(ir_op_call), callee(NULL)
313471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
314471471f83471481db0445e73f8c89e6a9149838eIan Romanick      /* empty */
315471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
316471471f83471481db0445e73f8c89e6a9149838eIan Romanick
317471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *callee;
318ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   exec_list actual_parameters;
319ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
320ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
321ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned num_components:2;
332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference : public ir_instruction {
342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_dereference(struct ir_instruction *);
344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
34578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
34678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
34778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
34878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
34978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum {
351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_variable,
352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_array,
353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_record
354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Object being dereferenced.
358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Must be either an \c ir_variable or an \c ir_deference.
360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *var;
362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_expression *array_index;
365a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      const char *field;
366a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      struct ir_swizzle_mask swizzle;
367a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } selector;
368a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
369a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
370a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
371a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_constant : public ir_instruction {
372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_constant(const struct glsl_type *type, const void *data);
374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
37578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
37678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
37778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
37878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
37978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
380a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned u[16];
389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int i[16];
390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      float f[16];
391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      bool b[16];
392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } value;
393a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
394a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
395adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
396adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
397adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
398adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
399