ir.h revision 9578c87ce23a98472d52f15b0a7063f4df036c4d
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 Romanickenum ir_opcodes {
38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_var_decl,
39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_assign,
40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_expression,
41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_dereference,
42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_jump,
43a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_label,
44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_constant,
45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_op_func_sig,
46ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   ir_op_func,
47ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   ir_op_call,
48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions
52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
530044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node {
54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
55a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode;
56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
57a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
5878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *) = 0;
5978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
60a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
61d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   ir_instruction(int mode)
62d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick      : mode(mode)
63d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
64d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick      /* empty */
65d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprivate:
68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
69a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Dummy constructor to catch bad constructors in derived classes.
70a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
71a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Every derived must use the constructor that sets the instructions
72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * mode.  Having the \c void constructor private prevents derived classes
73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * from accidentally doing the wrong thing.
74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
75a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction(void);
76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
80a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_auto = 0,
81a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_uniform,
82a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
83a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_inout
85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation {
88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_variable(const struct glsl_type *, const char *);
96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
9778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
9878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
9978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
10078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
10178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction {
114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label(const char *label);
116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
11778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
11878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
11978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
12078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
12178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *label;
123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
129a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_function_signature(void);
130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
13178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
13278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
13378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
13478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
13578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * List of function parameters stored as ir_variable objects.
145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1460044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Pointer to the label that begins the function definition.
150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label *definition;
152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table
157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_function(void);
161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
16278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
16378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
16478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
16578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
16678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
168471471f83471481db0445e73f8c89e6a9149838eIan Romanick    * Find a signature that matches a set of actual parameters.
169471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
170471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *matching_signature(exec_list *actual_param);
171471471f83471481db0445e73f8c89e6a9149838eIan Romanick
172471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
177471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
178471471f83471481db0445e73f8c89e6a9149838eIan Romanick    * Set of overloaded functions with this name.
179471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
1800044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression;
185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference;
186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_assignment : public ir_instruction {
188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
189a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_assignment(ir_instruction *lhs, ir_instruction *rhs,
190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		 ir_expression *condition);
191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
19278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
19378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
19478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
19578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
19678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_dereference *lhs;
201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * This should be either \c ir_op_expression or \c ir_op_deference.
206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *rhs;
208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression *condition;
213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_exp,
224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_log,
225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_not,
270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_expression : public ir_instruction {
279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		 ir_instruction *, ir_instruction *);
282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
28378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
28478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
28578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
28678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
28778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *operands[2];
290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
293ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
294ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
295ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
296ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickclass ir_call : public ir_instruction {
297ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
298471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call(const ir_function_signature *callee, exec_list *actual_parameters)
299471471f83471481db0445e73f8c89e6a9149838eIan Romanick      : ir_instruction(ir_op_call), callee(callee)
300ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
301471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
302ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
303ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
304ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
305ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
306ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
307ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
308ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
309ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
310ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
311ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
312ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   static ir_call *get_error_instruction();
313ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
314ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
315471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
316471471f83471481db0445e73f8c89e6a9149838eIan Romanick      : ir_instruction(ir_op_call), callee(NULL)
317471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
318471471f83471481db0445e73f8c89e6a9149838eIan Romanick      /* empty */
319471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
320471471f83471481db0445e73f8c89e6a9149838eIan Romanick
321471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *callee;
322ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   exec_list actual_parameters;
323ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
324ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
325ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
3269578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
3279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
3289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
3299578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
3309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
3319578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
3329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
3339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
3349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
3359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : ir_instruction(ir_op_jump)
3369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
3379578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
3389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
3399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
3409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
3419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
3429578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
3439578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
3449578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
3459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
3469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
3479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
3489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
3499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return(ir_expression *value)
3509578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
3519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
3529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
3539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
3549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
3559578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_expression *get_value() const
3569578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
3579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
3589578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
3599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
3609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
3619578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
3629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
3639578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
3649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
3659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate:
3669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_expression *value;
3679578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
3689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
3699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
3709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
371a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
375a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
376a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
377a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
378a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
379a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
380a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned num_components:2;
381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_dereference : public ir_instruction {
391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_dereference(struct ir_instruction *);
393a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
39478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
39578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
39678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
39778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
39878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum {
400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_variable,
401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_array,
402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_record
403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
405a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Object being dereferenced.
407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Must be either an \c ir_variable or an \c ir_deference.
409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *var;
411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_expression *array_index;
414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      const char *field;
415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      struct ir_swizzle_mask swizzle;
416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } selector;
417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
418a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
419a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
420a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_constant : public ir_instruction {
421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_constant(const struct glsl_type *type, const void *data);
423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
42478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
42578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
42678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
42778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
42878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned u[16];
438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int i[16];
439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      float f[16];
440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      bool b[16];
441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } value;
442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
444adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
445adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
446adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
447adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
448e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
449e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
450