ir.h revision 950ceb2bd60c25e7fecdff0fbcbf6e69015588f3
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* -*- c++ -*- */
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright © 2010 Intel Corporation
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copy of this software and associated documentation files (the "Software"),
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * to deal in the Software without restriction, including without limitation
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the rights to use, copy, modify, merge, publish, distribute, sublicense,
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * and/or sell copies of the Software, and to permit persons to whom the
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Software is furnished to do so, subject to the following conditions:
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * The above copyright notice and this permission notice (including the next
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * paragraph) shall be included in all copies or substantial portions of the
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Software.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DEALINGS IN THE SOFTWARE.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#pragma once
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef IR_H
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define IR_H
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include <cstdio>
305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include <cstdlib>
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "list.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "ir_visitor.h"
34e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "ir_hierarchical_visitor.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)struct ir_program {
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)   void *bong_hits;
38e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch};
395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
40bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)/**
41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Base class of all IR instructions
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class ir_instruction : public exec_node {
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)public:
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)   const struct glsl_type *type;
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)   class ir_constant *constant_expression_value();
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)   /** ir_print_visitor helper for debugging. */
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)   void print(void);
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
52591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch   virtual void accept(ir_visitor *) = 0;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   /**
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * \name IR instruction downcast functions
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    *
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * These functions either cast the object to a derived class or return
59323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    * \c NULL if the object's type does not match the specified derived class.
6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * Additional downcast functions will be added as needed.
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    */
62f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu   /*@{*/
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   virtual class ir_variable *          as_variable()         { return NULL; }
64f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu   virtual class ir_function *          as_function()         { return NULL; }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   virtual class ir_dereference *       as_dereference()      { return NULL; }
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   virtual class ir_dereference_array *	as_dereference_array() { return NULL; }
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   virtual class ir_rvalue *            as_rvalue()           { return NULL; }
68f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu   virtual class ir_loop *              as_loop()             { return NULL; }
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   virtual class ir_assignment *        as_assignment()       { return NULL; }
70f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu   virtual class ir_call *              as_call()             { return NULL; }
71323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)   virtual class ir_return *            as_return()           { return NULL; }
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   virtual class ir_if *                as_if()               { return NULL; }
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   virtual class ir_swizzle *           as_swizzle()          { return NULL; }
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   virtual class ir_constant *          as_constant()         { return NULL; }
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   /*@}*/
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
77f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuprotected:
78f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu   ir_instruction()
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   {
80f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu      /* empty */
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   }
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
83323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ir_rvalue : public ir_instruction {
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   virtual ir_rvalue * as_rvalue()
88f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu   {
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      return this;
90323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)   }
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   virtual bool is_lvalue()
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   {
94d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)      return false;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   }
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   /**
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    * Get the variable that is ultimately referenced by an r-value
99f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    */
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   virtual ir_variable *variable_referenced()
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   {
10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)      return NULL;
10309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   }
10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   /**
10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * If an r-value is a reference to a whole variable, get that variable
10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    *
10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * \return
11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * Pointer to a variable that is completely dereferenced by the r-value.  If
11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * the r-value is not a dereference or the dereference does not access the
11209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * entire variable (i.e., it's just one array element, struct field), \c NULL
11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * is returned.
11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    */
11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   virtual ir_variable *whole_variable_referenced()
11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   {
11709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)      return NULL;
11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   }
11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
12023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdochprotected:
12123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch   ir_rvalue()
12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   {
12323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch      /* empty */
12423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch   }
125323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)};
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum ir_variable_mode {
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_var_auto = 0,
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_var_uniform,
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_var_in,
132323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)   ir_var_out,
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_var_inout
13409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)};
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum ir_varaible_interpolation {
13709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_var_smooth = 0,
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_var_flat,
139f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu   ir_var_noperspective
14009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)};
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
143f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuclass ir_variable : public ir_instruction {
14409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)public:
14509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_variable(const struct glsl_type *, const char *);
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   virtual ir_variable *as_variable()
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   {
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   }
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   virtual void accept(ir_visitor *v)
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   {
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      v->visit(this);
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   }
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
157197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
15809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   /**
16009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * Duplicate an IR variable
161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    *
16209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * \note
163197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    * This will probably be made \c virtual and moved to the base class
16409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * eventually.
16509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    */
16609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_variable *clone() const
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   {
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ir_variable *var = new ir_variable(type, name);
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
170197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch      var->max_array_access = this->max_array_access;
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      var->read_only = this->read_only;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var->centroid = this->centroid;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var->invariant = this->invariant;
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var->mode = this->mode;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var->interpolation = this->interpolation;
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      return var;
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   }
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   /**
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * Get the string value for the interpolation qualifier
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    *
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * \return
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * If none of \c shader_in or \c shader_out is set, an empty string will
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * be returned.  Otherwise the string that would be used in a shader to
1861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    * specify \c mode will be returned.
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   const char *interpolation_string() const;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   const char *name;
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   /**
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * Highest element accessed with a constant expression array index
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    *
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * Not used for non-array variables.
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   unsigned max_array_access;
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch   unsigned read_only:1;
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   unsigned centroid:1;
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   unsigned invariant:1;
202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   /** If the variable is initialized outside of the scope of the shader */
203197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   unsigned shader_in:1;
204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   /**
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * If the variable value is later used outside of the scope of the shader.
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   unsigned shader_out:1;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   unsigned mode:3;
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   unsigned interpolation:2;
21183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   /**
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * Flag that the whole array is assignable
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    *
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * In GLSL 1.20 and later whole arrays are assignable (and comparable for
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * equality).  This flag enables this behavior.
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   unsigned array_lvalue:1;
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   /**
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    * Emit a warning if this variable is accessed.
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    */
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   const char *warn_extension;
22406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
22509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   /**
226e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    * Value assigned in the initializer of a variable declared "const"
227e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    */
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_constant *constant_value;
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
23009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/*@{*/
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * The representation of a function instance; may be the full definition or
23509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * simply a prototype.
236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class ir_function_signature : public ir_instruction {
23809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   /* An ir_function_signature will be part of the list of signatures in
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    * an ir_function.
24053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    */
241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_function_signature(const glsl_type *return_type);
243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
24409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   virtual void accept(ir_visitor *v)
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   {
246197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch      v->visit(this);
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   }
248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
24909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   /**
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    * Get the name of the function for which this is a signature
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    */
25409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   const char *function_name() const;
25509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
25609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   /**
2571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    * Check whether the qualifiers match between this signature's parameters
2581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    * and the supplied parameter list.  If not, returns the name of the first
2591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    * parameter with mismatched qualifiers (for use in error messages).
260e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    */
261e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch   const char *qualifiers_match(exec_list *params);
262e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
263e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch   /**
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    * Replace the current parameter list with the given one.  This is useful
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * if the current information came from a prototype, and either has invalid
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * or missing parameter names.
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   void replace_parameters(exec_list *new_params);
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   /**
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * Function return type.
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    *
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * \note This discards the optional precision qualifier.
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   const struct glsl_type *return_type;
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   /**
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * List of ir_variable of function parameters.
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    *
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * This represents the storage.  The paramaters passed in a particular
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    * call will be in ir_call::actual_paramaters.
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    */
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   struct exec_list parameters;
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   /** Whether or not this function has a body (which may be empty). */
286197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   unsigned is_defined:1;
287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
288d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   /** Body of instructions in the function. */
289d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   struct exec_list body;
290d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   /** Function of which this signature is one overload. */
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   class ir_function *function;
294e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   friend class ir_function;
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/**
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Header for tracking multiple overloaded functions with the same name.
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Contains a list of ir_function_signatures representing each of the
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * actual functions.
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ir_function : public ir_instruction {
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
30653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)   ir_function(const char *name);
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)   virtual ir_function *as_function()
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   {
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this;
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   }
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   virtual void accept(ir_visitor *v)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   {
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      v->visit(this);
31609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   }
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
320d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   void add_signature(ir_function_signature *sig)
321d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   {
322d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)      sig->function = this;
323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)      signatures.push_tail(sig);
324d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   }
325d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   /**
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * Get an iterator for the set of function signatures
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   exec_list_iterator iterator()
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   {
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return signatures.iterator();
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   }
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
334a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch   /**
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * Find a signature that matches a set of actual parameters, taking implicit
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * conversions into account.
337f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    */
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   const ir_function_signature *matching_signature(exec_list *actual_param);
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
340f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)   /**
341323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    * Find a signature that exactly matches a set of actual parameters without
342f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    * any implicit type conversions.
343323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    */
344f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)   ir_function_signature *exact_matching_signature(exec_list *actual_ps);
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   /**
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * Name of the function.
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
3495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)   const char *name;
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
351f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)private:
352f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)   /**
353f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    * List of ir_function_signature for each overloaded function with this name.
354f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    */
355f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)   struct exec_list signatures;
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline const char *ir_function_signature::function_name() const
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
36051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)   return function->name;
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
36209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/*@}*/
3638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
3648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
3655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/**
3667757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch * IR instruction representing high-level if-statements
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
3681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)class ir_if : public ir_instruction {
369bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)public:
370bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)   ir_if(ir_rvalue *condition)
371bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)      : condition(condition)
372bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)   {
3737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch      /* empty */
3747757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch   }
3757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
3767757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch   virtual ir_if *as_if()
377bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)   {
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this;
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   }
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   virtual void accept(ir_visitor *v)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   {
3838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)      v->visit(this);
3845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   }
3851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
3865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
3875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
3885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   ir_rvalue *condition;
3895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   /** List of ir_instruction for the body of the then branch */
3905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   exec_list  then_instructions;
3915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   /** List of ir_instruction for the body of the else branch */
3925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   exec_list  else_instructions;
3938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)};
3945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
3955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
3965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)/**
3975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * IR instruction representing a high-level loop structure.
3985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) */
3995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class ir_loop : public ir_instruction {
4005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)public:
4015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL)
4025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   {
4035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)      /* empty */
4045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   }
40509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
40609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   virtual void accept(ir_visitor *v)
4075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   {
4085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)      v->visit(this);
4095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   }
41009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
4115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   virtual ir_loop *as_loop()
4145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   {
4155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)      return this;
4165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   }
4175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   /**
4195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    * Get an iterator for the instructions of the loop body
4205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    */
4215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   exec_list_iterator iterator()
4225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   {
4235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)      return body_instructions.iterator();
4245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)   }
42510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
42610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   /** List of ir_instruction that make up the body of the loop. */
42710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   exec_list body_instructions;
42810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
42910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   /**
43010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    * \name Loop counter and controls
43110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    */
43210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   /*@{*/
43310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   ir_rvalue *from;
43410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   ir_rvalue *to;
43510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   ir_rvalue *increment;
43610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   ir_variable *counter;
43710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   /*@}*/
43810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch};
43910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
44010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
44110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochclass ir_assignment : public ir_rvalue {
44210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochpublic:
44310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
44410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
44510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   virtual void accept(ir_visitor *v)
44610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   {
44710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch      v->visit(this);
44810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   }
44910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
45010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   virtual ir_assignment * as_assignment()
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   {
4548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)      return this;
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   }
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   /**
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * Left-hand side of the assignment.
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_rvalue *lhs;
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   /**
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    * Value being assigned
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_rvalue *rhs;
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)   /**
4688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    * Optional condition for the assignment.
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    */
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_rvalue *condition;
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* Update ir_expression::num_operands() and operator_strs when
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * updating this list.
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum ir_expression_operation {
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_unop_bit_not,
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_unop_logic_not,
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_unop_neg,
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_unop_abs,
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_unop_sign,
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_unop_rcp,
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_unop_rsq,
484197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   ir_unop_sqrt,
485926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_unop_exp,
486926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_unop_log,
48709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_unop_exp2,
488926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_unop_log2,
489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_unop_f2i,      /**< Float-to-integer conversion. */
490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_unop_i2f,      /**< Integer-to-float conversion. */
491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_unop_f2b,      /**< Float-to-boolean conversion */
49209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_unop_b2f,      /**< Boolean-to-float conversion */
493926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_unop_i2b,      /**< int-to-boolean conversion */
494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_unop_b2i,      /**< Boolean-to-int conversion */
495926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_unop_u2f,      /**< Unsigned-to-float conversion. */
496323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
497926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   /**
498926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    * \name Unary floating-point rounding operations.
49909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    */
500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   /*@{*/
501323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)   ir_unop_trunc,
502926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   ir_unop_ceil,
5038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)   ir_unop_floor,
50481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)   /*@}*/
5058abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
5068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)   /**
50781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    * \name Trigonometric operations.
50881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    */
50981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)   /*@{*/
51081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)   ir_unop_sin,
51181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)   ir_unop_cos,
512e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch   /*@}*/
513e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
514e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch   /**
515e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    * \name Partial derivatives.
516e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    */
51709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   /*@{*/
51809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_unop_dFdx,
519f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)   ir_unop_dFdy,
520e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch   /*@}*/
521e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
522e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch   ir_binop_add,
523e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch   ir_binop_sub,
524e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch   ir_binop_mul,
525e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch   ir_binop_div,
526e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch   ir_binop_mod,
527e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
528e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch   /**
52909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    * \name Binary comparison operators
53009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    */
53109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   /*@{*/
53209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_binop_less,
53309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_binop_greater,
53409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_binop_lequal,
53509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_binop_gequal,
53609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_binop_equal,
53709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   ir_binop_nequal,
53809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   /*@}*/
53909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
540f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu   /**
541f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    * \name Bit-wise binary operations.
542323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    */
543323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)   /*@{*/
544f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu   ir_binop_lshift,
545f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)   ir_binop_rshift,
546f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu   ir_binop_bit_and,
547197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   ir_binop_bit_xor,
548197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   ir_binop_bit_or,
549197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   /*@}*/
550f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
551f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu   ir_binop_logic_and,
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ir_binop_logic_xor,
553   ir_binop_logic_or,
554
555   ir_binop_dot,
556   ir_binop_min,
557   ir_binop_max,
558
559   ir_binop_pow
560};
561
562class ir_expression : public ir_rvalue {
563public:
564   ir_expression(int op, const struct glsl_type *type,
565		 ir_rvalue *, ir_rvalue *);
566
567   static unsigned int get_num_operands(ir_expression_operation);
568   unsigned int get_num_operands()
569   {
570      return get_num_operands(operation);
571   }
572
573   /**
574    * Return a string representing this expression's operator.
575    */
576   const char *operator_string();
577
578   /**
579    * Do a reverse-lookup to translate the given string into an operator.
580    */
581   static ir_expression_operation get_operator(const char *);
582
583   virtual void accept(ir_visitor *v)
584   {
585      v->visit(this);
586   }
587
588   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
589
590   ir_expression *clone();
591
592   ir_expression_operation operation;
593   ir_rvalue *operands[2];
594};
595
596
597/**
598 * IR instruction representing a function call
599 */
600class ir_call : public ir_rvalue {
601public:
602   ir_call(const ir_function_signature *callee, exec_list *actual_parameters)
603      : callee(callee)
604   {
605      assert(callee->return_type != NULL);
606      type = callee->return_type;
607      actual_parameters->move_nodes_to(& this->actual_parameters);
608   }
609
610   virtual ir_call *as_call()
611   {
612      return this;
613   }
614
615   virtual void accept(ir_visitor *v)
616   {
617      v->visit(this);
618   }
619
620   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
621
622   /**
623    * Get a generic ir_call object when an error occurs
624    */
625   static ir_call *get_error_instruction();
626
627   /**
628    * Get an iterator for the set of acutal parameters
629    */
630   exec_list_iterator iterator()
631   {
632      return actual_parameters.iterator();
633   }
634
635   /**
636    * Get the name of the function being called.
637    */
638   const char *callee_name() const
639   {
640      return callee->function_name();
641   }
642
643   const ir_function_signature *get_callee()
644   {
645      return callee;
646   }
647
648   /**
649    * Generates an inline version of the function before @ir,
650    * returning the return value of the function.
651    */
652   ir_rvalue *generate_inline(ir_instruction *ir);
653
654private:
655   ir_call()
656      : callee(NULL)
657   {
658      /* empty */
659   }
660
661   const ir_function_signature *callee;
662
663   /* List of ir_rvalue of paramaters passed in this call. */
664   exec_list actual_parameters;
665};
666
667
668/**
669 * \name Jump-like IR instructions.
670 *
671 * These include \c break, \c continue, \c return, and \c discard.
672 */
673/*@{*/
674class ir_jump : public ir_instruction {
675protected:
676   ir_jump()
677   {
678      /* empty */
679   }
680};
681
682class ir_return : public ir_jump {
683public:
684   ir_return()
685      : value(NULL)
686   {
687      /* empty */
688   }
689
690   ir_return(ir_rvalue *value)
691      : value(value)
692   {
693      /* empty */
694   }
695
696   virtual ir_return *as_return()
697   {
698      return this;
699   }
700
701   ir_rvalue *get_value() const
702   {
703      return value;
704   }
705
706   virtual void accept(ir_visitor *v)
707   {
708      v->visit(this);
709   }
710
711   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
712
713   ir_rvalue *value;
714};
715
716
717/**
718 * Jump instructions used inside loops
719 *
720 * These include \c break and \c continue.  The \c break within a loop is
721 * different from the \c break within a switch-statement.
722 *
723 * \sa ir_switch_jump
724 */
725class ir_loop_jump : public ir_jump {
726public:
727   enum jump_mode {
728      jump_break,
729      jump_continue
730   };
731
732   ir_loop_jump(ir_loop *loop, jump_mode mode)
733      : loop(loop), mode(mode)
734   {
735      /* empty */
736   }
737
738   virtual void accept(ir_visitor *v)
739   {
740      v->visit(this);
741   }
742
743   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
744
745   bool is_break() const
746   {
747      return mode == jump_break;
748   }
749
750   bool is_continue() const
751   {
752      return mode == jump_continue;
753   }
754
755private:
756   /** Loop containing this break instruction. */
757   ir_loop *loop;
758
759   /** Mode selector for the jump instruction. */
760   enum jump_mode mode;
761};
762/*@}*/
763
764
765/**
766 * Texture sampling opcodes used in ir_texture
767 */
768enum ir_texture_opcode {
769   ir_tex,		/* Regular texture look-up */
770   ir_txb,		/* Texture look-up with LOD bias */
771   ir_txl,		/* Texture look-up with explicit LOD */
772   ir_txd,		/* Texture look-up with partial derivatvies */
773   ir_txf		/* Texel fetch with explicit LOD */
774};
775
776
777/**
778 * IR instruction to sample a texture
779 *
780 * The specific form of the IR instruction depends on the \c mode value
781 * selected from \c ir_texture_opcodes.  In the printed IR, these will
782 * appear as:
783 *
784 *                              Texel offset
785 *                              |       Projection divisor
786 *                              |       |   Shadow comparitor
787 *                              |       |   |
788 *                              v       v   v
789 * (tex (sampler) (coordinate) (0 0 0) (1) ( ))
790 * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias))
791 * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod))
792 * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy))
793 * (txf (sampler) (coordinate) (0 0 0)         (lod))
794 */
795class ir_texture : public ir_rvalue {
796public:
797   ir_texture(enum ir_texture_opcode op)
798      : op(op), projector(NULL), shadow_comparitor(NULL)
799   {
800      /* empty */
801   }
802
803   virtual void accept(ir_visitor *v)
804   {
805      v->visit(this);
806   }
807
808   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
809
810   /**
811    * Return a string representing the ir_texture_opcode.
812    */
813   const char *opcode_string();
814
815   /** Set the sampler and infer the type. */
816   void set_sampler(ir_dereference *sampler);
817
818   /**
819    * Do a reverse-lookup to translate a string into an ir_texture_opcode.
820    */
821   static ir_texture_opcode get_opcode(const char *);
822
823   enum ir_texture_opcode op;
824
825   /** Sampler to use for the texture access. */
826   ir_dereference *sampler;
827
828   /** Texture coordinate to sample */
829   ir_rvalue *coordinate;
830
831   /**
832    * Value used for projective divide.
833    *
834    * If there is no projective divide (the common case), this will be
835    * \c NULL.  Optimization passes should check for this to point to a constant
836    * of 1.0 and replace that with \c NULL.
837    */
838   ir_rvalue *projector;
839
840   /**
841    * Coordinate used for comparison on shadow look-ups.
842    *
843    * If there is no shadow comparison, this will be \c NULL.  For the
844    * \c ir_txf opcode, this *must* be \c NULL.
845    */
846   ir_rvalue *shadow_comparitor;
847
848   /** Explicit texel offsets. */
849   signed char offsets[3];
850
851   union {
852      ir_rvalue *lod;		/**< Floating point LOD */
853      ir_rvalue *bias;		/**< Floating point LOD bias */
854      struct {
855	 ir_rvalue *dPdx;	/**< Partial derivative of coordinate wrt X */
856	 ir_rvalue *dPdy;	/**< Partial derivative of coordinate wrt Y */
857      } grad;
858   } lod_info;
859};
860
861
862struct ir_swizzle_mask {
863   unsigned x:2;
864   unsigned y:2;
865   unsigned z:2;
866   unsigned w:2;
867
868   /**
869    * Number of components in the swizzle.
870    */
871   unsigned num_components:3;
872
873   /**
874    * Does the swizzle contain duplicate components?
875    *
876    * L-value swizzles cannot contain duplicate components.
877    */
878   unsigned has_duplicates:1;
879};
880
881
882class ir_swizzle : public ir_rvalue {
883public:
884   ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
885              unsigned count);
886   ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
887
888   virtual ir_swizzle *as_swizzle()
889   {
890      return this;
891   }
892
893   ir_swizzle *clone()
894   {
895      return new ir_swizzle(this->val, this->mask);
896   }
897
898   /**
899    * Construct an ir_swizzle from the textual representation.  Can fail.
900    */
901   static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
902
903   virtual void accept(ir_visitor *v)
904   {
905      v->visit(this);
906   }
907
908   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
909
910   bool is_lvalue()
911   {
912      return val->is_lvalue() && !mask.has_duplicates;
913   }
914
915   /**
916    * Get the variable that is ultimately referenced by an r-value
917    */
918   virtual ir_variable *variable_referenced();
919
920   ir_rvalue *val;
921   ir_swizzle_mask mask;
922};
923
924
925class ir_dereference : public ir_rvalue {
926public:
927   virtual ir_dereference *as_dereference()
928   {
929      return this;
930   }
931
932   bool is_lvalue();
933
934   /**
935    * Get the variable that is ultimately referenced by an r-value
936    */
937   virtual ir_variable *variable_referenced() = 0;
938};
939
940
941class ir_dereference_variable : public ir_dereference {
942public:
943   ir_dereference_variable(ir_variable *var);
944
945   /**
946    * Get the variable that is ultimately referenced by an r-value
947    */
948   virtual ir_variable *variable_referenced()
949   {
950      return this->var;
951   }
952
953   virtual ir_variable *whole_variable_referenced()
954   {
955      /* ir_dereference_variable objects always dereference the entire
956       * variable.  However, if this dereference is dereferenced by anything
957       * else, the complete deferefernce chain is not a whole-variable
958       * dereference.  This method should only be called on the top most
959       * ir_rvalue in a dereference chain.
960       */
961      return this->var;
962   }
963
964   virtual void accept(ir_visitor *v)
965   {
966      v->visit(this);
967   }
968
969   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
970
971   /**
972    * Object being dereferenced.
973    */
974   ir_variable *var;
975};
976
977
978class ir_dereference_array : public ir_dereference {
979public:
980   ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
981
982   ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
983
984   virtual ir_dereference_array *as_dereference_array()
985   {
986      return this;
987   }
988
989   /**
990    * Get the variable that is ultimately referenced by an r-value
991    */
992   virtual ir_variable *variable_referenced()
993   {
994      return this->array->variable_referenced();
995   }
996
997   virtual void accept(ir_visitor *v)
998   {
999      v->visit(this);
1000   }
1001
1002   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1003
1004   ir_rvalue *array;
1005   ir_rvalue *array_index;
1006
1007private:
1008   void set_array(ir_rvalue *value);
1009};
1010
1011
1012class ir_dereference_record : public ir_dereference {
1013public:
1014   ir_dereference_record(ir_rvalue *value, const char *field);
1015
1016   ir_dereference_record(ir_variable *var, const char *field);
1017
1018   /**
1019    * Get the variable that is ultimately referenced by an r-value
1020    */
1021   virtual ir_variable *variable_referenced()
1022   {
1023      return this->record->variable_referenced();
1024   }
1025
1026   virtual void accept(ir_visitor *v)
1027   {
1028      v->visit(this);
1029   }
1030
1031   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1032
1033   ir_rvalue *record;
1034   const char *field;
1035};
1036
1037
1038/**
1039 * Data stored in an ir_constant
1040 */
1041union ir_constant_data {
1042      unsigned u[16];
1043      int i[16];
1044      float f[16];
1045      bool b[16];
1046};
1047
1048
1049class ir_constant : public ir_rvalue {
1050public:
1051   ir_constant(const struct glsl_type *type, const ir_constant_data *data);
1052   ir_constant(bool b);
1053   ir_constant(unsigned int u);
1054   ir_constant(int i);
1055   ir_constant(float f);
1056
1057   /**
1058    * Construct an ir_constant from a list of ir_constant values
1059    */
1060   ir_constant(const struct glsl_type *type, exec_list *values);
1061
1062   /**
1063    * Construct an ir_constant from a scalar component of another ir_constant
1064    *
1065    * The new \c ir_constant inherits the type of the component from the
1066    * source constant.
1067    *
1068    * \note
1069    * In the case of a matrix constant, the new constant is a scalar, \b not
1070    * a vector.
1071    */
1072   ir_constant(const ir_constant *c, unsigned i);
1073
1074   virtual ir_constant *as_constant()
1075   {
1076      return this;
1077   }
1078
1079   virtual void accept(ir_visitor *v)
1080   {
1081      v->visit(this);
1082   }
1083
1084   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1085
1086   ir_constant *clone();
1087
1088   /**
1089    * Get a particular component of a constant as a specific type
1090    *
1091    * This is useful, for example, to get a value from an integer constant
1092    * as a float or bool.  This appears frequently when constructors are
1093    * called with all constant parameters.
1094    */
1095   /*@{*/
1096   bool get_bool_component(unsigned i) const;
1097   float get_float_component(unsigned i) const;
1098   int get_int_component(unsigned i) const;
1099   unsigned get_uint_component(unsigned i) const;
1100   /*@}*/
1101
1102   ir_constant *get_record_field(const char *name);
1103
1104   /**
1105    * Determine whether a constant has the same value as another constant
1106    */
1107   bool has_value(const ir_constant *) const;
1108
1109   /**
1110    * Value of the constant.
1111    *
1112    * The field used to back the values supplied by the constant is determined
1113    * by the type associated with the \c ir_instruction.  Constants may be
1114    * scalars, vectors, or matrices.
1115    */
1116   union ir_constant_data value;
1117
1118   exec_list components;
1119
1120private:
1121   /**
1122    * Parameterless constructor only used by the clone method
1123    */
1124   ir_constant(void);
1125};
1126
1127void
1128visit_exec_list(exec_list *list, ir_visitor *visitor);
1129
1130void validate_ir_tree(exec_list *instructions);
1131
1132extern void
1133_mesa_glsl_initialize_variables(exec_list *instructions,
1134				struct _mesa_glsl_parse_state *state);
1135
1136extern void
1137_mesa_glsl_initialize_functions(exec_list *instructions,
1138				struct _mesa_glsl_parse_state *state);
1139
1140#endif /* IR_H */
1141