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