ir.h revision 95cd6cc195f4652378d7ecf614c6e1c568311a04
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
431cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick   class ir_constant *constant_expression_value();
4478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *) = 0;
4578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
4644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /**
4744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \name IR instruction downcast functions
4844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    *
4944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * These functions either cast the object to a derived class or return
5044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * \c NULL if the object's type does not match the specified derived class.
5144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    * Additional downcast functions will be added as needed.
5244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke    */
5344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@{*/
5444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_variable *          as_variable()         { return NULL; }
5544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_dereference *       as_dereference()      { return NULL; }
56fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual class ir_rvalue *            as_rvalue()           { return NULL; }
5744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@}*/
5844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
59a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
6044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   ir_instruction()
61d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
62d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick      /* empty */
63d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
65a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
67fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction {
68fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic:
69fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue * as_rvalue()
70fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
71fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return this;
72fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
73fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
74fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual bool is_lvalue()
75fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
76fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return false;
77fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
78fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
79fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected:
80fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue() : ir_instruction() { }
81fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke};
82fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
83fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_auto = 0,
86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_uniform,
87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_inout
90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation {
93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
98fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_variable(const struct glsl_type *, const char *);
102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
10344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_variable *as_variable()
10444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
10544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
10644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
10744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
10878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
10978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
11078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
11178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
11278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
123a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
124a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction {
125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label(const char *label);
127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
12878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
12978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
13078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
13178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
13278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *label;
134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
140e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
14278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
14378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
14478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
14578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
14678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * List of function parameters stored as ir_variable objects.
156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1570044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Pointer to the label that begins the function definition.
161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label *definition;
1636a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
1646a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate:
1656a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   /** Function of which this signature is one overload. */
1666a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   class ir_function *function;
1676a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
1686a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   friend class ir_function;
169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
170a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table
174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
177882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
17978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
18078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
18178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
18278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
18378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
1846a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   void add_signature(ir_function_signature *sig)
1856a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   {
1866a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      sig->function = this;
1876a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      signatures.push_tail(sig);
1886a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   }
1896a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
19195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    * Get an iterator for the set of function signatures
19295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    */
19395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   exec_list_iterator iterator()
19495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   {
19595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick      return signatures.iterator();
19695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   }
19795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick
19895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   /**
199471471f83471481db0445e73f8c89e6a9149838eIan Romanick    * Find a signature that matches a set of actual parameters.
200471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
201471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *matching_signature(exec_list *actual_param);
202471471f83471481db0445e73f8c89e6a9149838eIan Romanick
203471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
208471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
209471471f83471481db0445e73f8c89e6a9149838eIan Romanick    * Set of overloaded functions with this name.
210471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
2110044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2163c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/**
2173c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements
2183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */
2193c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction {
2203c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic:
2213c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if(ir_rvalue *condition)
2223c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      : condition(condition)
2233c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
2243c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      /* empty */
2253c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
2263c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2273c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void accept(ir_visitor *v)
2283c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
2293c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      v->visit(this);
2303c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
2313c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2323c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *condition;
2333c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  then_instructions;
2343c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  else_instructions;
2353c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick};
2363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
238fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue {
239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
240fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
24278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
24378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
24478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
24578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
24678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
250fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *lhs;
251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
255fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
260fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
263e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt/* Update ir_print_visitor.cpp when updating this list. */
264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
27144d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_exp,
273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_log,
27401665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
27501665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
2786c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_not,
322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
330fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
333fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
33578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
33678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
33778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
33878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
33978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
341fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *operands[2];
342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
345ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
346ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
347ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
348fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue {
349ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
350471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call(const ir_function_signature *callee, exec_list *actual_parameters)
351fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      : ir_rvalue(), callee(callee)
352ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
3539e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
3549e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      type = callee->return_type;
355471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
356ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
357ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
358ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
359ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
360ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
361ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
362ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
363ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
364ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
365ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
366ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   static ir_call *get_error_instruction();
367ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
3689878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   /**
3699878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
3709878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
3719878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
3729878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
3739878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
3749878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
3759878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
37693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
37793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
37893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
37993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
38093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
38193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick      /* FINISHME: This only works for functions that have definitions. */
38293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick      return callee->definition->label;
38393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
38493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
385ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
386471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
387fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      : ir_rvalue(), callee(NULL)
388471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
389471471f83471481db0445e73f8c89e6a9149838eIan Romanick      /* empty */
390471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
391471471f83471481db0445e73f8c89e6a9149838eIan Romanick
392471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *callee;
393ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   exec_list actual_parameters;
394ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
395ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
396ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
3979578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
3989578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
3999578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
4009578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
4019578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
4029578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
4039578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
4049578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
4059578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
40644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      : ir_instruction()
4079578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
4089578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
4099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
4109578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
4119578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
4129578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
4139578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
4149578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
4159578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
4169578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
4179578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
4189578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
4199578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
420fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
4219578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
4229578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
4239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
4249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
4259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
426fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
4279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
4289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
4299578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
4309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
4319578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
4329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
4339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
4349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
4359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
4369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate:
437fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
4389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
4399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
4409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
4419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
451f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
461affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
462affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
463affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
464affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
465affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
466affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
467affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
468affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
469affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
470affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
471affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
472affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
473affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
474affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
475affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
476affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   bool is_lvalue()
477affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
478a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
479affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
480affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
481affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
482affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
483affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
484affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
485affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
486fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_dereference(struct ir_instruction *);
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
490fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_dereference(ir_instruction *variable, ir_rvalue *array_index);
491954699773681842dac9f8f0d9ba4629513232196Ian Romanick
49244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
49344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
49444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
49544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
49644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
49778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
49878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
49978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
50078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
50178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
502fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   bool is_lvalue()
503fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
504c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt      if (var == NULL)
505521c2983b43570ece73d9377f812baa6bcaf94d3Ian Romanick	 return false;
506c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt
507521c2983b43570ece73d9377f812baa6bcaf94d3Ian Romanick      ir_variable *const as_var = var->as_variable();
508c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt      if (as_var == NULL)
509521c2983b43570ece73d9377f812baa6bcaf94d3Ian Romanick	 return false;
510c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt
511c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt      return !as_var->read_only;
512fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
513fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum {
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_variable,
516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_array,
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_record
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Object being dereferenced.
522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
523fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke    * Must be either an \c ir_variable or an \c ir_rvalue.
524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *var;
526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
528fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      ir_rvalue *array_index;
529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      const char *field;
530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } selector;
531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
534fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_constant(const struct glsl_type *type, const void *data);
5373c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
5383c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
5393c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
5403c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
541a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
54278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
54378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
54478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
54578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
54678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned u[16];
556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int i[16];
557a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      float f[16];
558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      bool b[16];
559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } value;
560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
561a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
562adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
563adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
564adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
565adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
566e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
567c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
568c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions,
569c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt				struct _mesa_glsl_parse_state *state);
570c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
571e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
572