18895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick/*
28895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * Copyright © 2010 Intel Corporation
38895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick *
48895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * Permission is hereby granted, free of charge, to any person obtaining a
58895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * copy of this software and associated documentation files (the "Software"),
68895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * to deal in the Software without restriction, including without limitation
78895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
88895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * and/or sell copies of the Software, and to permit persons to whom the
98895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * Software is furnished to do so, subject to the following conditions:
108895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick *
118895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * The above copyright notice and this permission notice (including the next
128895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * paragraph) shall be included in all copies or substantial portions of the
138895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * Software.
148895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick *
158895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
168895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
178895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
188895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
198895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
208895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
218895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * DEALINGS IN THE SOFTWARE.
228895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick */
23ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt
248895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick#include "ir.h"
258895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
268895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick/**
278895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * \file ir_hv_accept.cpp
288895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * Implementations of all hierarchical visitor accept methods for IR
298895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick * instructions.
308895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick */
318895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
328895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick/**
33cc81eb09b928389f926b3512c18b3298777d2928Paul Berry * Process a list of nodes using a hierarchical vistor.
34cc81eb09b928389f926b3512c18b3298777d2928Paul Berry *
35cc81eb09b928389f926b3512c18b3298777d2928Paul Berry * If statement_list is true (the default), this is a list of statements, so
36cc81eb09b928389f926b3512c18b3298777d2928Paul Berry * v->base_ir will be set to point to each statement just before iterating
37cc81eb09b928389f926b3512c18b3298777d2928Paul Berry * over it, and restored after iteration is complete.  If statement_list is
38cc81eb09b928389f926b3512c18b3298777d2928Paul Berry * false, this is a list that appears inside a statement (e.g. a parameter
39cc81eb09b928389f926b3512c18b3298777d2928Paul Berry * list), so v->base_ir will be left alone.
40458d5c61ef9740cf589807c85d95e9ea4d04c03bIan Romanick *
4161a44ccaef63a8ad36ebd934e6944ede5587e4d5Kenneth Graunke * \warning
42458d5c61ef9740cf589807c85d95e9ea4d04c03bIan Romanick * This function will operate correctly if a node being processed is removed
4361a44ccaef63a8ad36ebd934e6944ede5587e4d5Kenneth Graunke * from the list.  However, if nodes are added to the list after the node being
4461a44ccaef63a8ad36ebd934e6944ede5587e4d5Kenneth Graunke * processed, some of the added nodes may not be processed.
458895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick */
468a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholtir_visitor_status
47cc81eb09b928389f926b3512c18b3298777d2928Paul Berryvisit_list_elements(ir_hierarchical_visitor *v, exec_list *l,
48cc81eb09b928389f926b3512c18b3298777d2928Paul Berry                    bool statement_list)
498895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
508a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt   ir_instruction *prev_base_ir = v->base_ir;
51458d5c61ef9740cf589807c85d95e9ea4d04c03bIan Romanick
52a4dde28ee6893ab99c6ca93699392bb8bc2d981cKenneth Graunke   foreach_list_safe(n, l) {
538895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      ir_instruction *const ir = (ir_instruction *) n;
54cc81eb09b928389f926b3512c18b3298777d2928Paul Berry      if (statement_list)
55cc81eb09b928389f926b3512c18b3298777d2928Paul Berry         v->base_ir = ir;
568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      ir_visitor_status s = ir->accept(v);
578895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
588895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      if (s != visit_continue)
598895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 return s;
608895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   }
61cc81eb09b928389f926b3512c18b3298777d2928Paul Berry   if (statement_list)
62cc81eb09b928389f926b3512c18b3298777d2928Paul Berry      v->base_ir = prev_base_ir;
638895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
648895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return visit_continue;
658895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
668895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
678895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
688895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
69807e967c615dc80a264af5a89af7649f95481744Kenneth Graunkeir_rvalue::accept(ir_hierarchical_visitor *v)
70807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke{
71807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke   return v->visit(this);
72807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke}
73807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke
74807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke
75807e967c615dc80a264af5a89af7649f95481744Kenneth Graunkeir_visitor_status
768895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_variable::accept(ir_hierarchical_visitor *v)
778895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return v->visit(this);
798895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
808895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
818895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
828895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
838895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_loop::accept(ir_hierarchical_visitor *v)
848895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
858895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   ir_visitor_status s = v->visit_enter(this);
868895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
878895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
888895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
898895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
908895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   s = visit_list_elements(v, &this->body_instructions);
918895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s == visit_stop)
928895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return s;
938895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
948895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue_with_parent) {
958895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      if (this->from) {
968895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 s = this->from->accept(v);
978895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 if (s != visit_continue)
988895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	    return (s == visit_continue_with_parent) ? visit_continue : s;
998895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      }
1008895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1018895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      if (this->to) {
1028895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 s = this->to->accept(v);
1038895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 if (s != visit_continue)
1048895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	    return (s == visit_continue_with_parent) ? visit_continue : s;
1058895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      }
1068895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1078895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      if (this->increment) {
1088895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 s = this->increment->accept(v);
1098895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 if (s != visit_continue)
1108895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	    return (s == visit_continue_with_parent) ? visit_continue : s;
1118895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      }
1128895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   }
1138895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1148895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return v->visit_leave(this);
1158895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
1168895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1178895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1188895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
1198895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_loop_jump::accept(ir_hierarchical_visitor *v)
1208895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
1218895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return v->visit(this);
1228895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
1238895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1248895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1258895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
1268895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_function_signature::accept(ir_hierarchical_visitor *v)
1278895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
1288895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   ir_visitor_status s = v->visit_enter(this);
1298895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
1308895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
1318895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
132773025b92c934014b9ceb4ebfdabcfc9d8587aa2Eric Anholt   s = visit_list_elements(v, &this->parameters);
133773025b92c934014b9ceb4ebfdabcfc9d8587aa2Eric Anholt   if (s == visit_stop)
134773025b92c934014b9ceb4ebfdabcfc9d8587aa2Eric Anholt      return s;
135773025b92c934014b9ceb4ebfdabcfc9d8587aa2Eric Anholt
1368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   s = visit_list_elements(v, &this->body);
1378895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return (s == visit_stop) ? s : v->visit_leave(this);
1388895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
1398895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1408895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1418895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
1428895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_function::accept(ir_hierarchical_visitor *v)
1438895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
144458d5c61ef9740cf589807c85d95e9ea4d04c03bIan Romanick   ir_visitor_status s = v->visit_enter(this);
145458d5c61ef9740cf589807c85d95e9ea4d04c03bIan Romanick   if (s != visit_continue)
146458d5c61ef9740cf589807c85d95e9ea4d04c03bIan Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
147458d5c61ef9740cf589807c85d95e9ea4d04c03bIan Romanick
148cc81eb09b928389f926b3512c18b3298777d2928Paul Berry   s = visit_list_elements(v, &this->signatures, false);
149458d5c61ef9740cf589807c85d95e9ea4d04c03bIan Romanick   return (s == visit_stop) ? s : v->visit_leave(this);
1508895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
1518895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1528895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1538895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
1548895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_expression::accept(ir_hierarchical_visitor *v)
1558895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
1568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   ir_visitor_status s = v->visit_enter(this);
1578895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1588895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
1598895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
1608895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1618895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   for (unsigned i = 0; i < this->get_num_operands(); i++) {
1628895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      switch (this->operands[i]->accept(v)) {
1638895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      case visit_continue:
1648895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 break;
1658895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1668895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      case visit_continue_with_parent:
1678895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 // I wish for Java's labeled break-statement here.
1688895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 goto done;
1698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1708895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      case visit_stop:
1718895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 return s;
1728895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      }
1738895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   }
1748895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
1758895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickdone:
1768895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return v->visit_leave(this);
1778895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
1788895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
17926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunkeir_visitor_status
18026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunkeir_texture::accept(ir_hierarchical_visitor *v)
18126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke{
182216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   ir_visitor_status s = v->visit_enter(this);
183216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   if (s != visit_continue)
184216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      return (s == visit_continue_with_parent) ? visit_continue : s;
185216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt
186216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   s = this->sampler->accept(v);
187216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   if (s != visit_continue)
188216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      return (s == visit_continue_with_parent) ? visit_continue : s;
189216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt
1901e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke   if (this->coordinate) {
1911e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke      s = this->coordinate->accept(v);
1921e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke      if (s != visit_continue)
1931e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke	 return (s == visit_continue_with_parent) ? visit_continue : s;
1941e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke   }
195216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt
196216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   if (this->projector) {
197216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      s = this->projector->accept(v);
198216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      if (s != visit_continue)
199216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt	 return (s == visit_continue_with_parent) ? visit_continue : s;
200216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   }
201216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt
202216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   if (this->shadow_comparitor) {
203216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      s = this->shadow_comparitor->accept(v);
204216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      if (s != visit_continue)
205216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt	 return (s == visit_continue_with_parent) ? visit_continue : s;
206216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   }
207216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt
208c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke   if (this->offset) {
209c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke      s = this->offset->accept(v);
210c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke      if (s != visit_continue)
211c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke	 return (s == visit_continue_with_parent) ? visit_continue : s;
212c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke   }
213c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke
214216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   switch (this->op) {
215216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   case ir_tex:
216216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      break;
217216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   case ir_txb:
218216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      s = this->lod_info.bias->accept(v);
219216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      if (s != visit_continue)
220216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt	 return (s == visit_continue_with_parent) ? visit_continue : s;
221216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      break;
222216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   case ir_txl:
223216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   case ir_txf:
2241e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke   case ir_txs:
225216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      s = this->lod_info.lod->accept(v);
226216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      if (s != visit_continue)
227216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt	 return (s == visit_continue_with_parent) ? visit_continue : s;
228216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      break;
229216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   case ir_txd:
230216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      s = this->lod_info.grad.dPdx->accept(v);
231216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      if (s != visit_continue)
232216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt	 return (s == visit_continue_with_parent) ? visit_continue : s;
233216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt
234216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      s = this->lod_info.grad.dPdy->accept(v);
235216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      if (s != visit_continue)
236216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt	 return (s == visit_continue_with_parent) ? visit_continue : s;
237216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt      break;
238216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt   }
239216580dbd733aa2e64df4ca95e37a0eb102c6edeEric Anholt
240748f81a8eacabf07e1d26372a61683e6759a61a3Eric Anholt   return (s == visit_stop) ? s : v->visit_leave(this);
24126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke}
24226d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke
2438895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
2448895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
2458895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_swizzle::accept(ir_hierarchical_visitor *v)
2468895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
2478895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   ir_visitor_status s = v->visit_enter(this);
2488895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
2498895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
2508895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
2518895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   s = this->val->accept(v);
2528895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return (s == visit_stop) ? s : v->visit_leave(this);
2538895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
2548895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
2558895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
2568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
257f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanickir_dereference_variable::accept(ir_hierarchical_visitor *v)
258f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick{
259f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   return v->visit(this);
260f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick}
261f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
262f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
263f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanickir_visitor_status
264f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanickir_dereference_array::accept(ir_hierarchical_visitor *v)
2658895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
2668895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   ir_visitor_status s = v->visit_enter(this);
2678895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
2688895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
2698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
270c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick   /* The array index is not the target of the assignment, so clear the
271c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick    * 'in_assignee' flag.  Restore it after returning from the array index.
272c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick    */
273c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick   const bool was_in_assignee = v->in_assignee;
274c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick   v->in_assignee = false;
27536ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   s = this->array_index->accept(v);
276c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick   v->in_assignee = was_in_assignee;
277c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick
278f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   if (s != visit_continue)
279f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
2808895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
28136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   s = this->array->accept(v);
282f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   return (s == visit_stop) ? s : v->visit_leave(this);
283f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick}
284f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
285f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick
286f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanickir_visitor_status
287f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanickir_dereference_record::accept(ir_hierarchical_visitor *v)
288f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick{
289f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   ir_visitor_status s = v->visit_enter(this);
290f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick   if (s != visit_continue)
291f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
2928895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
29336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick   s = this->record->accept(v);
2948895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return (s == visit_stop) ? s : v->visit_leave(this);
2958895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
2968895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
2978895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
2988895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
2998895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_assignment::accept(ir_hierarchical_visitor *v)
3008895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
3018895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   ir_visitor_status s = v->visit_enter(this);
3028895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
3038895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
3048895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
305c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick   v->in_assignee = true;
3068895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   s = this->lhs->accept(v);
307c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick   v->in_assignee = false;
3088895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
3098895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
3108895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3118895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   s = this->rhs->accept(v);
3128895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
3138895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
3148895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3158895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (this->condition)
3168895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      s = this->condition->accept(v);
3178895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3188895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return (s == visit_stop) ? s : v->visit_leave(this);
3198895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
3208895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3218895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3228895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
3238895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_constant::accept(ir_hierarchical_visitor *v)
3248895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
3258895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return v->visit(this);
3268895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
3278895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3288895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3298895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
3308895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_call::accept(ir_hierarchical_visitor *v)
3318895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
3328895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   ir_visitor_status s = v->visit_enter(this);
3338895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
3348895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
3358895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
336d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke   if (this->return_deref != NULL) {
337d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke      v->in_assignee = true;
338d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke      s = this->return_deref->accept(v);
339d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke      v->in_assignee = false;
340d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke      if (s != visit_continue)
341d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke	 return (s == visit_continue_with_parent) ? visit_continue : s;
342d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke   }
343d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke
344cc81eb09b928389f926b3512c18b3298777d2928Paul Berry   s = visit_list_elements(v, &this->actual_parameters, false);
3458895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s == visit_stop)
3468895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return s;
3478895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3488895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return v->visit_leave(this);
3498895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
3508895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3518895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3528895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
3538895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_return::accept(ir_hierarchical_visitor *v)
3548895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
3558895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   ir_visitor_status s = v->visit_enter(this);
3568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
3578895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
3588895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3598895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   ir_rvalue *val = this->get_value();
3608895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (val) {
3618895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      s = val->accept(v);
3628895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      if (s != visit_continue)
3638895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 return (s == visit_continue_with_parent) ? visit_continue : s;
3648895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   }
3658895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3668895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return v->visit_leave(this);
3678895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
3688895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3698895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3708895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_visitor_status
37116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeir_discard::accept(ir_hierarchical_visitor *v)
37216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke{
37316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   ir_visitor_status s = v->visit_enter(this);
37416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   if (s != visit_continue)
37516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      return (s == visit_continue_with_parent) ? visit_continue : s;
37616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
37716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   if (this->condition != NULL) {
37816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      s = this->condition->accept(v);
37916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke      if (s != visit_continue)
38016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke	 return (s == visit_continue_with_parent) ? visit_continue : s;
38116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   }
38216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
38316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   return v->visit_leave(this);
38416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke}
38516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
38616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke
38716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeir_visitor_status
3888895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanickir_if::accept(ir_hierarchical_visitor *v)
3898895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick{
3908895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   ir_visitor_status s = v->visit_enter(this);
3918895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
3928895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
3938895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3948895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   s = this->condition->accept(v);
3958895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue)
3968895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      return (s == visit_continue_with_parent) ? visit_continue : s;
3978895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
3988895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue_with_parent) {
3998895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      s = visit_list_elements(v, &this->then_instructions);
4008895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      if (s == visit_stop)
4018895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 return s;
4028895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   }
4038895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
4048895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   if (s != visit_continue_with_parent) {
4058895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      s = visit_list_elements(v, &this->else_instructions);
4068895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick      if (s == visit_stop)
4078895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick	 return s;
4088895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   }
4098895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick
4108895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick   return v->visit_leave(this);
4118895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick}
412