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