ast_to_hir.cpp revision 2d816204c875ace0fc363d3eeada2255a5009d5c
1a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*
2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation
3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"),
6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation
7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions:
10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next
12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the
13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software.
14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE.
22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
25a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \file ast_to_hir.c
26a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Convert abstract syntax to to high-level intermediate reprensentation (HIR).
27a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * During the conversion to HIR, the majority of the symantic checking is
29a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * preformed on the program.  This includes:
30a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *    * Symbol table management
32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *    * Type checking
33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *    * Function binding
34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The majority of this work could be done during parsing, and the parser could
36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * probably generate HIR directly.  However, this results in frequent changes
37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to the parser code.  Since we do not assume that every system this complier
38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * is built on will have Flex and Bison installed, we have to store the code
39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * generated by these tools in our version control system.  In other parts of
40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the system we've seen problems where a parser was changed but the generated
41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * code was not committed, merge conflicts where created because two developers
42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * had slightly different versions of Bison installed, etc.
43a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * I have also noticed that running Bison generated parsers in GDB is very
45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * irritating.  When you get a segfault on '$$ = $1->foo', you can't very
46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * well 'print $1' in GDB.
47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * As a result, my preference is to put as little C code as possible in the
49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * parser (and lexer) sources.
50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include <stdio.h>
52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "main/imports.h"
538bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick#include "glsl_symbol_table.h"
54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_parser_extras.h"
55a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "ast.h"
56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_types.h"
57a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "ir.h"
58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
59d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickvoid
60d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
61d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick{
62d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick   struct simple_node *ptr;
63d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick
64adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick   _mesa_glsl_initialize_variables(instructions, state);
65a4e92c4b26578614d76ce71b53194ea5c0f58d6cIan Romanick   _mesa_glsl_initialize_constructors(instructions, state);
66c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt   _mesa_glsl_initialize_functions(instructions, state);
67adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
6841ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   state->current_function = NULL;
6941ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick
70d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick   foreach (ptr, & state->translation_unit) {
71d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick      ((ast_node *)ptr)->hir(instructions, state);
72d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick   }
73d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick}
74d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick
75d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick
760104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick/**
770104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * If a conversion is available, convert one operand to a different type
780104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick *
790104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * The \c from \c ir_rvalue is converted "in place".
800104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick *
810104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param to     Type that the operand it to be converted to
820104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param from   Operand that is being converted
830104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param state  GLSL compiler state
840104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick *
850104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \return
860104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * If a conversion is possible (or unnecessary), \c true is returned.
870104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * Otherwise \c false is returned.
880104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick */
890104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanickstatic bool
90bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickapply_implicit_conversion(const glsl_type *to, ir_rvalue * &from,
910104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick			  struct _mesa_glsl_parse_state *state)
920104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick{
93bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   if (to->base_type == from->type->base_type)
940104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return true;
950104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
960104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   /* This conversion was added in GLSL 1.20.  If the compilation mode is
970104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    * GLSL 1.10, the conversion is skipped.
980104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    */
990104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   if (state->language_version < 120)
1000104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return false;
1010104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
1020104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   /* From page 27 (page 33 of the PDF) of the GLSL 1.50 spec:
1030104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *
1040104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    "There are no implicit array or structure conversions. For
1050104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    example, an array of int cannot be implicitly converted to an
1060104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    array of float. There are no implicit conversions between
1070104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    signed and unsigned integers."
1080104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    */
1090104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   /* FINISHME: The above comment is partially a lie.  There is int/uint
1100104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    * FINISHME: conversion for immediate constants.
1110104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    */
112bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   if (!to->is_float() || !from->type->is_numeric())
1130104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return false;
1140104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
115bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   switch (from->type->base_type) {
1160104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   case GLSL_TYPE_INT:
117bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      from = new ir_expression(ir_unop_i2f, to, from, NULL);
1180104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      break;
1190104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   case GLSL_TYPE_UINT:
120bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      from = new ir_expression(ir_unop_u2f, to, from, NULL);
1210104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      break;
1220104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   case GLSL_TYPE_BOOL:
1230104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      assert(!"FINISHME: Convert bool to float.");
1240104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   default:
1250104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      assert(0);
1260104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   }
1270104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
1280104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   return true;
1290104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick}
1300104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
1310104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
133bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickarithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b,
134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		       bool multiply,
135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		       struct _mesa_glsl_parse_state *state)
136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
137bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   const glsl_type *const type_a = value_a->type;
138bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   const glsl_type *const type_b = value_b->type;
1390104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 56:
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The arithmetic binary operators add (+), subtract (-),
143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    multiply (*), and divide (/) operate on integer and
144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    floating-point scalars, vectors, and matrices."
145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
14660b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   if (!type_a->is_numeric() || !type_b->is_numeric()) {
1470471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "If one operand is floating-point based and the other is
152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    not, then the conversions from Section 4.1.10 "Implicit
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    Conversions" are applied to the non-floating-point-based operand."
154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1550104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   if (!apply_implicit_conversion(type_a, value_b, state)
1560104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick       && !apply_implicit_conversion(type_b, value_a, state)) {
1570104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return glsl_type::error_type;
158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "If the operands are integer types, they must both be signed or
161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    both be unsigned."
162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * From this rule and the preceeding conversion it can be inferred that
164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * both types must be GLSL_TYPE_FLOAT, or GLSL_TYPE_UINT, or GLSL_TYPE_INT.
16560b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick    * The is_numeric check above already filtered out the case where either
16660b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick    * type is not one of these, so now the base types need only be tested for
16760b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick    * equality.
168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (type_a->base_type != type_b->base_type) {
1700471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "All arithmetic binary operators result in the same fundamental type
174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    (signed integer, unsigned integer, or floating-point) as the
175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    operands they operate on, after operand type conversion. After
176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    conversion, the following cases are valid
177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    * The two operands are scalars. In this case the operation is
179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      applied, resulting in a scalar."
180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
181cb36f8aaeeb09660843316270a781948f773d90bIan Romanick   if (type_a->is_scalar() && type_b->is_scalar())
182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      return type_a;
183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*   "* One operand is a scalar, and the other is a vector or matrix.
185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      In this case, the scalar operation is applied independently to each
186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      component of the vector or matrix, resulting in the same size
187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      vector or matrix."
188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
189cb36f8aaeeb09660843316270a781948f773d90bIan Romanick   if (type_a->is_scalar()) {
190cb36f8aaeeb09660843316270a781948f773d90bIan Romanick      if (!type_b->is_scalar())
191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 return type_b;
192cb36f8aaeeb09660843316270a781948f773d90bIan Romanick   } else if (type_b->is_scalar()) {
193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      return type_a;
194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
195a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* All of the combinations of <scalar, scalar>, <vector, scalar>,
197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * <scalar, vector>, <scalar, matrix>, and <matrix, scalar> have been
198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * handled.
199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
20060b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   assert(!type_a->is_scalar());
20160b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   assert(!type_b->is_scalar());
202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*   "* The two operands are vectors of the same size. In this case, the
204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operation is done component-wise resulting in the same size
205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      vector."
206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
207a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick   if (type_a->is_vector() && type_b->is_vector()) {
2080471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return (type_a == type_b) ? type_a : glsl_type::error_type;
209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* All of the combinations of <scalar, scalar>, <vector, scalar>,
212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * <scalar, vector>, <scalar, matrix>, <matrix, scalar>, and
213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * <vector, vector> have been handled.  At least one of the operands must
214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * be matrix.  Further, since there are no integer matrix types, the base
215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * type of both operands must be float.
216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
21760b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   assert(type_a->is_matrix() || type_b->is_matrix());
218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   assert(type_a->base_type == GLSL_TYPE_FLOAT);
219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   assert(type_b->base_type == GLSL_TYPE_FLOAT);
220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*   "* The operator is add (+), subtract (-), or divide (/), and the
222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operands are matrices with the same number of rows and the same
223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      number of columns. In this case, the operation is done component-
224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      wise resulting in the same size matrix."
225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    * The operator is multiply (*), where both operands are matrices or
226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      one operand is a vector and the other a matrix. A right vector
227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operand is treated as a column vector and a left vector operand as a
228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      row vector. In all these cases, it is required that the number of
229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      columns of the left operand is equal to the number of rows of the
230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      right operand. Then, the multiply (*) operation does a linear
231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      algebraic multiply, yielding an object that has the same number of
232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      rows as the left operand and the same number of columns as the right
233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operand. Section 5.10 "Vector and Matrix Operations" explains in
234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      more detail how vectors and matrices are operated on."
235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (! multiply) {
2370471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return (type_a == type_b) ? type_a : glsl_type::error_type;
238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else {
239fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick      if (type_a->is_matrix() && type_b->is_matrix()) {
240c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 /* Matrix multiply.  The columns of A must match the rows of B.  Given
241c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * the other previously tested constraints, this means the vector type
242c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * of a row from A must be the same as the vector type of a column from
243c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * B.
244c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  */
245c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 if (type_a->row_type() == type_b->column_type()) {
246c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	    /* The resulting matrix has the number of columns of matrix B and
247c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     * the number of rows of matrix A.  We get the row count of A by
248c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     * looking at the size of a vector that makes up a column.  The
249c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     * transpose (size of a row) is done for B.
250c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     */
251c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	    return
252c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	       glsl_type::get_instance(type_a->base_type,
253c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick				       type_a->column_type()->vector_elements,
254c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick				       type_b->row_type()->vector_elements);
255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 }
256fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick      } else if (type_a->is_matrix()) {
257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 /* A is a matrix and B is a column vector.  Columns of A must match
258c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * rows of B.  Given the other previously tested constraints, this
259c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * means the vector type of a row from A must be the same as the
260c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * vector the type of B.
261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  */
262c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 if (type_a->row_type() == type_b)
263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    return type_b;
264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
265fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick	 assert(type_b->is_matrix());
266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
267c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 /* A is a row vector and B is a matrix.  Columns of A must match rows
268c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * of B.  Given the other previously tested constraints, this means
269c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * the type of A must be the same as the vector type of a column from
270c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * B.
271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  */
272c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 if (type_a == type_b->column_type())
273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    return type_a;
274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "All other cases are illegal."
279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
2800471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   return glsl_type::error_type;
281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickunary_arithmetic_result_type(const struct glsl_type *type)
286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 57:
288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The arithmetic unary operators negate (-), post- and pre-increment
290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     and decrement (-- and ++) operate on integer or floating-point
291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     values (including vectors and matrices). All unary operators work
292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     component-wise on their operands. These result with the same type
293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     they operated on."
294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
295a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick   if (!type->is_numeric())
2960471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return type;
299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickmodulus_result_type(const struct glsl_type *type_a,
304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		    const struct glsl_type *type_b)
305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 56:
307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The operator modulus (%) operates on signed or unsigned integers or
308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    integer vectors. The operand types must both be signed or both be
309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    unsigned."
310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
31140176e249f72b6090204611873b19aed3da67c71Ian Romanick   if (!type_a->is_integer() || !type_b->is_integer()
312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       || (type_a->base_type != type_b->base_type)) {
3130471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "The operands cannot be vectors of differing size. If one operand is
317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    a scalar and the other vector, then the scalar is applied component-
318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    wise to the vector, resulting in the same type as the vector. If both
319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    are vectors of the same size, the result is computed component-wise."
320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
321a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick   if (type_a->is_vector()) {
322a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick      if (!type_b->is_vector()
323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  || (type_a->vector_elements == type_b->vector_elements))
324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 return type_a;
325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else
326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      return type_b;
327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "The operator modulus (%) is not defined for any other data types
329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    (non-integer types)."
330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
3310471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   return glsl_type::error_type;
332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
336bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickrelational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b,
337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		       struct _mesa_glsl_parse_state *state)
338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
339bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   const glsl_type *const type_a = value_a->type;
340bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   const glsl_type *const type_b = value_b->type;
3410150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick
342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 56:
343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The relational operators greater than (>), less than (<), greater
344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    than or equal (>=), and less than or equal (<=) operate only on
345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    scalar integer and scalar floating-point expressions."
346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
347a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick   if (!type_a->is_numeric()
348a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick       || !type_b->is_numeric()
349cb36f8aaeeb09660843316270a781948f773d90bIan Romanick       || !type_a->is_scalar()
350cb36f8aaeeb09660843316270a781948f773d90bIan Romanick       || !type_b->is_scalar())
3510471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "Either the operands' types must match, or the conversions from
354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    Section 4.1.10 "Implicit Conversions" will be applied to the integer
355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    operand, after which the types must match."
356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
3570150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick   if (!apply_implicit_conversion(type_a, value_b, state)
3580150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick       && !apply_implicit_conversion(type_b, value_a, state)) {
3590150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick      return glsl_type::error_type;
360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (type_a->base_type != type_b->base_type)
3630471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
365a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "The result is scalar Boolean."
366a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
3670471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   return glsl_type::bool_type;
368a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
369a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
370a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
3710bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick/**
3720bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Validates that a value can be assigned to a location with a specified type
3730bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick *
3740bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Validates that \c rhs can be assigned to some location.  If the types are
3750bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * not an exact match but an automatic conversion is possible, \c rhs will be
3760bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * converted.
3770bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick *
3780bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \return
3790bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \c NULL if \c rhs cannot be assigned to a location with type \c lhs_type.
3800bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Otherwise the actual RHS to be assigned will be returned.  This may be
3810bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \c rhs, or it may be \c rhs after some type conversion.
3820bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick *
3830bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \note
3840bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * In addition to being used for assignments, this function is used to
3850bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * type-check return values.
3860bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick */
387fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
388fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkevalidate_assignment(const glsl_type *lhs_type, ir_rvalue *rhs)
3890bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick{
3900bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   const glsl_type *const rhs_type = rhs->type;
3910bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
3920bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   /* If there is already some error in the RHS, just return it.  Anything
3930bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick    * else will lead to an avalanche of error message back to the user.
3940bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick    */
3950bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   if (rhs_type->is_error())
3960bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick      return rhs;
3970bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
3980bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   /* FINISHME: For GLSL 1.10, check that the types are not arrays. */
3990bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
4000bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   /* If the types are identical, the assignment can trivially proceed.
4010bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick    */
4020bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   if (rhs_type == lhs_type)
4030bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick      return rhs;
4040bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
4050bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   /* FINISHME: Check for and apply automatic conversions. */
4060bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   return NULL;
4070bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick}
4080bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
40910a685218610e737e23d2d8a243ed6ff6613becdEric Anholtir_rvalue *
41010a685218610e737e23d2d8a243ed6ff6613becdEric Anholtdo_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
41110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	      ir_rvalue *lhs, ir_rvalue *rhs,
41210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	      YYLTYPE lhs_loc)
41310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt{
41410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   bool error_emitted = (lhs->type->is_error() || rhs->type->is_error());
41510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
41610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   if (!error_emitted) {
41710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      /* FINISHME: This does not handle 'foo.bar.a.b.c[5].d = 5' */
41810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      if (!lhs->is_lvalue()) {
41910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	 _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment");
42010a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	 error_emitted = true;
42110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      }
42210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   }
42310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
42410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   ir_rvalue *new_rhs = validate_assignment(lhs->type, rhs);
42510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   if (new_rhs == NULL) {
42610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      _mesa_glsl_error(& lhs_loc, state, "type mismatch");
42710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   } else {
42810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      rhs = new_rhs;
42910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   }
43010a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
43110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   ir_instruction *tmp = new ir_assignment(lhs, rhs, NULL);
43210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   instructions->push_tail(tmp);
43310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
43410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   return rhs;
43510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt}
4360bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
4375185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
4385185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick/**
4395185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick * Generate a new temporary and add its declaration to the instruction stream
4405185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick */
4415185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanickstatic ir_variable *
4425185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanickgenerate_temporary(const glsl_type *type, exec_list *instructions,
4435185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick		   struct _mesa_glsl_parse_state *state)
4445185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick{
4455185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   char *name = (char *) malloc(sizeof(char) * 13);
4465185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
4475185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   snprintf(name, 13, "tmp_%08X", state->temp_index);
4485185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   state->temp_index++;
4495185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
4505185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   ir_variable *const var = new ir_variable(type, name);
4515185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   instructions->push_tail(var);
4525185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
4535185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   return var;
4545185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick}
4555185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
4565185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
457de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholtstatic ir_rvalue *
458de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholtget_lvalue_copy(exec_list *instructions, struct _mesa_glsl_parse_state *state,
459de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt		ir_rvalue *lvalue, YYLTYPE loc)
460de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt{
461de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   ir_variable *var;
462de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   ir_rvalue *var_deref;
463de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
464de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   /* FINISHME: Give unique names to the temporaries. */
465de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   var = new ir_variable(lvalue->type, "_internal_tmp");
466de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   var->mode = ir_var_auto;
467de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
468de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   var_deref = new ir_dereference(var);
469de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   do_assignment(instructions, state, var_deref, lvalue, loc);
470de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
471de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   /* Once we've created this temporary, mark it read only so it's no
472de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt    * longer considered an lvalue.
473de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt    */
474de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   var->read_only = true;
475de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
476de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   return var_deref;
477de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt}
478de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
479de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
480fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
4810044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_node::hir(exec_list *instructions,
48218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick	      struct _mesa_glsl_parse_state *state)
48318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick{
48418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   (void) instructions;
48518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   (void) state;
48618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
48718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   return NULL;
48818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick}
48918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
49018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
491fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
4920044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_expression::hir(exec_list *instructions,
49318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick		    struct _mesa_glsl_parse_state *state)
494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   static const int operations[AST_NUM_OPERATORS] = {
496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_assign doesn't convert to ir_expression. */
497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_plus doesn't convert to ir_expression. */
498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_unop_neg,
499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_add,
500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_sub,
501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mul,
502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_div,
503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mod,
504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_lshift,
505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_rshift,
506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_less,
507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_greater,
508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_lequal,
509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_gequal,
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_equal,
511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_nequal,
512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_and,
513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_xor,
514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_or,
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_unop_bit_not,
516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_logic_and,
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_logic_xor,
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_logic_or,
519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_unop_logic_not,
520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* Note: The following block of expression types actually convert
522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * to multiple IR instructions.
523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mul,     /* ast_mul_assign */
525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_div,     /* ast_div_assign */
526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mod,     /* ast_mod_assign */
527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_add,     /* ast_add_assign */
528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_sub,     /* ast_sub_assign */
529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_lshift,  /* ast_ls_assign */
530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_rshift,  /* ast_rs_assign */
531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_and, /* ast_and_assign */
532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_xor, /* ast_xor_assign */
533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_or,  /* ast_or_assign */
534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_conditional doesn't convert to ir_expression. */
536de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_add,     /* ast_pre_inc. */
537de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_sub,     /* ast_pre_dec. */
538de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_add,     /* ast_post_inc. */
539de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_sub,     /* ast_post_dec. */
540a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_field_selection doesn't conv to ir_expression. */
541a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_array_index doesn't convert to ir_expression. */
542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_function_call doesn't conv to ir_expression. */
543a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_identifier doesn't convert to ir_expression. */
544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_int_constant doesn't convert to ir_expression. */
545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_uint_constant doesn't conv to ir_expression. */
546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_float_constant doesn't conv to ir_expression. */
547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_bool_constant doesn't conv to ir_expression. */
548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_sequence doesn't convert to ir_expression. */
549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   };
550fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *result = NULL;
551fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *op[2];
552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node op_list;
5530471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   const struct glsl_type *type = glsl_type::error_type;
554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   bool error_emitted = false;
555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   YYLTYPE loc;
556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
55718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   loc = this->get_location();
558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   make_empty_list(& op_list);
559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
56018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   switch (this->oper) {
5616652af36fe8994b1621d882fcc230d320908a2a3Ian Romanick   case ast_assign: {
56218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
56318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
56510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      result = do_assignment(instructions, state, op[0], op[1],
56610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt			     this->subexpressions[0]->get_location());
56710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      error_emitted = result->type->is_error();
56810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      type = result->type;
569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
5706652af36fe8994b1621d882fcc230d320908a2a3Ian Romanick   }
571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_plus:
57318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
575a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick      error_emitted = op[0]->type->is_error();
576a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick      if (type->is_error())
577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 op[0]->type = type;
578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      result = op[0];
580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
581a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_neg:
58318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      type = unary_arithmetic_result_type(op[0]->type);
586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
587a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick      error_emitted = op[0]->type->is_error();
588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
58918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_expression(operations[this->oper], type,
590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 op[0], NULL);
591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_add:
594a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_sub:
595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_mul:
596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_div:
59718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
59818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
600bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      type = arithmetic_result_type(op[0], op[1],
60118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick				    (this->oper == ast_mul),
602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				    state);
603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
60418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_expression(operations[this->oper], type,
605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 op[0], op[1]);
606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_mod:
60918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
61018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
611a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
612a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick      error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      type = modulus_result_type(op[0]->type, op[1]->type);
615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
61618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      assert(operations[this->oper] == ir_binop_mod);
617a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
61818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_expression(operations[this->oper], type,
619a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 op[0], op[1]);
620a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
621a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_lshift:
623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_rshift:
624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* FINISHME: Implement bit-shift operators. */
625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
627a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_less:
628a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_greater:
629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_lequal:
630a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_gequal:
63118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
63218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
634a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick      error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
635a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
636bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      type = relational_result_type(op[0], op[1], state);
637a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
638a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* The relational operators must either generate an error or result
639a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * in a scalar boolean.  See page 57 of the GLSL 1.50 spec.
640a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
641a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick      assert(type->is_error()
642a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	     || ((type->base_type == GLSL_TYPE_BOOL)
643cb36f8aaeeb09660843316270a781948f773d90bIan Romanick		 && type->is_scalar()));
644a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
64518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_expression(operations[this->oper], type,
646a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 op[0], op[1]);
647a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
648a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
649a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_nequal:
650a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_equal:
6516e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
6526e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
6536e659caaa946339a2de3890a8bed091ccb65102aIan Romanick
6546e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      /* From page 58 (page 64 of the PDF) of the GLSL 1.50 spec:
6556e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *
6566e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    "The equality operators equal (==), and not equal (!=)
6576e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    operate on all types. They result in a scalar Boolean. If
6586e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    the operand types do not match, then there must be a
6596e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    conversion from Section 4.1.10 "Implicit Conversions"
6606e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    applied to one operand that can make them match, in which
6616e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    case this conversion is done."
6626e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       */
663bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      if ((!apply_implicit_conversion(op[0]->type, op[1], state)
664bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick	   && !apply_implicit_conversion(op[1]->type, op[0], state))
665212b0327b47033442842a7be3d7fb10e08e2bf66Ian Romanick	  || (op[0]->type != op[1]->type)) {
6666e659caaa946339a2de3890a8bed091ccb65102aIan Romanick	 _mesa_glsl_error(& loc, state, "operands of `%s' must have the same "
6676e659caaa946339a2de3890a8bed091ccb65102aIan Romanick			  "type", (this->oper == ast_equal) ? "==" : "!=");
6686e659caaa946339a2de3890a8bed091ccb65102aIan Romanick	 error_emitted = true;
6696e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      }
6706e659caaa946339a2de3890a8bed091ccb65102aIan Romanick
6716e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      result = new ir_expression(operations[this->oper], glsl_type::bool_type,
6726e659caaa946339a2de3890a8bed091ccb65102aIan Romanick				 op[0], op[1]);
6736e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      type = glsl_type::bool_type;
6746e659caaa946339a2de3890a8bed091ccb65102aIan Romanick
6756e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      assert(result->type == glsl_type::bool_type);
676a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
677a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
678a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_and:
679a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_xor:
680a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_or:
681a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_not:
682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* FINISHME: Implement bit-wise operators. */
683a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
685a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_logic_and:
686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_logic_xor:
687a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_logic_or:
688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_logic_not:
689a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* FINISHME: Implement logical operators. */
690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
691a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_mul_assign:
693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_div_assign:
694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_add_assign:
695a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_sub_assign: {
69618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
69718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
698a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
699bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      type = arithmetic_result_type(op[0], op[1],
70018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick				    (this->oper == ast_mul_assign),
701a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				    state);
702a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
703fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      ir_rvalue *temp_rhs = new ir_expression(operations[this->oper], type,
704fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke				              op[0], op[1]);
705a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
70610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      result = do_assignment(instructions, state, op[0], temp_rhs,
70710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt			     this->subexpressions[0]->get_location());
70810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      type = result->type;
70910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      error_emitted = (op[0]->type->is_error());
710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
711a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* GLSL 1.10 does not allow array assignment.  However, we don't have to
712a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * explicitly test for this because none of the binary expression
713a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * operators allow array operands either.
714a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
715a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
716a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
717a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
718a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
71948a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt   case ast_mod_assign: {
72048a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
72148a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      op[1] = this->subexpressions[1]->hir(instructions, state);
72248a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
72348a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
72448a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
72548a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      type = modulus_result_type(op[0]->type, op[1]->type);
72648a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
72748a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      assert(operations[this->oper] == ir_binop_mod);
72848a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
72948a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      struct ir_rvalue *temp_rhs;
73048a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      temp_rhs = new ir_expression(operations[this->oper], type,
73148a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt				   op[0], op[1]);
73248a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
73348a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      result = do_assignment(instructions, state, op[0], temp_rhs,
73448a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt			     this->subexpressions[0]->get_location());
73548a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      type = result->type;
73648a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      error_emitted = op[0]->type->is_error();
73748a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      break;
73848a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt   }
739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
740a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_ls_assign:
741a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_rs_assign:
742251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick      break;
743a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
744a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_and_assign:
745a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_xor_assign:
746a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_or_assign:
747251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick      break;
748a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
74996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick   case ast_conditional: {
75096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
75196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
75296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec:
75396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *
75496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *    "The ternary selection operator (?:). It operates on three
75596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *    expressions (exp1 ? exp2 : exp3). This operator evaluates the
75696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *    first expression, which must result in a scalar Boolean."
75796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       */
75896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) {
75996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 YYLTYPE loc = this->subexpressions[0]->get_location();
76096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
76196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 _mesa_glsl_error(& loc, state, "?: condition must be scalar boolean");
76296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 error_emitted = true;
76396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      }
76496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
76596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      /* The :? operator is implemented by generating an anonymous temporary
76696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       * followed by an if-statement.  The last instruction in each branch of
76796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       * the if-statement assigns a value to the anonymous temporary.  This
76896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       * temporary is the r-value of the expression.
76996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       */
77096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      ir_variable *const tmp = generate_temporary(glsl_type::error_type,
77196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick						  instructions, state);
77296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
77396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      ir_if *const stmt = new ir_if(op[0]);
77496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      instructions->push_tail(stmt);
77596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
77696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      op[1] = this->subexpressions[1]->hir(& stmt->then_instructions, state);
77796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      ir_dereference *const then_deref = new ir_dereference(tmp);
77896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      ir_assignment *const then_assign =
77996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 new ir_assignment(then_deref, op[1], NULL);
78096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      stmt->then_instructions.push_tail(then_assign);
78196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
78296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      op[2] = this->subexpressions[2]->hir(& stmt->else_instructions, state);
78396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      ir_dereference *const else_deref = new ir_dereference(tmp);
78496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      ir_assignment *const else_assign =
78596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 new ir_assignment(else_deref, op[2], NULL);
78696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      stmt->else_instructions.push_tail(else_assign);
78796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
78896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec:
78996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *
79096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     "The second and third expressions can be any type, as
79196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     long their types match, or there is a conversion in
79296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     Section 4.1.10 "Implicit Conversions" that can be applied
79396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     to one of the expressions to make their types match. This
79496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     resulting matching type is the type of the entire
79596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     expression."
79696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       */
797bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      if ((!apply_implicit_conversion(op[1]->type, op[2], state)
798bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick	   && !apply_implicit_conversion(op[2]->type, op[1], state))
799db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick	  || (op[1]->type != op[2]->type)) {
80096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 YYLTYPE loc = this->subexpressions[1]->get_location();
80196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
80296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 _mesa_glsl_error(& loc, state, "Second and third operands of ?: "
80396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick			  "operator must have matching types.");
80496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 error_emitted = true;
805db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick      } else {
806db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick	 tmp->type = op[1]->type;
80796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      }
80896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
80996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      result = new ir_dereference(tmp);
81096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      type = tmp->type;
811251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick      break;
81296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick   }
813a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
814a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_pre_inc:
81576ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt   case ast_pre_dec: {
81676ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
81776ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      if (op[0]->type->base_type == GLSL_TYPE_FLOAT)
81876ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt	 op[1] = new ir_constant(1.0f);
81976ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      else
82076ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt	 op[1] = new ir_constant(1);
82176ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt
822bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      type = arithmetic_result_type(op[0], op[1], false, state);
82376ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt
82476ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      struct ir_rvalue *temp_rhs;
82576ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      temp_rhs = new ir_expression(operations[this->oper], type,
82676ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt				   op[0], op[1]);
82776ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt
82876ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      result = do_assignment(instructions, state, op[0], temp_rhs,
82976ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt			     this->subexpressions[0]->get_location());
83076ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      type = result->type;
83176ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      error_emitted = op[0]->type->is_error();
83276ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      break;
83376ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt   }
834a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
835a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_post_inc:
836de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   case ast_post_dec: {
837de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
838de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      if (op[0]->type->base_type == GLSL_TYPE_FLOAT)
839de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt	 op[1] = new ir_constant(1.0f);
840de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      else
841de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt	 op[1] = new ir_constant(1);
842de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
843de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
844de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
845bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      type = arithmetic_result_type(op[0], op[1], false, state);
846de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
847de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      struct ir_rvalue *temp_rhs;
848de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      temp_rhs = new ir_expression(operations[this->oper], type,
849de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt				   op[0], op[1]);
850de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
851de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      /* Get a temporary of a copy of the lvalue before it's modified.
852de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt       * This may get thrown away later.
853de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt       */
854de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      result = get_lvalue_copy(instructions, state, op[0],
855de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt			       this->subexpressions[0]->get_location());
856de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
857de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      (void)do_assignment(instructions, state, op[0], temp_rhs,
858de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt			  this->subexpressions[0]->get_location());
859de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
860de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      type = result->type;
861de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      error_emitted = op[0]->type->is_error();
862a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
863de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   }
864a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
865a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_field_selection:
86618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = _mesa_ast_field_selection_to_hir(this, instructions, state);
867a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      type = result->type;
868a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
869a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
870a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_array_index:
871a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
872a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
873a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_function_call:
8747cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick      /* Should *NEVER* get here.  ast_function_call should always be handled
8757cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick       * by ast_function_expression::hir.
876a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
8777cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick      assert(0);
878a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
879a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
880a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_identifier: {
881a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* ast_identifier can appear several places in a full abstract syntax
882a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * tree.  This particular use must be at location specified in the grammar
883a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * as 'variable_identifier'.
884a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
8858bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      ir_variable *var =
8868bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick	 state->symbols->get_variable(this->primary_expression.identifier);
887a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
888a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      result = new ir_dereference(var);
889a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
890a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (var != NULL) {
891a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 type = result->type;
892a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
89371d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick	 _mesa_glsl_error(& loc, state, "`%s' undeclared",
89418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			  this->primary_expression.identifier);
895a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
896a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 error_emitted = true;
897a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
898a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
899a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
900a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
901a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_int_constant:
9020471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::int_type;
90318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_constant(type, & this->primary_expression);
904a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
905a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
906a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_uint_constant:
9070471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::uint_type;
90818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_constant(type, & this->primary_expression);
909a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
910a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
911a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_float_constant:
9120471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::float_type;
91318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_constant(type, & this->primary_expression);
914a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
915a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
916a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bool_constant:
9170471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::bool_type;
91818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_constant(type, & this->primary_expression);
919a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
920a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
921a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_sequence: {
922a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      struct simple_node *ptr;
923a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
924a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* It should not be possible to generate a sequence in the AST without
925a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * any expressions in it.
926a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
92718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      assert(!is_empty_list(&this->expressions));
928a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
929a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* The r-value of a sequence is the last expression in the sequence.  If
930a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * the other expressions in the sequence do not have side-effects (and
931a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * therefore add instructions to the instruction list), they get dropped
932a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * on the floor.
933a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
93418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      foreach (ptr, &this->expressions)
93518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick	 result = ((ast_node *)ptr)->hir(instructions, state);
936a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
937a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      type = result->type;
938a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
939a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* Any errors should have already been emitted in the loop above.
940a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
941a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      error_emitted = true;
942a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
943a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
944a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
945a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
946cef3baecf636a30b62cd7a1e8de57c7650f7003eIan Romanick   if (type->is_error() && !error_emitted)
94771d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick      _mesa_glsl_error(& loc, state, "type mismatch");
948a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
949a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return result;
950a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
951a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
952a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
953fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
9540044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_expression_statement::hir(exec_list *instructions,
95518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			      struct _mesa_glsl_parse_state *state)
956a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
957a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* It is possible to have expression statements that don't have an
958a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * expression.  This is the solitary semicolon:
959a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
960a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * for (i = 0; i < 5; i++)
961a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     ;
962a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
963a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * In this case the expression will be NULL.  Test for NULL and don't do
964a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * anything in that case.
965a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
96618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   if (expression != NULL)
96718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      expression->hir(instructions, state);
968a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
969a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Statements do not have r-values.
970a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
971a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
972a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
973a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
974a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
975fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
9760044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_compound_statement::hir(exec_list *instructions,
97718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			    struct _mesa_glsl_parse_state *state)
978a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
979a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node *ptr;
980a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
981a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
98218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   if (new_scope)
9838bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      state->symbols->push_scope();
984a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
98518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   foreach (ptr, &statements)
98618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      ((ast_node *)ptr)->hir(instructions, state);
987a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
98818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   if (new_scope)
9898bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      state->symbols->pop_scope();
990a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
991a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Compound statements do not have r-values.
992a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
993a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
994a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
995a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
996a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
997a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
998a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanicktype_specifier_to_glsl_type(const struct ast_type_specifier *spec,
999a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			    const char **name,
1000a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			    struct _mesa_glsl_parse_state *state)
1001a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1002a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct glsl_type *type;
1003a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1004a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (spec->type_specifier == ast_struct) {
1005a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* FINISHME: Handle annonymous structures. */
1006a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      type = NULL;
1007a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else {
10088bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      type = state->symbols->get_type(spec->type_name);
10097f9d30974317a4050fb8990ce1a3eebbb190483aIan Romanick      *name = spec->type_name;
1010a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1011a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* FINISHME: Handle array declarations.  Note that this requires complete
1012f3f111eac45162e9634208cd7305981d8393328dIan Romanick       * FINISHME: handling of constant expressions.
1013a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
1014a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1015a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1016a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return type;
1017a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1018a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1019a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1020a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void
1021a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickapply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
1022a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 struct ir_variable *var,
10232e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt				 struct _mesa_glsl_parse_state *state,
10242e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt				 YYLTYPE *loc)
1025a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1026a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (qual->invariant)
1027a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->invariant = 1;
1028a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1029a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* FINISHME: Mark 'in' variables at global scope as read-only. */
1030a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (qual->constant || qual->attribute || qual->uniform
1031a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       || (qual->varying && (state->target == fragment_shader)))
1032a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->read_only = 1;
1033a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1034a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (qual->centroid)
1035a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->centroid = 1;
1036a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
10372e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt   if (qual->attribute && state->target == fragment_shader) {
10382e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt      var->type = glsl_type::error_type;
10392e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt      _mesa_glsl_error(loc, state,
10402e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt		       "`attribute' variables may not be declared in the "
10412e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt		       "fragment shader");
10422e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt   }
10432e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt
1044a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (qual->in && qual->out)
1045a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_inout;
1046a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else if (qual->attribute || qual->in
1047a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    || (qual->varying && (state->target == fragment_shader)))
1048a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_in;
10490b678234625fac67a89285ad2871dedc891fb1b1Ian Romanick   else if (qual->out || (qual->varying && (state->target == vertex_shader)))
1050a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_out;
1051a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else if (qual->uniform)
1052a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_uniform;
1053a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else
1054a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_auto;
1055a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1056a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (qual->flat)
1057a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->interpolation = ir_var_flat;
1058a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else if (qual->noperspective)
1059a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->interpolation = ir_var_noperspective;
1060a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else
1061a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->interpolation = ir_var_smooth;
1062a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1063a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1064a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1065fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
10660044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_declarator_list::hir(exec_list *instructions,
106718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			 struct _mesa_glsl_parse_state *state)
1068a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1069a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node *ptr;
1070a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *decl_type;
1071a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *type_name = NULL;
1072a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1073a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1074a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* FINISHME: Handle vertex shader "invariant" declarations that do not
1075a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * FINISHME: include a type.  These re-declare built-in variables to be
1076a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * FINISHME: invariant.
1077a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1078a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
107918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   decl_type = type_specifier_to_glsl_type(this->type->specifier,
1080a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick					   & type_name, state);
1081a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
108218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   foreach (ptr, &this->declarations) {
1083a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      struct ast_declaration *const decl = (struct ast_declaration * )ptr;
1084a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      const struct glsl_type *var_type;
1085a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      struct ir_variable *var;
10862e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt      YYLTYPE loc = this->get_location();
1087a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1088a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* FINISHME: Emit a warning if a variable declaration shadows a
1089a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * FINISHME: declaration at a higher scope.
1090a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
1091a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1092cec65a6b76290ee4da91691bd3ef01c3fb8a0c37Ian Romanick      if ((decl_type == NULL) || decl_type->is_void()) {
1093a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 if (type_name != NULL) {
1094a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    _mesa_glsl_error(& loc, state,
1095a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     "invalid type `%s' in declaration of `%s'",
1096a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     type_name, decl->identifier);
1097a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 } else {
1098a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    _mesa_glsl_error(& loc, state,
1099a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     "invalid type in declaration of `%s'",
1100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     decl->identifier);
1101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 }
1102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 continue;
1103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (decl->is_array) {
1106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 /* FINISHME: Handle array declarations.  Note that this requires
1107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  * FINISHME: complete handling of constant expressions.
1108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  */
11098518e75d289638b10cb9350f287ccbdf1c927040Eric Anholt	 var_type = glsl_type::error_type;
1110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 /* FINISHME: Reject delcarations of multidimensional arrays. */
1112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
1113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 var_type = decl_type;
1114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var = new ir_variable(var_type, decl->identifier);
1117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1118f3f111eac45162e9634208cd7305981d8393328dIan Romanick      /* FINISHME: Variables that are attribute, uniform, varying, in, or
1119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * FINISHME: out varibles must be declared either at global scope or
1120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * FINISHME: in a parameter list (in and out only).
1121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
1122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
11232e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt      apply_type_qualifier_to_variable(& this->type->qualifier, var, state,
11242e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt				       & loc);
1125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* Attempt to add the variable to the symbol table.  If this fails, it
1127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * means the variable has already been declared at this scope.
1128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
11293359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      if (state->symbols->name_declared_this_scope(decl->identifier)) {
113018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick	 YYLTYPE loc = this->get_location();
1131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 _mesa_glsl_error(& loc, state, "`%s' redeclared",
1133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			  decl->identifier);
1134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 continue;
1135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
11370044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick      instructions->push_tail(var);
1138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1139fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick      if (this->type->qualifier.attribute
1140fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	  && (state->current_function != NULL)) {
1141fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	 _mesa_glsl_error(& loc, state,
1142fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick			  "attribute variable `%s' must be declared at global "
1143fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick			  "scope",
1144fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick			  var->name);
1145fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick      }
1146fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
1147fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick      if ((var->mode == ir_var_in) && (state->current_function == NULL)) {
1148fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	 if (state->target == vertex_shader) {
1149fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    bool error_emitted = false;
1150fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
1151fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec:
1152fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *
1153fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    "Vertex shader inputs can only be float, floating-point
1154fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    vectors, matrices, signed and unsigned integers and integer
1155fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    vectors. Vertex shader inputs can also form arrays of these
1156fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    types, but not structures."
1157fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *
11582d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     * From page 31 (page 27 of the PDF) of the GLSL 1.30 spec:
11592d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *
11602d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *    "Vertex shader inputs can only be float, floating-point
11612d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *    vectors, matrices, signed and unsigned integers and integer
11622d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *    vectors. They cannot be arrays or structures."
11632d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *
1164fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec:
1165fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *
1166fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    "The attribute qualifier can be used only with float,
1167fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    floating-point vectors, and matrices. Attribute variables
1168fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    cannot be declared as arrays or structures."
1169fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     */
1170fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    const glsl_type *check_type = var->type->is_array()
1171fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       ? var->type->fields.array : var->type;
1172fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
1173fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    switch (check_type->base_type) {
1174fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    case GLSL_TYPE_FLOAT:
1175fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       break;
1176fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    case GLSL_TYPE_UINT:
1177fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    case GLSL_TYPE_INT:
1178fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       if (state->language_version > 120)
1179fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick		  break;
1180fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       /* FALLTHROUGH */
1181fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    default:
1182fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       _mesa_glsl_error(& loc, state,
1183fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"vertex shader input / attribute cannot have "
1184fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"type %s`%s'",
1185fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				var->type->is_array() ? "array of " : "",
1186fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				check_type->name);
1187fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       error_emitted = true;
1188fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    }
1189fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
11902d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	    if (!error_emitted && (state->language_version <= 130)
1191fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick		&& var->type->is_array()) {
1192fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       _mesa_glsl_error(& loc, state,
1193fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"vertex shader input / attribute cannot have "
1194fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"array type");
1195fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       error_emitted = true;
1196fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    }
1197fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	 }
1198fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick      }
1199fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
120066faec4895b7bb59a614087a200c05157191b4aeIan Romanick      if (decl->initializer != NULL) {
120143de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 YYLTYPE initializer_loc = decl->initializer->get_location();
120243de17282017bdf187d6e646de3262cc64b7f46bIan Romanick
120366faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 /* From page 24 (page 30 of the PDF) of the GLSL 1.10 spec:
120466faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *
120566faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *    "All uniform variables are read-only and are initialized either
120666faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *    directly by an application via API commands, or indirectly by
120766faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *    OpenGL."
120866faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  */
120966faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 if ((state->language_version <= 110)
121066faec4895b7bb59a614087a200c05157191b4aeIan Romanick	     && (var->mode == ir_var_uniform)) {
121143de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	    _mesa_glsl_error(& initializer_loc, state,
121243de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     "cannot initialize uniforms in GLSL 1.10");
121343de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 }
121443de17282017bdf187d6e646de3262cc64b7f46bIan Romanick
121543de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 if (var->type->is_sampler()) {
121643de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	    _mesa_glsl_error(& initializer_loc, state,
121743de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     "cannot initialize samplers");
121843de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 }
121919360152f5bd8cff93359dbfe5a50a90b699c118Ian Romanick
122043de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 if ((var->mode == ir_var_in) && (state->current_function == NULL)) {
122143de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	    _mesa_glsl_error(& initializer_loc, state,
122243de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     "cannot initialize %s shader input / %s",
122343de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     (state->target == vertex_shader)
122443de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     ? "vertex" : "fragment",
122543de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     (state->target == vertex_shader)
122643de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     ? "attribute" : "varying");
122766faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 }
122866faec4895b7bb59a614087a200c05157191b4aeIan Romanick
122966faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 ir_dereference *const lhs = new ir_dereference(var);
123066faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 ir_rvalue *const rhs = decl->initializer->hir(instructions, state);
123119360152f5bd8cff93359dbfe5a50a90b699c118Ian Romanick
123266faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 /* FINISHME: If the declaration is either 'const' or 'uniform', the
123366faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  * FINISHME: initializer (rhs) must be a constant expression.
123466faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  */
123566faec4895b7bb59a614087a200c05157191b4aeIan Romanick
123666faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 if (!rhs->type->is_error()) {
123766faec4895b7bb59a614087a200c05157191b4aeIan Romanick	    (void) do_assignment(instructions, state, lhs, rhs,
123866faec4895b7bb59a614087a200c05157191b4aeIan Romanick				 this->get_location());
123966faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 }
124066faec4895b7bb59a614087a200c05157191b4aeIan Romanick      }
124117d86f4371da413176ba365ca26a58bac172d365Ian Romanick
124217d86f4371da413176ba365ca26a58bac172d365Ian Romanick      /* Add the vairable to the symbol table after processing the initializer.
124317d86f4371da413176ba365ca26a58bac172d365Ian Romanick       * This differs from most C-like languages, but it follows the GLSL
124417d86f4371da413176ba365ca26a58bac172d365Ian Romanick       * specification.  From page 28 (page 34 of the PDF) of the GLSL 1.50
124517d86f4371da413176ba365ca26a58bac172d365Ian Romanick       * spec:
124617d86f4371da413176ba365ca26a58bac172d365Ian Romanick       *
124717d86f4371da413176ba365ca26a58bac172d365Ian Romanick       *     "Within a declaration, the scope of a name starts immediately
124817d86f4371da413176ba365ca26a58bac172d365Ian Romanick       *     after the initializer if present or immediately after the name
124917d86f4371da413176ba365ca26a58bac172d365Ian Romanick       *     being declared if not."
125017d86f4371da413176ba365ca26a58bac172d365Ian Romanick       */
125117d86f4371da413176ba365ca26a58bac172d365Ian Romanick      const bool added_variable =
125217d86f4371da413176ba365ca26a58bac172d365Ian Romanick	 state->symbols->add_variable(decl->identifier, var);
125317d86f4371da413176ba365ca26a58bac172d365Ian Romanick      assert(added_variable);
1254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Variable declarations do not have r-values.
1257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
1259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1262fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
12630044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_parameter_declarator::hir(exec_list *instructions,
126418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			      struct _mesa_glsl_parse_state *state)
1265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
1267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name = NULL;
12682e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt   YYLTYPE loc = this->get_location();
1269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
127018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   type = type_specifier_to_glsl_type(this->type->specifier, & name, state);
1271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (type == NULL) {
1273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (name != NULL) {
1274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 _mesa_glsl_error(& loc, state,
1275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			  "invalid type `%s' in declaration of `%s'",
127618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			  name, this->identifier);
1277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
1278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 _mesa_glsl_error(& loc, state,
1279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			  "invalid type in declaration of `%s'",
128018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			  this->identifier);
1281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
12830471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::error_type;
1284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
128618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   ir_variable *var = new ir_variable(type, this->identifier);
1287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* FINISHME: Handle array declarations.  Note that this requires
1289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * FINISHME: complete handling of constant expressions.
1290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1292cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick   /* Apply any specified qualifiers to the parameter declaration.  Note that
1293cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick    * for function parameters the default mode is 'in'.
1294cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick    */
12952e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt   apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc);
1296cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick   if (var->mode == ir_var_auto)
1297cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick      var->mode = ir_var_in;
1298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
12990044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   instructions->push_tail(var);
1300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Parameter declarations do not have r-values.
1302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
1304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void
1308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_function_parameters_to_hir(struct simple_node *ast_parameters,
13090044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick			       exec_list *ir_parameters,
1310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			       struct _mesa_glsl_parse_state *state)
1311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   struct simple_node *ptr;
1313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   foreach (ptr, ast_parameters) {
131518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      ((ast_node *)ptr)->hir(ir_parameters, state);
1316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic bool
13210044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickparameter_lists_match(exec_list *list_a, exec_list *list_b)
1322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
13230044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   exec_list_iterator iter_a = list_a->iterator();
13240044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   exec_list_iterator iter_b = list_b->iterator();
1325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
13260044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   while (iter_a.has_next()) {
1327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* If all of the parameters from the other parameter list have been
1328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * exhausted, the lists have different length and, by definition,
1329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * do not match.
1330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
13310044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick      if (!iter_b.has_next())
1332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 return false;
1333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* If the types of the parameters do not match, the parameters lists
1335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * are different.
1336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
1337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* FINISHME */
1338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
13400044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick      iter_a.next();
13410044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick      iter_b.next();
1342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return true;
1345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1348fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
13490044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_function_definition::hir(exec_list *instructions,
135018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			     struct _mesa_glsl_parse_state *state)
1351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
135218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   ir_label *label;
135318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   ir_function_signature *signature = NULL;
135418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   ir_function *f = NULL;
13550044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   exec_list parameters;
1356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Convert the list of function parameters to HIR now so that they can be
1359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * used below to compare this function's signature with previously seen
1360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * signatures for functions with the same name.
1361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
136218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   ast_function_parameters_to_hir(& this->prototype->parameters, & parameters,
1363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				  state);
1364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1365e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   const char *return_type_name;
1366e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   const glsl_type *return_type =
1367e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick      type_specifier_to_glsl_type(this->prototype->return_type->specifier,
1368e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick				  & return_type_name, state);
1369e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick
1370e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   assert(return_type != NULL);
1371e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick
1372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Verify that this function's signature either doesn't match a previously
1373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * seen signature for a function with the same name, or, if a match is found,
1374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * that the previously seen signature does not have an associated definition.
1375a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
13763359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick   const char *const name = this->prototype->identifier;
13773359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick   f = state->symbols->get_function(name);
1378a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (f != NULL) {
13790044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick      foreach_iter(exec_list_iterator, iter, f->signatures) {
13800044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick	 signature = (struct ir_function_signature *) iter.get();
1381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 /* Compare the parameter list of the function being defined to the
1383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  * existing function.  If the parameter lists match, then the return
1384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  * type must also match and the existing function must not have a
1385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  * definition.
1386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  */
1387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 if (parameter_lists_match(& parameters, & signature->parameters)) {
1388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    /* FINISHME: Compare return types. */
1389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    if (signature->definition != NULL) {
139118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick	       YYLTYPE loc = this->get_location();
1392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
13933359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick	       _mesa_glsl_error(& loc, state, "function `%s' redefined", name);
1394a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	       signature = NULL;
1395a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	       break;
1396a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    }
1397a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 }
1398a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 signature = NULL;
1400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
14023359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick   } else if (state->symbols->name_declared_this_scope(name)) {
14033359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      /* This function name shadows a non-function use of the same name.
14043359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick       */
14053359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      YYLTYPE loc = this->get_location();
14063359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick
14073359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      _mesa_glsl_error(& loc, state, "function name `%s' conflicts with "
14083359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick		       "non-function", name);
14093359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      signature = NULL;
1410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else {
1411882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick      f = new ir_function(name);
14128bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      state->symbols->add_function(f->name, f);
1413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1415ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt   /* Verify the return type of main() */
1416ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt   if (strcmp(name, "main") == 0) {
1417ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt      if (return_type != glsl_type::get_instance(GLSL_TYPE_VOID, 0, 0)) {
1418ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt	 YYLTYPE loc = this->get_location();
1419ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt
1420ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt	 _mesa_glsl_error(& loc, state, "main() must return void");
1421ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt      }
1422ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt   }
1423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Finish storing the information about this new function in its signature.
1425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (signature == NULL) {
1427e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick      signature = new ir_function_signature(return_type);
14280044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick      f->signatures.push_tail(signature);
1429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else {
1430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* Destroy all of the previous parameter information.  The previous
1431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * parameter information comes from the function prototype, and it can
1432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * either include invalid parameter names or may not have names at all.
1433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
14340044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick      foreach_iter(exec_list_iterator, iter, signature->parameters) {
143544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke	 assert(((ir_instruction *) iter.get())->as_variable() != NULL);
1436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
14370044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick	 iter.remove();
14380044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick	 delete iter.get();
1439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
144341ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   assert(state->current_function == NULL);
144441ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   state->current_function = signature;
144541ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick
144618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   ast_function_parameters_to_hir(& this->prototype->parameters,
1447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				  & signature->parameters,
1448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				  state);
1449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* FINISHME: Set signature->return_type */
1450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
14513359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick   label = new ir_label(name);
1452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (signature->definition == NULL) {
1453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      signature->definition = label;
1454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
14550044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   instructions->push_tail(label);
1456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Add the function parameters to the symbol table.  During this step the
1458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * parameter declarations are also moved from the temporary "parameters" list
1459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * to the instruction list.  There are other more efficient ways to do this,
1460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * but they involve ugly linked-list gymnastics.
1461a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
14628bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick   state->symbols->push_scope();
14630044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   foreach_iter(exec_list_iterator, iter, parameters) {
14640044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick      ir_variable *const var = (ir_variable *) iter.get();
1465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
146644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke      assert(((ir_instruction *) var)->as_variable() != NULL);
1467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
14680044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick      iter.remove();
14690044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick      instructions->push_tail(var);
1470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
14713359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      /* The only way a parameter would "exist" is if two parameters have
14723359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick       * the same name.
14733359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick       */
14743359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      if (state->symbols->name_declared_this_scope(var->name)) {
14753359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick	 YYLTYPE loc = this->get_location();
14763359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick
14773359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick	 _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name);
14783359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      } else {
14793359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick	 state->symbols->add_variable(var->name, var);
14803359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      }
1481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Convert the body of the function to HIR, and append the resulting
1484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * instructions to the list that currently consists of the function label
1485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * and the function parameters.
1486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
148718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   this->body->hir(instructions, state);
1488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
14898bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick   state->symbols->pop_scope();
1490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
149141ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   assert(state->current_function == signature);
149241ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   state->current_function = NULL;
1493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Function definitions do not have r-values.
1495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
1497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
149816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
149916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
1500fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
150116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanickast_jump_statement::hir(exec_list *instructions,
150216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick			struct _mesa_glsl_parse_state *state)
150316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick{
150416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
150516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick   if (mode == ast_return) {
150616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      ir_return *inst;
150716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
150816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      if (opt_return_value) {
150916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 /* FINISHME: Make sure the enclosing function has a non-void return
151016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	  * FINISHME: type.
151116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	  */
151216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
151316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 ir_expression *const ret = (ir_expression *)
151416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	    opt_return_value->hir(instructions, state);
151516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 assert(ret != NULL);
151616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
151716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 /* FINISHME: Make sure the type of the return value matches the return
151816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	  * FINISHME: type of the enclosing function.
151916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	  */
152016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
152116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 inst = new ir_return(ret);
152216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      } else {
152316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 /* FINISHME: Make sure the enclosing function has a void return type.
152416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	  */
152516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 inst = new ir_return;
152616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      }
152716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
152816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      instructions->push_tail(inst);
152916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick   }
153016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
153116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick   /* Jump instructions do not have r-values.
153216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick    */
153316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick   return NULL;
153416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick}
15353c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
15363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
15373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickir_rvalue *
15383c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickast_selection_statement::hir(exec_list *instructions,
15393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick			     struct _mesa_glsl_parse_state *state)
15403c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick{
15413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *const condition = this->condition->hir(instructions, state);
15423c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   struct simple_node *ptr;
15433c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
15443c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   /* From page 66 (page 72 of the PDF) of the GLSL 1.50 spec:
15453c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *
15463c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *    "Any expression whose type evaluates to a Boolean can be used as the
15473c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *    conditional expression bool-expression. Vector types are not accepted
15483c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *    as the expression to if."
15493c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *
15503c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    * The checks are separated so that higher quality diagnostics can be
15513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    * generated for cases where both rules are violated.
15523c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    */
15533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   if (!condition->type->is_boolean() || !condition->type->is_scalar()) {
15543c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      YYLTYPE loc = this->condition->get_location();
15553c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
15563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      _mesa_glsl_error(& loc, state, "if-statement condition must be scalar "
15573c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick		       "boolean");
15583c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
15593c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
15603c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if *const stmt = new ir_if(condition);
15613c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
15623c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   if (then_statement != NULL) {
15633c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      ast_node *node = (ast_node *) then_statement;
15643c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      do {
15653c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick	 node->hir(& stmt->then_instructions, state);
15663c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick	 node = (ast_node *) node->next;
15673c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      } while (node != then_statement);
15683c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
15693c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
15703c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   if (else_statement != NULL) {
15713c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      ast_node *node = (ast_node *) else_statement;
15723c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      do {
15733c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick	 node->hir(& stmt->else_instructions, state);
15743c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick	 node = (ast_node *) node->next;
15753c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      } while (node != else_statement);
15763c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
15773c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
15783c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   instructions->push_tail(stmt);
15793c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
15803c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   /* if-statements do not have r-values.
15813c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    */
15823c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   return NULL;
15833c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}
1584