ir.h revision 2d394d4877794d19756c3760d711524dca89f772
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
1132d394d4877794d19756c3760d711524dca89f772Ian Romanick   /**
1142d394d4877794d19756c3760d711524dca89f772Ian Romanick    * Duplicate an IR variable
1152d394d4877794d19756c3760d711524dca89f772Ian Romanick    *
1162d394d4877794d19756c3760d711524dca89f772Ian Romanick    * \note
1172d394d4877794d19756c3760d711524dca89f772Ian Romanick    * This will probably be made \c virtual and moved to the base class
1182d394d4877794d19756c3760d711524dca89f772Ian Romanick    * eventually.
1192d394d4877794d19756c3760d711524dca89f772Ian Romanick    */
1202d394d4877794d19756c3760d711524dca89f772Ian Romanick   ir_variable *clone() const
1212d394d4877794d19756c3760d711524dca89f772Ian Romanick   {
1222d394d4877794d19756c3760d711524dca89f772Ian Romanick      ir_variable *var = new ir_variable(type, name);
1232d394d4877794d19756c3760d711524dca89f772Ian Romanick
1242d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->read_only = this->read_only;
1252d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->centroid = this->centroid;
1262d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->invariant = this->invariant;
1272d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->mode = this->mode;
1282d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->interpolation = this->interpolation;
1292d394d4877794d19756c3760d711524dca89f772Ian Romanick
1302d394d4877794d19756c3760d711524dca89f772Ian Romanick      return var;
1312d394d4877794d19756c3760d711524dca89f772Ian Romanick   }
1322d394d4877794d19756c3760d711524dca89f772Ian Romanick
133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
137a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_label : public ir_instruction {
145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label(const char *label);
147a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
14878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
14978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
15078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
15178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
15278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *label;
154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
160e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
16278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
16378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
16478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
16578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
16678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
1680f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    * Get the name of the function for which this is a signature
1690f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    */
1700f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   const char *function_name() const;
1710f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
1720f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   /**
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * List of function parameters stored as ir_variable objects.
181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1820044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Pointer to the label that begins the function definition.
186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_label *definition;
1886a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
1896a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate:
1906a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   /** Function of which this signature is one overload. */
1916a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   class ir_function *function;
1926a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
1936a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   friend class ir_function;
194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
195a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Header for tracking functions in the symbol table
199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
202882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
20478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
20578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
20678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
20778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
20878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2096a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   void add_signature(ir_function_signature *sig)
2106a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   {
2116a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      sig->function = this;
2126a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      signatures.push_tail(sig);
2136a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   }
2146a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
21695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    * Get an iterator for the set of function signatures
21795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    */
21895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   exec_list_iterator iterator()
21995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   {
22095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick      return signatures.iterator();
22195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   }
22295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick
22395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   /**
224471471f83471481db0445e73f8c89e6a9149838eIan Romanick    * Find a signature that matches a set of actual parameters.
225471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
226471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *matching_signature(exec_list *actual_param);
227471471f83471481db0445e73f8c89e6a9149838eIan Romanick
228471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
233a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate:
234471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
235471471f83471481db0445e73f8c89e6a9149838eIan Romanick    * Set of overloaded functions with this name.
236471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
2370044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
2390f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
2400f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const
2410f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{
2420f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   return function->name;
2430f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick}
244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2473c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/**
2483c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements
2493c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */
2503c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction {
2513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic:
2523c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if(ir_rvalue *condition)
2533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      : condition(condition)
2543c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
2553c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      /* empty */
2563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
2573c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2583c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void accept(ir_visitor *v)
2593c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
2603c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      v->visit(this);
2613c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
2623c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2633c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *condition;
2643c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  then_instructions;
2653c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  else_instructions;
2663c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick};
2673c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2683c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
269fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue {
270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
271fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
27378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
27478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
27578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
27678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
27778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
281fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *lhs;
282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
286fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
291fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
294e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt/* Update ir_print_visitor.cpp when updating this list. */
295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
30244d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_exp,
304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_log,
30501665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
30601665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
3096c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
348a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
349a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_not,
353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
361fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
364fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
365a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
36678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
36778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
36878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
36978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
37078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
371a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
372fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *operands[2];
373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
375a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
376ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
377ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
378ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
379fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue {
380ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
381471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call(const ir_function_signature *callee, exec_list *actual_parameters)
382fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      : ir_rvalue(), callee(callee)
383ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
3849e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
3859e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      type = callee->return_type;
386471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
387ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
388ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
389ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
390ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
391ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
392ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
393ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
394ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
395ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
396ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
397ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   static ir_call *get_error_instruction();
398ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
3999878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   /**
4009878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
4019878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
4029878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
4039878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
4049878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
4059878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
4069878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
40793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
40893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
40993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
41093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
41193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
4120f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick      return callee->function_name();
41393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
41493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
415ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
416471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
417fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      : ir_rvalue(), callee(NULL)
418471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
419471471f83471481db0445e73f8c89e6a9149838eIan Romanick      /* empty */
420471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
421471471f83471481db0445e73f8c89e6a9149838eIan Romanick
422471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *callee;
423ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   exec_list actual_parameters;
424ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
425ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
426ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
4279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
4289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
4299578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
4309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
4319578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
4329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
4339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
4349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
4359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
43644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      : ir_instruction()
4379578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
4389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
4399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
4409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
4419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
4429578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
4439578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
4449578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
4459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
4469578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
4479578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
4489578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
4499578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
450fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
4519578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
4529578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
4539578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
4549578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
4559578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
456fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
4579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
4589578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
4599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
4609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
4619578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
4629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
4639578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
4649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
4659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
4669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate:
467fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
4689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
4699578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
4709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
4719578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
474a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
475a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
481f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
491affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
492affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
493affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
494affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
495affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
496affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
497affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
498affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
499affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
500affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
501affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
502affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
503affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
504affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
505affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
506affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   bool is_lvalue()
507affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
508a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
509affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
510affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
511affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
512affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
513affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
514affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
515affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
516fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_dereference(struct ir_instruction *);
519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
520fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_dereference(ir_instruction *variable, ir_rvalue *array_index);
521954699773681842dac9f8f0d9ba4629513232196Ian Romanick
52244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
52344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
52444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
52544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
52644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
52778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
52878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
52978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
53078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
53178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
532fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   bool is_lvalue()
533fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
534c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt      if (var == NULL)
535521c2983b43570ece73d9377f812baa6bcaf94d3Ian Romanick	 return false;
536c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt
537521c2983b43570ece73d9377f812baa6bcaf94d3Ian Romanick      ir_variable *const as_var = var->as_variable();
538c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt      if (as_var == NULL)
539521c2983b43570ece73d9377f812baa6bcaf94d3Ian Romanick	 return false;
540c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt
541c4f86d3b80047ce3a8be1fa69396856af1719bc9Eric Anholt      return !as_var->read_only;
542fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
543fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum {
545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_variable,
546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_array,
547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_record
548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Object being dereferenced.
552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
553fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke    * Must be either an \c ir_variable or an \c ir_rvalue.
554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *var;
556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
557a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
558fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      ir_rvalue *array_index;
559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      const char *field;
560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } selector;
561a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
562a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
563a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
564fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
565a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
566a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_constant(const struct glsl_type *type, const void *data);
5673c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
5683c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
5693c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
5703c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
57278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
57378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
57478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
57578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
57678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
581a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned u[16];
586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int i[16];
587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      float f[16];
588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      bool b[16];
589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } value;
590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
592adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
593adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
594adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
595adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
596e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
597c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
598c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions,
599c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt				struct _mesa_glsl_parse_state *state);
600c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
601e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
602