178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick/* 278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Copyright © 2010 Intel Corporation 378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * 478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Permission is hereby granted, free of charge, to any person obtaining a 578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * copy of this software and associated documentation files (the "Software"), 678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * to deal in the Software without restriction, including without limitation 778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * and/or sell copies of the Software, and to permit persons to whom the 978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Software is furnished to do so, subject to the following conditions: 1078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * 1178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * The above copyright notice and this permission notice (including the next 1278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * paragraph) shall be included in all copies or substantial portions of the 1378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Software. 1478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * 1578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * DEALINGS IN THE SOFTWARE. 2278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick */ 23ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt 2478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_print_visitor.h" 25fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick#include "glsl_types.h" 26a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick#include "glsl_parser_extras.h" 2756ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke#include "program/hash_table.h" 2856ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke 29a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanickstatic void print_type(const glsl_type *t); 30fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick 3136d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanickvoid 324b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholtir_instruction::print(void) const 33e46a454305af64710ce8deadafc718f75363ac7eEric Anholt{ 344b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt ir_instruction *deconsted = const_cast<ir_instruction *>(this); 354b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 36e46a454305af64710ce8deadafc718f75363ac7eEric Anholt ir_print_visitor v; 374b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt deconsted->accept(&v); 38e46a454305af64710ce8deadafc718f75363ac7eEric Anholt} 39e46a454305af64710ce8deadafc718f75363ac7eEric Anholt 40e46a454305af64710ce8deadafc718f75363ac7eEric Anholtvoid 4136d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick_mesa_print_ir(exec_list *instructions, 4236d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick struct _mesa_glsl_parse_state *state) 4336d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick{ 440e1992255837c88ba3c6631d5282fe944703ba56Eric Anholt if (state) { 450e1992255837c88ba3c6631d5282fe944703ba56Eric Anholt for (unsigned i = 0; i < state->num_user_structures; i++) { 460e1992255837c88ba3c6631d5282fe944703ba56Eric Anholt const glsl_type *const s = state->user_structures[i]; 47a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick 480e1992255837c88ba3c6631d5282fe944703ba56Eric Anholt printf("(structure (%s) (%s@%p) (%u) (\n", 49d3b66be3c7a3e9e29913ea86880c516e2b7a3ce0Brian Paul s->name, s->name, (void *) s, s->length); 50a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick 510e1992255837c88ba3c6631d5282fe944703ba56Eric Anholt for (unsigned j = 0; j < s->length; j++) { 520e1992255837c88ba3c6631d5282fe944703ba56Eric Anholt printf("\t(("); 530e1992255837c88ba3c6631d5282fe944703ba56Eric Anholt print_type(s->fields.structure[j].type); 540e1992255837c88ba3c6631d5282fe944703ba56Eric Anholt printf(")(%s))\n", s->fields.structure[j].name); 550e1992255837c88ba3c6631d5282fe944703ba56Eric Anholt } 56a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick 570e1992255837c88ba3c6631d5282fe944703ba56Eric Anholt printf(")\n"); 580e1992255837c88ba3c6631d5282fe944703ba56Eric Anholt } 59a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick } 6036d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick 6136d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick printf("(\n"); 6236d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick foreach_iter(exec_list_iterator, iter, *instructions) { 639a8eb684d4cd602b6c5e6876cd1eceabc3a8896cEric Anholt ir_instruction *ir = (ir_instruction *)iter.get(); 649a8eb684d4cd602b6c5e6876cd1eceabc3a8896cEric Anholt ir->print(); 659a8eb684d4cd602b6c5e6876cd1eceabc3a8896cEric Anholt if (ir->ir_type != ir_type_function) 669a8eb684d4cd602b6c5e6876cd1eceabc3a8896cEric Anholt printf("\n"); 6736d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick } 6836d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick printf("\n)"); 6936d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick} 7036d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick 7156ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunkeir_print_visitor::ir_print_visitor() 7256ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke{ 7356ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke indentation = 0; 7456ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke printable_names = 7556ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke hash_table_ctor(32, hash_table_pointer_hash, hash_table_pointer_compare); 7656ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke symbols = _mesa_symbol_table_ctor(); 7756ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke mem_ctx = ralloc_context(NULL); 7856ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke} 7956ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke 8056ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunkeir_print_visitor::~ir_print_visitor() 8156ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke{ 8256ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke hash_table_dtor(printable_names); 8356ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke _mesa_symbol_table_dtor(symbols); 8456ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke ralloc_free(mem_ctx); 8556ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke} 86bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 87bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholtvoid ir_print_visitor::indent(void) 88bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt{ 89bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt for (int i = 0; i < indentation; i++) 90bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt printf(" "); 91bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt} 92bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 9356ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunkeconst char * 9456ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunkeir_print_visitor::unique_name(ir_variable *var) 9556ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke{ 96174cef7fee7d400fc89a3ce68b7791d2aa3eb90fIan Romanick /* var->name can be NULL in function prototypes when a type is given for a 97174cef7fee7d400fc89a3ce68b7791d2aa3eb90fIan Romanick * parameter but no name is given. In that case, just return an empty 98174cef7fee7d400fc89a3ce68b7791d2aa3eb90fIan Romanick * string. Don't worry about tracking the generated name in the printable 99174cef7fee7d400fc89a3ce68b7791d2aa3eb90fIan Romanick * names hash because this is the only scope where it can ever appear. 100174cef7fee7d400fc89a3ce68b7791d2aa3eb90fIan Romanick */ 101174cef7fee7d400fc89a3ce68b7791d2aa3eb90fIan Romanick if (var->name == NULL) { 102174cef7fee7d400fc89a3ce68b7791d2aa3eb90fIan Romanick static unsigned arg = 1; 103174cef7fee7d400fc89a3ce68b7791d2aa3eb90fIan Romanick return ralloc_asprintf(this->mem_ctx, "parameter@%u", arg++); 104174cef7fee7d400fc89a3ce68b7791d2aa3eb90fIan Romanick } 105174cef7fee7d400fc89a3ce68b7791d2aa3eb90fIan Romanick 10656ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke /* Do we already have a name for this variable? */ 10756ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke const char *name = (const char *) hash_table_find(this->printable_names, var); 10856ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke if (name != NULL) 10956ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke return name; 11056ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke 11156ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke /* If there's no conflict, just use the original name */ 11256ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke if (_mesa_symbol_table_find_symbol(this->symbols, -1, var->name) == NULL) { 11356ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke name = var->name; 11456ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke } else { 11556ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke static unsigned i = 1; 11656ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke name = ralloc_asprintf(this->mem_ctx, "%s@%u", var->name, ++i); 11756ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke } 11856ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke hash_table_insert(this->printable_names, (void *) name, var); 11956ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke _mesa_symbol_table_add_symbol(this->symbols, -1, name, var); 12056ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke return name; 12156ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke} 12256ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke 123fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanickstatic void 124fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanickprint_type(const glsl_type *t) 125fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick{ 126fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick if (t->base_type == GLSL_TYPE_ARRAY) { 127295bb7ff8d3c508320a6af60a69901999196f05fKenneth Graunke printf("(array "); 128fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick print_type(t->fields.array); 129668d0a992a33fc2caeda070c34b3c98b5b628d2fKenneth Graunke printf(" %u)", t->length); 130a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick } else if ((t->base_type == GLSL_TYPE_STRUCT) 131a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick && (strncmp("gl_", t->name, 3) != 0)) { 132d3b66be3c7a3e9e29913ea86880c516e2b7a3ce0Brian Paul printf("%s@%p", t->name, (void *) t); 133fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick } else { 134fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick printf("%s", t->name); 135fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick } 136fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick} 137fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick 138807e967c615dc80a264af5a89af7649f95481744Kenneth Graunkevoid ir_print_visitor::visit(ir_rvalue *ir) 139807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke{ 140807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke printf("error"); 141807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke} 14278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 14378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_variable *ir) 14478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{ 145c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick printf("(declare "); 14678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 147c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick const char *const cent = (ir->centroid) ? "centroid " : ""; 148c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick const char *const inv = (ir->invariant) ? "invariant " : ""; 14940c4298a6ea9e83b49858916d5423fd2135ef39cKenneth Graunke const char *const mode[] = { "", "uniform ", "in ", "out ", "inout ", 150819d57fce94b20fa0d34da6f037f0a53c4a5bdc2Kenneth Graunke "const_in ", "sys ", "temporary " }; 151c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick const char *const interp[] = { "", "flat", "noperspective" }; 15278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 153c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick printf("(%s%s%s%s) ", 154c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick cent, inv, mode[ir->mode], interp[ir->interpolation]); 155fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick 156c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick print_type(ir->type); 15756ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke printf(" %s)", unique_name(ir)); 15878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick} 15978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 16078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 16178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_function_signature *ir) 16278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{ 16356ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke _mesa_symbol_table_push_scope(symbols); 164dde96781628f29cd362182864456130a4614f787Kenneth Graunke printf("(signature "); 165bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation++; 166bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 167dde96781628f29cd362182864456130a4614f787Kenneth Graunke print_type(ir->return_type); 168bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt printf("\n"); 169bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 170bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 171bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt printf("(parameters\n"); 172bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation++; 173bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 174fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt foreach_iter(exec_list_iterator, iter, ir->parameters) { 175fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt ir_variable *const inst = (ir_variable *) iter.get(); 176fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt 177bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 178fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt inst->accept(this); 179fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt printf("\n"); 180fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt } 181bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation--; 182bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 183bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 184bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt printf(")\n"); 185bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 186bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 187bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 188bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt printf("(\n"); 189bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation++; 190fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt 191894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt foreach_iter(exec_list_iterator, iter, ir->body) { 192894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt ir_instruction *const inst = (ir_instruction *) iter.get(); 193894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt 194bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 195894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt inst->accept(this); 196894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt printf("\n"); 197894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt } 198bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation--; 199bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 2009fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke printf("))\n"); 201bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation--; 20256ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke _mesa_symbol_table_pop_scope(symbols); 20378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick} 20478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 20578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 20678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_function *ir) 20778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{ 20878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick printf("(function %s\n", ir->name); 209bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation++; 2109fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke foreach_iter(exec_list_iterator, iter, *ir) { 2119fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke ir_function_signature *const sig = (ir_function_signature *) iter.get(); 212bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 2139fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke sig->accept(this); 2149fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke printf("\n"); 2159fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke } 216bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation--; 217bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 2189a8eb684d4cd602b6c5e6876cd1eceabc3a8896cEric Anholt printf(")\n\n"); 21978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick} 22078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 22178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 22278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_expression *ir) 22378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{ 224d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick printf("(expression "); 225d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick 2261a3a096bf51e86ddc63402def7dff39b41b7cd63Kenneth Graunke print_type(ir->type); 2271a3a096bf51e86ddc63402def7dff39b41b7cd63Kenneth Graunke 2283b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke printf(" %s ", ir->operator_string()); 2291a3a096bf51e86ddc63402def7dff39b41b7cd63Kenneth Graunke 230fc92e87b9757eda01caf0bb3e2c31b1dbbd73aa0Ian Romanick for (unsigned i = 0; i < ir->get_num_operands(); i++) { 231fc92e87b9757eda01caf0bb3e2c31b1dbbd73aa0Ian Romanick ir->operands[i]->accept(this); 232fc92e87b9757eda01caf0bb3e2c31b1dbbd73aa0Ian Romanick } 233d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick 2342bc582d26548a83fb64cdd6485d039b891dd4c37Kenneth Graunke printf(") "); 23578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick} 23678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 23778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 238be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunkevoid ir_print_visitor::visit(ir_texture *ir) 239be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke{ 240be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke printf("(%s ", ir->opcode_string()); 241be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke 242233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke print_type(ir->type); 243233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke printf(" "); 244233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke 245be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke ir->sampler->accept(this); 246be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke printf(" "); 247be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke 2481e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke if (ir->op != ir_txs) { 2491e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke ir->coordinate->accept(this); 250be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke 2511e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke printf(" "); 252c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke 2531e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke if (ir->offset != NULL) { 2541e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke ir->offset->accept(this); 2551e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke } else { 2561e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke printf("0"); 2571e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke } 258c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke 2591e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke printf(" "); 2601e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke } 261be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke 2621e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke if (ir->op != ir_txf && ir->op != ir_txs) { 263be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke if (ir->projector) 264be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke ir->projector->accept(this); 265be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke else 266be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke printf("1"); 267be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke 268be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke if (ir->shadow_comparitor) { 269be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke printf(" "); 270be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke ir->shadow_comparitor->accept(this); 271be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke } else { 272be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke printf(" ()"); 273be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke } 274be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke } 275be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke 276be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke printf(" "); 277be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke switch (ir->op) 278be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke { 279be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke case ir_tex: 280be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke break; 281be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke case ir_txb: 282be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke ir->lod_info.bias->accept(this); 283be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke break; 284be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke case ir_txl: 285be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke case ir_txf: 2861e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke case ir_txs: 287be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke ir->lod_info.lod->accept(this); 288be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke break; 289be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke case ir_txd: 290be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke printf("("); 291be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke ir->lod_info.grad.dPdx->accept(this); 292be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke printf(" "); 293be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke ir->lod_info.grad.dPdy->accept(this); 294be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke printf(")"); 295be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke break; 296be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke }; 297be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke printf(")"); 298be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke} 299be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke 300be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke 301affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkevoid ir_print_visitor::visit(ir_swizzle *ir) 302affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke{ 303affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke const unsigned swiz[4] = { 304affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir->mask.x, 305affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir->mask.y, 306affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir->mask.z, 307affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir->mask.w, 308affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke }; 309affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 310affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke printf("(swiz "); 311affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke for (unsigned i = 0; i < ir->mask.num_components; i++) { 312affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke printf("%c", "xyzw"[swiz[i]]); 313affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 314affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke printf(" "); 315affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir->val->accept(this); 316affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke printf(")"); 317affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke} 318affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 319affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 320c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanickvoid ir_print_visitor::visit(ir_dereference_variable *ir) 32178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{ 322ebefeb2bdd9b440f4b515986667e2bfb3147fe35Eric Anholt ir_variable *var = ir->variable_referenced(); 32356ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke printf("(var_ref %s) ", unique_name(var)); 324c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick} 325c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 3268c70a621939e55a81a363f04dee3333772339cbeIan Romanick 327c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanickvoid ir_print_visitor::visit(ir_dereference_array *ir) 328c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick{ 329c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick printf("(array_ref "); 33036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir->array->accept(this); 33136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir->array_index->accept(this); 332c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick printf(") "); 333c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick} 334c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 335c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 336c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanickvoid ir_print_visitor::visit(ir_dereference_record *ir) 337c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick{ 338c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick printf("(record_ref "); 33936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir->record->accept(this); 34013e1b6b725def5a22952ecd4e2e8b1e61cb3bcfaKenneth Graunke printf(" %s) ", ir->field); 34178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick} 34278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 34378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 34478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_assignment *ir) 34578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{ 346c84f636c9726ef38a6ae5e007327438f8492dbbaKenneth Graunke printf("(assign "); 3476044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick 3486044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick if (ir->condition) 3496044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick ir->condition->accept(this); 3505a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 3515a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick char mask[5]; 3525a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick unsigned j = 0; 3535a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 3545a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick for (unsigned i = 0; i < 4; i++) { 3555a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick if ((ir->write_mask & (1 << i)) != 0) { 3565a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick mask[j] = "xyzw"[i]; 3575a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick j++; 3585a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick } 3595a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick } 3605a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick mask[j] = '\0'; 3615a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 3625a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick printf(" (%s) ", mask); 363d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick 3646044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick ir->lhs->accept(this); 3656044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick 366c84f636c9726ef38a6ae5e007327438f8492dbbaKenneth Graunke printf(" "); 367d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick 3686044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick ir->rhs->accept(this); 369d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick printf(") "); 37078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick} 37178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 37278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 37378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_constant *ir) 37478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{ 375295bb7ff8d3c508320a6af60a69901999196f05fKenneth Graunke printf("(constant "); 3761f0cb24f8bd0f2dba23c95331b04d0a1f89d2af4Kenneth Graunke print_type(ir->type); 377295bb7ff8d3c508320a6af60a69901999196f05fKenneth Graunke printf(" ("); 378795492247369199d5e79f2503c40920ff8a9b686Ian Romanick 3799930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke if (ir->type->is_array()) { 3809930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke for (unsigned i = 0; i < ir->type->length; i++) 3819930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke ir->get_array_element(i)->accept(this); 382b7acf538af24ddab72a5cbd5975f089a747b68e4Kenneth Graunke } else if (ir->type->is_record()) { 383b7acf538af24ddab72a5cbd5975f089a747b68e4Kenneth Graunke ir_constant *value = (ir_constant *) ir->components.get_head(); 384b7acf538af24ddab72a5cbd5975f089a747b68e4Kenneth Graunke for (unsigned i = 0; i < ir->type->length; i++) { 3856491e9593d5cbc5644eb02593a2f562447efdcbbPaul Berry printf("(%s ", ir->type->fields.structure[i].name); 386b7acf538af24ddab72a5cbd5975f089a747b68e4Kenneth Graunke value->accept(this); 387b7acf538af24ddab72a5cbd5975f089a747b68e4Kenneth Graunke printf(")"); 388b7acf538af24ddab72a5cbd5975f089a747b68e4Kenneth Graunke 389b7acf538af24ddab72a5cbd5975f089a747b68e4Kenneth Graunke value = (ir_constant *) value->next; 390b7acf538af24ddab72a5cbd5975f089a747b68e4Kenneth Graunke } 3919930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke } else { 3929930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke for (unsigned i = 0; i < ir->type->components(); i++) { 3939930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke if (i != 0) 3949930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke printf(" "); 3953b4d2eac6001b464df11b175bd14fd4d3c4e412fKenneth Graunke switch (ir->type->base_type) { 3969930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke case GLSL_TYPE_UINT: printf("%u", ir->value.u[i]); break; 3979930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke case GLSL_TYPE_INT: printf("%d", ir->value.i[i]); break; 3989930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke case GLSL_TYPE_FLOAT: printf("%f", ir->value.f[i]); break; 3999930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke case GLSL_TYPE_BOOL: printf("%d", ir->value.b[i]); break; 4009930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke default: assert(0); 4019930d18c2aefad12152d12bc251d02ae1c1593bcKenneth Graunke } 402795492247369199d5e79f2503c40920ff8a9b686Ian Romanick } 403795492247369199d5e79f2503c40920ff8a9b686Ian Romanick } 404795492247369199d5e79f2503c40920ff8a9b686Ian Romanick printf(")) "); 40578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick} 406ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 407ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 408ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickvoid 409ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickir_print_visitor::visit(ir_call *ir) 410ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick{ 411d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke printf("(call %s ", ir->callee_name()); 412d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke if (ir->return_deref) 413d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke ir->return_deref->accept(this); 414d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke printf(" ("); 4155508129fd8beb1113ad2b64bdddb36c954a7b5adIan Romanick foreach_iter(exec_list_iterator, iter, *ir) { 4165508129fd8beb1113ad2b64bdddb36c954a7b5adIan Romanick ir_instruction *const inst = (ir_instruction *) iter.get(); 417ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 4185508129fd8beb1113ad2b64bdddb36c954a7b5adIan Romanick inst->accept(this); 4195508129fd8beb1113ad2b64bdddb36c954a7b5adIan Romanick } 4200e385196f65d0f8dc3238e7eedb6f2d6c0a79a5dKenneth Graunke printf("))\n"); 421ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick} 4229578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 4239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 4249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickvoid 4259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickir_print_visitor::visit(ir_return *ir) 4269578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick{ 4279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick printf("(return"); 4289578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 429fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *const value = ir->get_value(); 4309578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick if (value) { 4319578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick printf(" "); 4329578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick value->accept(this); 4339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 4349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 435d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick printf(")"); 4369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick} 4373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 4383c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 4393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickvoid 44016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeir_print_visitor::visit(ir_discard *ir) 44116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke{ 44216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke printf("(discard "); 44316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 44416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke if (ir->condition != NULL) { 44516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke printf(" "); 44616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir->condition->accept(this); 44716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 44816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 44916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke printf(")"); 45016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke} 45116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 45216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 45316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkevoid 4543c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickir_print_visitor::visit(ir_if *ir) 4553c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick{ 4563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick printf("(if "); 4573c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir->condition->accept(this); 4583c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 4593c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick printf("(\n"); 460bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation++; 461bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 4623c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick foreach_iter(exec_list_iterator, iter, ir->then_instructions) { 4633c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_instruction *const inst = (ir_instruction *) iter.get(); 4643c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 465bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 4663c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick inst->accept(this); 467b94e402cffc1c1606d8d7375f38ab573877e1c6aEric Anholt printf("\n"); 4683c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 469bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 470bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation--; 471bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 4723c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick printf(")\n"); 4733c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 474bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 4759710d272f71c95c8145999a31e2c47e1977c698eIan Romanick if (!ir->else_instructions.is_empty()) { 4769710d272f71c95c8145999a31e2c47e1977c698eIan Romanick printf("(\n"); 4779710d272f71c95c8145999a31e2c47e1977c698eIan Romanick indentation++; 478bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 4799710d272f71c95c8145999a31e2c47e1977c698eIan Romanick foreach_iter(exec_list_iterator, iter, ir->else_instructions) { 4809710d272f71c95c8145999a31e2c47e1977c698eIan Romanick ir_instruction *const inst = (ir_instruction *) iter.get(); 4813c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 4829710d272f71c95c8145999a31e2c47e1977c698eIan Romanick indent(); 4839710d272f71c95c8145999a31e2c47e1977c698eIan Romanick inst->accept(this); 4849710d272f71c95c8145999a31e2c47e1977c698eIan Romanick printf("\n"); 4859710d272f71c95c8145999a31e2c47e1977c698eIan Romanick } 4869710d272f71c95c8145999a31e2c47e1977c698eIan Romanick indentation--; 487bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 4889710d272f71c95c8145999a31e2c47e1977c698eIan Romanick printf("))\n"); 4899710d272f71c95c8145999a31e2c47e1977c698eIan Romanick } else { 4909710d272f71c95c8145999a31e2c47e1977c698eIan Romanick printf("())\n"); 4913c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 4923c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick} 493fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 494fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 495fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickvoid 496fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickir_print_visitor::visit(ir_loop *ir) 497fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick{ 498fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick printf("(loop ("); 499fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick if (ir->counter != NULL) 500fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir->counter->accept(this); 501fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick printf(") ("); 502fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick if (ir->from != NULL) 503fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir->from->accept(this); 504fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick printf(") ("); 505fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick if (ir->to != NULL) 506fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir->to->accept(this); 507fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick printf(") ("); 508fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick if (ir->increment != NULL) 509fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir->increment->accept(this); 510d6313d7a01d842483ae8e5bd1f5dcd20ace1b6f1Ian Romanick printf(") (\n"); 511bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation++; 512bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt 513fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick foreach_iter(exec_list_iterator, iter, ir->body_instructions) { 514fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_instruction *const inst = (ir_instruction *) iter.get(); 515fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 516bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 517fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick inst->accept(this); 518d6313d7a01d842483ae8e5bd1f5dcd20ace1b6f1Ian Romanick printf("\n"); 519fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 520bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indentation--; 521bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt indent(); 522fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick printf("))\n"); 523fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick} 524f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 525f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 526f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickvoid 527f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickir_print_visitor::visit(ir_loop_jump *ir) 528f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick{ 529f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick printf("%s", ir->is_break() ? "break" : "continue"); 530f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick} 531