ir_print_visitor.cpp revision a87ac255cf7ef0672b4de865d82e6a40c93b57d
1a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*
2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation
3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"),
6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation
7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions:
10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next
12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the
13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software.
14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE.
22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_program {
25a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   void *bong_hits;
26a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
27a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
29a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_opcodes {
30a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_var_decl,
31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_assign,
32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_expression,
33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_dereference,
34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_jump,
35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_label,
36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_constant,
37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_func_sig,
38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_func
39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions
43a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_instruction : public simple_node {
45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode;
47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction(int mode);
51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprivate:
53a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Dummy constructor to catch bad constructors in derived classes.
55a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Every derived must use the constructor that sets the instructions
57a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * mode.  Having the \c void constructor private prevents derived classes
58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * from accidentally doing the wrong thing.
59a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
60a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction(void);
61a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
62a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
63a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_auto = 0,
66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_uniform,
67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
69a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_inout
70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
71a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation {
73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
75a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
80a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_variable(const struct glsl_type *, const char *);
81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction {
94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label(const char *label);
96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *label;
98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_function_signature(void);
105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * List of function parameters stored as ir_variable objects.
115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node parameters;
117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Pointer to the label that begins the function definition.
120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label *definition;
122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table
127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_function(void);
131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node signatures;
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression;
142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference;
143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_assignment : public ir_instruction {
145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_assignment(ir_instruction *lhs, ir_instruction *rhs,
147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		 ir_expression *condition);
148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_dereference *lhs;
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * This should be either \c ir_op_expression or \c ir_op_deference.
158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *rhs;
160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression *condition;
165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_exp,
176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_log,
177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
189a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
195a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_not,
222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression : public ir_instruction {
231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		 ir_instruction *, ir_instruction *);
234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *operands[2];
237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned num_components:2;
250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference : public ir_instruction {
260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_dereference(struct ir_instruction *);
262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum {
264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_variable,
265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_array,
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_record
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Object being dereferenced.
271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Must be either an \c ir_variable or an \c ir_deference.
273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *var;
275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_expression *array_index;
278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      const char *field;
279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      struct ir_swizzle_mask swizzle;
280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } selector;
281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_constant : public ir_instruction {
285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_constant(const struct glsl_type *type, const void *data);
287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned u[16];
297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int i[16];
298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      float f[16];
299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      bool b[16];
300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } value;
301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
303