ir.h revision bff6013d469b3d4e54cdc5731801c56994a523ec
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; }
556202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual class ir_function *          as_function()         { return NULL; }
5644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual class ir_dereference *       as_dereference()      { return NULL; }
57fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual class ir_rvalue *            as_rvalue()           { return NULL; }
587d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual class ir_label *             as_label()            { return NULL; }
5901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual class ir_loop *              as_loop()             { return NULL; }
60cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_assignment *        as_assignment()       { return NULL; }
61cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_call *              as_call()             { return NULL; }
62cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual class ir_return *            as_return()           { return NULL; }
635ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual class ir_if *                as_if()               { return NULL; }
647d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual class ir_swizzle *           as_swizzle()          { return NULL; }
6544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   /*@}*/
6644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected:
6844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   ir_instruction()
69d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   {
70d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick      /* empty */
71d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick   }
72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
75fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction {
76fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic:
77fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual ir_rvalue * as_rvalue()
78fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
79fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return this;
80fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
81fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
82fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   virtual bool is_lvalue()
83fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   {
84fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      return false;
85fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   }
86fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
87fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected:
88b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   ir_rvalue()
89b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   {
90b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      /* empty */
91b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick   }
92fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke};
93fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
94fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode {
96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_auto = 0,
97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_uniform,
98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_in,
99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_out,
100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_inout
101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_varaible_interpolation {
104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_smooth = 0,
105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_flat,
106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_var_noperspective
107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
109fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction {
111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_variable(const struct glsl_type *, const char *);
113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
11444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_variable *as_variable()
11544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
11644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
11744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
11844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
11978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
12078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
12178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
12278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
12378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
1242d394d4877794d19756c3760d711524dca89f772Ian Romanick   /**
1252d394d4877794d19756c3760d711524dca89f772Ian Romanick    * Duplicate an IR variable
1262d394d4877794d19756c3760d711524dca89f772Ian Romanick    *
1272d394d4877794d19756c3760d711524dca89f772Ian Romanick    * \note
1282d394d4877794d19756c3760d711524dca89f772Ian Romanick    * This will probably be made \c virtual and moved to the base class
1292d394d4877794d19756c3760d711524dca89f772Ian Romanick    * eventually.
1302d394d4877794d19756c3760d711524dca89f772Ian Romanick    */
1312d394d4877794d19756c3760d711524dca89f772Ian Romanick   ir_variable *clone() const
1322d394d4877794d19756c3760d711524dca89f772Ian Romanick   {
1332d394d4877794d19756c3760d711524dca89f772Ian Romanick      ir_variable *var = new ir_variable(type, name);
1342d394d4877794d19756c3760d711524dca89f772Ian Romanick
135b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick      var->max_array_access = this->max_array_access;
1362d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->read_only = this->read_only;
1372d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->centroid = this->centroid;
1382d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->invariant = this->invariant;
1392d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->mode = this->mode;
1402d394d4877794d19756c3760d711524dca89f772Ian Romanick      var->interpolation = this->interpolation;
1412d394d4877794d19756c3760d711524dca89f772Ian Romanick
1422d394d4877794d19756c3760d711524dca89f772Ian Romanick      return var;
1432d394d4877794d19756c3760d711524dca89f772Ian Romanick   }
1442d394d4877794d19756c3760d711524dca89f772Ian Romanick
145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
146a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
147b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   /**
148b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Highest element accessed with a constant expression array index
149b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    *
150b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    * Not used for non-array variables.
151b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick    */
152b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick   unsigned max_array_access;
153b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned read_only:1;
155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned centroid:1;
156a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned invariant:1;
15771df19f5ef6e78beb5160801f81468184b75447eEric Anholt   /** If the variable is initialized outside of the scope of the shader */
15871df19f5ef6e78beb5160801f81468184b75447eEric Anholt   unsigned shader_in:1;
15971df19f5ef6e78beb5160801f81468184b75447eEric Anholt   /**
16071df19f5ef6e78beb5160801f81468184b75447eEric Anholt    * If the variable value is later used outside of the scope of the shader.
16171df19f5ef6e78beb5160801f81468184b75447eEric Anholt    */
16271df19f5ef6e78beb5160801f81468184b75447eEric Anholt   unsigned shader_out:1;
163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned mode:3;
165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned interpolation:2;
1669d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick
1679d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   /**
1689d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * Flag that the whole array is assignable
1699d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    *
1709d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * In GLSL 1.20 and later whole arrays are assignable (and comparable for
1719d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    * equality).  This flag enables this behavior.
1729d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick    */
1739d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   unsigned array_lvalue:1;
174326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt
175326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   /**
176c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    * Emit a warning if this variable is accessed.
177c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick    */
178c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   const char *warn_extension;
179c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick
180c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick   /**
181326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    * Value assigned in the initializer of a variable declared "const"
182326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt    */
183326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt   ir_constant *constant_value;
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/
1889fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/**
1899fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or
1909fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype.
1919fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */
192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction {
193894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /* An ir_function_signature will be part of the list of signatures in
194894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    * an ir_function.
195894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt    */
196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
197e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   ir_function_signature(const glsl_type *return_type);
198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
19978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
20078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
20178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
20278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
20378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
2050f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    * Get the name of the function for which this is a signature
2060f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick    */
2070f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   const char *function_name() const;
2080f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
2090f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   /**
210abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * Check whether the qualifiers match between this signature's parameters
211abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * and the supplied parameter list.  If not, returns the name of the first
212abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    * parameter with mismatched qualifiers (for use in error messages).
213abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke    */
214abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   const char *qualifiers_match(exec_list *params);
215abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke
216abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke   /**
217bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * Replace the current parameter list with the given one.  This is useful
218bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * if the current information came from a prototype, and either has invalid
219bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    * or missing parameter names.
220bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke    */
221bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   void replace_parameters(exec_list *new_params);
222bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke
223bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   /**
224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Function return type.
225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \note This discards the optional precision qualifier.
227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *return_type;
229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
231f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_variable of function parameters.
232f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    *
233f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * This represents the storage.  The paramaters passed in a particular
234f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * call will be in ir_call::actual_paramaters.
235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
2360044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list parameters;
237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2389fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   /** Whether or not this function has a body (which may be empty). */
2399fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   unsigned is_defined:1;
2406a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
241894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   /** Body of instructions in the function. */
242894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   struct exec_list body;
243894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt
2446a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate:
2456a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   /** Function of which this signature is one overload. */
2466a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   class ir_function *function;
2476a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
2486a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   friend class ir_function;
249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
2539fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name.
2549fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the
2559fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions.
256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction {
258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
259882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick   ir_function(const char *name);
260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2616202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   virtual ir_function *as_function()
2626202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   {
2636202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke      return this;
2646202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke   }
2656202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke
26678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
26778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
26878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
26978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
27078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2716a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   void add_signature(ir_function_signature *sig)
2726a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   {
2736a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      sig->function = this;
2746a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick      signatures.push_tail(sig);
2756a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick   }
2766a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick
277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
27895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    * Get an iterator for the set of function signatures
27995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick    */
28095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   exec_list_iterator iterator()
28195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   {
28295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick      return signatures.iterator();
28395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   }
28495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick
28595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick   /**
2860d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that matches a set of actual parameters, taking implicit
2870d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * conversions into account.
288471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
289471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *matching_signature(exec_list *actual_param);
290471471f83471481db0445e73f8c89e6a9149838eIan Romanick
291471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
2920d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * Find a signature that exactly matches a set of actual parameters without
2930d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    * any implicit type conversions.
2940d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke    */
2950d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   ir_function_signature *exact_matching_signature(exec_list *actual_ps);
2960d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke
2970d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke   /**
298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Name of the function.
299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name;
301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
302a4775823b09f0ff77a46e8f35fba32234791a64cIan Romanickprivate:
303471471f83471481db0445e73f8c89e6a9149838eIan Romanick   /**
304f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt    * List of ir_function_signature for each overloaded function with this name.
305471471f83471481db0445e73f8c89e6a9149838eIan Romanick    */
3060044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   struct exec_list signatures;
307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
3080f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick
3090f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const
3100f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{
3110f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick   return function->name;
3120f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick}
313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/
314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3163c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/**
3173c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements
3183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */
3193c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction {
3203c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic:
3213c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if(ir_rvalue *condition)
3223c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      : condition(condition)
3233c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
3243c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      /* empty */
3253c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
3263c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3275ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   virtual ir_if *as_if()
3285ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   {
3295ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt      return this;
3305ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt   }
3315ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt
3323c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void accept(ir_visitor *v)
3333c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   {
3343c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      v->visit(this);
3353c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
3363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *condition;
338f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the then branch */
3393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  then_instructions;
340f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction for the body of the else branch */
3413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   exec_list  else_instructions;
3423c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick};
3433c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
3443c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
345fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/**
346fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure.
347fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */
348fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction {
349fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic:
350fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL)
351fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
352fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      /* empty */
353fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
354fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
355fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   virtual void accept(ir_visitor *v)
356fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
357fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      v->visit(this);
358fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
359fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
36001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   virtual ir_loop *as_loop()
36101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   {
36201f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick      return this;
36301f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick   }
36401f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick
365fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
366fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * Get an iterator for the instructions of the loop body
367fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
368fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list_iterator iterator()
369fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   {
370fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      return body_instructions.iterator();
371fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
372fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
373f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /** List of ir_instruction that make up the body of the loop. */
374fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   exec_list body_instructions;
375fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
376fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /**
377fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    * \name Loop counter and controls
378fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick    */
379fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@{*/
380fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *from;
381fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *to;
382fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_rvalue *increment;
383fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   ir_variable *counter;
384fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   /*@}*/
385fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick};
386fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
387fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
388fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_assignment : public ir_rvalue {
389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
390fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
39278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
39378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
39478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
39578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
39678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
397cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_assignment * as_assignment()
398cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
399cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
400cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
401cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Left-hand side of the assignment.
404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
405fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *lhs;
406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value being assigned
409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
410fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *rhs;
411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Optional condition for the assignment.
414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
415fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *condition;
416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
418160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt/* Update ir_expression::num_operands() and ir_print_visitor.cpp when
419160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list.
420160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt*/
421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation {
422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_bit_not,
423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_logic_not,
424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_neg,
425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_abs,
426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rcp,
427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_rsq,
42844d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt   ir_unop_sqrt,
429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_exp,
430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_log,
43101665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_exp2,
43201665262e50162e858c45f92a8a7e12b953e56adEric Anholt   ir_unop_log2,
433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_f2i,      /**< Float-to-integer conversion. */
434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_i2f,      /**< Integer-to-float conversion. */
435dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_f2b,      /**< Float-to-boolean conversion */
436dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt   ir_unop_b2f,      /**< Boolean-to-float conversion */
437c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_i2b,      /**< int-to-boolean conversion */
438c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt   ir_unop_b2i,      /**< Boolean-to-int conversion */
4396c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Unary floating-point rounding operations.
443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_trunc,
446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_ceil,
447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_unop_floor,
448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_add,
451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_sub,
452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mul,
453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_div,
454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_mod,
455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Binary comparison operators
458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_less,
461a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_greater,
462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lequal,
463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_gequal,
464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_equal,
465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_nequal,
466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * \name Bit-wise binary operations.
470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
471a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@{*/
472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_lshift,
473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_rshift,
474a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_and,
475a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_xor,
476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_bit_or,
477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*@}*/
478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_and,
480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_xor,
481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_logic_or,
482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_dot,
484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_min,
485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_max,
486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_binop_pow
488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
490fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue {
491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression(int op, const struct glsl_type *type,
493fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke		 ir_rvalue *, ir_rvalue *);
494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4957dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   static unsigned int get_num_operands(ir_expression_operation);
4967dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   unsigned int get_num_operands()
4977dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   {
4987dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke      return get_num_operands(operation);
4997dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke   }
500160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt
50178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
50278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
50378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
50478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
50578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
506cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_expression *clone();
507cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_expression_operation operation;
509fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *operands[2];
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
513ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/**
514ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call
515ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */
516fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue {
517ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic:
518471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call(const ir_function_signature *callee, exec_list *actual_parameters)
519b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(callee)
520ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
5219e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      assert(callee->return_type != NULL);
5229e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick      type = callee->return_type;
523471471f83471481db0445e73f8c89e6a9149838eIan Romanick      actual_parameters->move_nodes_to(& this->actual_parameters);
524ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
525ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
526cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_call *as_call()
527cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
528cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
529cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
530cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
531ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void accept(ir_visitor *v)
532ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   {
533ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick      v->visit(this);
534ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   }
535ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
536ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   /**
537ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    * Get a generic ir_call object when an error occurs
538ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick    */
539ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   static ir_call *get_error_instruction();
540ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
5419878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   /**
5429878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    * Get an iterator for the set of acutal parameters
5439878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick    */
5449878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   exec_list_iterator iterator()
5459878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   {
5469878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick      return actual_parameters.iterator();
5479878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick   }
5489878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick
54993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   /**
55093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    * Get the name of the function being called.
55193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick    */
55293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   const char *callee_name() const
55393614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   {
5540f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick      return callee->function_name();
55593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick   }
55693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick
557cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   const ir_function_signature *get_callee()
558cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
559cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return callee;
560cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
561cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
562cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   /**
563cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * Generates an inline version of the function before @ir,
564cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    * returning the return value of the function.
565cad9766118d269725ef33b4e9588d674d5225010Eric Anholt    */
566cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_rvalue *generate_inline(ir_instruction *ir);
567cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
568ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate:
569471471f83471481db0445e73f8c89e6a9149838eIan Romanick   ir_call()
570b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick      : callee(NULL)
571471471f83471481db0445e73f8c89e6a9149838eIan Romanick   {
572471471f83471481db0445e73f8c89e6a9149838eIan Romanick      /* empty */
573471471f83471481db0445e73f8c89e6a9149838eIan Romanick   }
574471471f83471481db0445e73f8c89e6a9149838eIan Romanick
575471471f83471481db0445e73f8c89e6a9149838eIan Romanick   const ir_function_signature *callee;
576f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt
577f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt   /* List of ir_rvalue of paramaters passed in this call. */
578ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   exec_list actual_parameters;
579ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick};
580ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
581ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
5829578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/**
5839578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions.
5849578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick *
5859578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard.
5869578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */
5879578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/
5889578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction {
5899578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected:
5909578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_jump()
5919578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
5929578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
5939578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
5949578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
5959578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
5969578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump {
5979578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic:
5989578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   ir_return()
5999578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(NULL)
6009578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6019578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
6029578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6039578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
604fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_return(ir_rvalue *value)
6059578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      : value(value)
6069578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6079578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      /* empty */
6089578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
610cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   virtual ir_return *as_return()
611cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
612cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return this;
613cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
614cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
615fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *get_value() const
6169578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6179578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      return value;
6189578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6199578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
6209578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void accept(ir_visitor *v)
6219578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   {
6229578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      v->visit(this);
6239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
6249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
6259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprivate:
626fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *value;
6279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick};
628f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
629f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
630f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/**
631f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops
632f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
633f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue.  The \c break within a loop is
634f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement.
635f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick *
636f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump
637f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */
638f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump {
639f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic:
640f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode {
641f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_break,
642f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      jump_continue
643f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   };
644f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
645f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   ir_loop_jump(ir_loop *loop, jump_mode mode)
646f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      : loop(loop), mode(mode)
647f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
648f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      /* empty */
649f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
650f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
651f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   virtual void accept(ir_visitor *v)
652f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
653f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      v->visit(this);
654f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
655f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
656f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_break() const
657f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
658f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_break;
659f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
660f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
661f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   bool is_continue() const
662f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   {
663f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick      return mode == jump_continue;
664f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   }
665f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
666f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickprivate:
667f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Loop containing this break instruction. */
668f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   ir_loop *loop;
669f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
670f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   /** Mode selector for the jump instruction. */
671f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   enum jump_mode mode;
672f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick};
6739578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/
6749578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
6759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
676a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask {
677a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned x:2;
678a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned y:2;
679a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned z:2;
680a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned w:2;
681a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
683a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Number of components in the swizzle.
684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
685f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke   unsigned num_components:3;
686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
687a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Does the swizzle contain duplicate components?
689a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * L-value swizzles cannot contain duplicate components.
691a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   unsigned has_duplicates:1;
693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
695affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
696affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue {
697affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic:
698affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
699affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke              unsigned count);
700cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
701cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      : val(val), mask(mask)
702cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
703cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      /* empty */
704cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
705cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
7067d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   virtual ir_swizzle *as_swizzle()
7077d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   {
7087d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt      return this;
7097d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt   }
7107d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt
711cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_swizzle *clone()
712cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
713cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return new ir_swizzle(this->val, this->mask);
714cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
715cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
716affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   /**
717affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    * Construct an ir_swizzle from the textual representation.  Can fail.
718affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke    */
719affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
720affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
721affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void accept(ir_visitor *v)
722affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
723affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      v->visit(this);
724affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
725affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
726affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   bool is_lvalue()
727affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   {
728a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt      return val->is_lvalue() && !mask.has_duplicates;
729affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
730affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
731affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_rvalue *val;
732affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir_swizzle_mask mask;
733affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke};
734affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
735affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
736fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue {
737a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
738a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_dereference(struct ir_instruction *);
739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
740fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_dereference(ir_instruction *variable, ir_rvalue *array_index);
741954699773681842dac9f8f0d9ba4629513232196Ian Romanick
74244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   virtual ir_dereference *as_dereference()
74344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   {
74444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      return this;
74544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke   }
74644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke
74778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
74878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
74978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
75078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
75178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
752c7da28b4beb3a593f49a6c01a90b123584b421e8Eric Anholt   bool is_lvalue();
753fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke
754a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   enum {
755a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_variable,
756a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_array,
757a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_reference_record
758a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } mode;
759a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
760a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
761a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Object being dereferenced.
762a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
763fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke    * Must be either an \c ir_variable or an \c ir_rvalue.
764a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
765a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_instruction *var;
766a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
767a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
768fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      ir_rvalue *array_index;
769a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      const char *field;
770a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } selector;
771a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
772a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
773a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
774fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue {
775a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic:
776a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ir_constant(const struct glsl_type *type, const void *data);
7773c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(bool b);
7783c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(unsigned int u);
7793c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(int i);
7803c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt   ir_constant(float f);
781a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
78278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void accept(ir_visitor *v)
78378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
78478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      v->visit(this);
78578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
78678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
787cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   ir_constant *clone()
788cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   {
789cad9766118d269725ef33b4e9588d674d5225010Eric Anholt      return new ir_constant(this->type, &this->value);
790cad9766118d269725ef33b4e9588d674d5225010Eric Anholt   }
791cad9766118d269725ef33b4e9588d674d5225010Eric Anholt
792a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /**
793a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * Value of the constant.
794a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
795a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * The field used to back the values supplied by the constant is determined
796a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * by the type associated with the \c ir_instruction.  Constants may be
797a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * scalars, vectors, or matrices.
798a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
799a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   union {
800a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      unsigned u[16];
801a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      int i[16];
802a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      float f[16];
803a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      bool b[16];
804a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } value;
805a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick};
806a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
80770b74928a220aff024664714877defb0caedf33fEric Anholtvoid
80870b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor);
809adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
810adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void
811adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions,
812adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick				struct _mesa_glsl_parse_state *state);
813e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick
814c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void
815c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt_mesa_glsl_initialize_functions(exec_list *instructions,
816c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt				struct _mesa_glsl_parse_state *state);
817c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt
818e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */
819