ir_print_visitor.cpp revision f8e31e00b1078dc28187a43a1ab8949e154e7533
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 */
2378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include <cstdio>
2478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_print_visitor.h"
25fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick#include "glsl_types.h"
26fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick
27fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanickstatic void
28fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanickprint_type(const glsl_type *t)
29fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick{
30fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick   if (t->base_type == GLSL_TYPE_ARRAY) {
31d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf("array (");
32fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick      print_type(t->fields.array);
33d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf(") (%u))", t->length);
34fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick   } else if (t->base_type == GLSL_TYPE_STRUCT) {
35d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf("struct (%s %u ", t->name ? t->name : "@", t->length);
36d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf("(FINISHME: structure fields go here) ");
37fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick      printf(")");
38fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick   } else {
39fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick      printf("%s", t->name);
40fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick   }
41fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick}
42fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick
4378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
4478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_variable *ir)
4578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
468c70a621939e55a81a363f04dee3333772339cbeIan Romanick   if (deref_depth) {
478c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(%s)", ir->name);
488c70a621939e55a81a363f04dee3333772339cbeIan Romanick   } else {
498c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(declare ");
5078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
518c70a621939e55a81a363f04dee3333772339cbeIan Romanick      const char *const cent = (ir->centroid) ? "centroid " : "";
528c70a621939e55a81a363f04dee3333772339cbeIan Romanick      const char *const inv = (ir->invariant) ? "invariant " : "";
538c70a621939e55a81a363f04dee3333772339cbeIan Romanick      const char *const mode[] = { "", "uniform ", "in ", "out ", "inout " };
548c70a621939e55a81a363f04dee3333772339cbeIan Romanick      const char *const interp[] = { "", "flat", "noperspective" };
5578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
568c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(%s%s%s%s) ",
578c70a621939e55a81a363f04dee3333772339cbeIan Romanick	     cent, inv, mode[ir->mode], interp[ir->interpolation]);
58fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick
598c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(");
608c70a621939e55a81a363f04dee3333772339cbeIan Romanick      print_type(ir->type);
618c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf(") ");
62d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf("(%s)) ", ir->name);
638c70a621939e55a81a363f04dee3333772339cbeIan Romanick   }
6478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
6578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
6678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
6778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_label *ir)
6878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
69d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf("\n(label %s)", ir->label);
7078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
7178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
7278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
7378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_function_signature *ir)
7478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
7578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   printf("%s:%d:\n", __func__, __LINE__);
7678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   (void) ir;
7778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
7878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
7978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
8078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_function *ir)
8178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
8278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   printf("(function %s\n", ir->name);
8378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   printf(")\n");
8478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
8578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
8678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
8778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_expression *ir)
8878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
89e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt   static const char *const operators[] = {
90e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "~",
91e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "!",
92e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "-",
93e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "abs",
94e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "rcp",
95e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "rsq",
9644d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt      "sqrt",
97e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "exp",
98e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "log",
9901665262e50162e858c45f92a8a7e12b953e56adEric Anholt      "exp2",
10001665262e50162e858c45f92a8a7e12b953e56adEric Anholt      "log2",
101e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "f2i",
102e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "i2f",
103dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt      "f2b",
104dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt      "b2f",
105c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt      "i2b",
106c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt      "b2i",
107e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "u2f",
108e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "trunc",
109e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "ceil",
110e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "floor",
111e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "+",
112e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "-",
113e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "*",
114e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "/",
115e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "%",
116e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "<",
117e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      ">",
118e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "<=",
119e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      ">=",
120e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "==",
121e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "!=",
122e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "<<",
123e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      ">>",
124e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "&",
125e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "^",
126e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "|",
127e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "&&",
128e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "^^",
129e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "||",
130e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "dot",
131e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "min",
132e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt      "max",
133ddd2e83db2b6baa062f76f22bb980030144dbcadEric Anholt      "pow",
134e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt   };
135e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt
136d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   printf("(expression ");
137d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick
138e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt   assert((unsigned int)ir->operation <
139e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt	  sizeof(operators) / sizeof(operators[0]));
140d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick
141e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt   printf("%s", operators[ir->operation]);
142e65e12fdbc2f51ecc3ca9265993c0c7a03e05a84Eric Anholt   printf("(");
143d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   if (ir->operands[0])
144d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick      ir->operands[0]->accept(this);
145d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   printf(") ");
146d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick
147d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   printf("(");
148d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   if (ir->operands[1])
149d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick      ir->operands[1]->accept(this);
150d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   printf(")) ");
15178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
15278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
15378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
154affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkevoid ir_print_visitor::visit(ir_swizzle *ir)
155affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke{
156affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   const unsigned swiz[4] = {
157affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      ir->mask.x,
158affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      ir->mask.y,
159affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      ir->mask.z,
160affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      ir->mask.w,
161affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   };
162affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
163affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   printf("(swiz ");
164affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   for (unsigned i = 0; i < ir->mask.num_components; i++) {
165affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      printf("%c", "xyzw"[swiz[i]]);
166affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
167affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   printf(" ");
168affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir->val->accept(this);
169affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   printf(")");
170affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}
171affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
172affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
17378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_dereference *ir)
17478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
1758c70a621939e55a81a363f04dee3333772339cbeIan Romanick   deref_depth++;
1768c70a621939e55a81a363f04dee3333772339cbeIan Romanick
1778c70a621939e55a81a363f04dee3333772339cbeIan Romanick   switch (ir->mode) {
1788c70a621939e55a81a363f04dee3333772339cbeIan Romanick   case ir_dereference::ir_reference_variable: {
1798c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(var_ref ");
1808c70a621939e55a81a363f04dee3333772339cbeIan Romanick      ir->var->accept(this);
181affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      printf(") ");
1828c70a621939e55a81a363f04dee3333772339cbeIan Romanick      break;
1838c70a621939e55a81a363f04dee3333772339cbeIan Romanick   }
1848c70a621939e55a81a363f04dee3333772339cbeIan Romanick   case ir_dereference::ir_reference_array:
1858c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(array_ref ");
1868c70a621939e55a81a363f04dee3333772339cbeIan Romanick      ir->var->accept(this);
1878c70a621939e55a81a363f04dee3333772339cbeIan Romanick      ir->selector.array_index->accept(this);
188d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf(") ");
1898c70a621939e55a81a363f04dee3333772339cbeIan Romanick      break;
1908c70a621939e55a81a363f04dee3333772339cbeIan Romanick   case ir_dereference::ir_reference_record:
1918c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(record_ref ");
1928c70a621939e55a81a363f04dee3333772339cbeIan Romanick      ir->var->accept(this);
193d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf("(%s)) ", ir->selector.field);
1948c70a621939e55a81a363f04dee3333772339cbeIan Romanick      break;
1958c70a621939e55a81a363f04dee3333772339cbeIan Romanick   }
1968c70a621939e55a81a363f04dee3333772339cbeIan Romanick
1978c70a621939e55a81a363f04dee3333772339cbeIan Romanick   deref_depth--;
19878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
19978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
20078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
20178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_assignment *ir)
20278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
203d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf("(assign (");
2046044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick
2056044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick   if (ir->condition)
2066044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick      ir->condition->accept(this);
2076044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick   else
2086044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick      printf("true");
2096044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick
210d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf(") (");
211d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick
2126044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick   ir->lhs->accept(this);
2136044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick
214d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf(") (");
215d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick
2166044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick   ir->rhs->accept(this);
217d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf(") ");
21878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
21978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
22078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
22178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_constant *ir)
22278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
223795492247369199d5e79f2503c40920ff8a9b686Ian Romanick   const glsl_type *const base_type = ir->type->get_base_type();
224fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick
225d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf("(constant (");
226795492247369199d5e79f2503c40920ff8a9b686Ian Romanick   print_type(base_type);
227d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf(") ");
228795492247369199d5e79f2503c40920ff8a9b686Ian Romanick
229d811d47609323f99f3718a2c5fb75ce47032f380Ian Romanick   printf("(%d) (", ir->type->components());
230d811d47609323f99f3718a2c5fb75ce47032f380Ian Romanick   for (unsigned i = 0; i < ir->type->components(); i++) {
231795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      if (i != 0)
232795492247369199d5e79f2503c40920ff8a9b686Ian Romanick	 printf(", ");
233795492247369199d5e79f2503c40920ff8a9b686Ian Romanick
234795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      switch (base_type->base_type) {
235795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      case GLSL_TYPE_UINT:  printf("%u", ir->value.u[i]); break;
236795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      case GLSL_TYPE_INT:   printf("%d", ir->value.i[i]); break;
237795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      case GLSL_TYPE_FLOAT: printf("%f", ir->value.f[i]); break;
238795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      case GLSL_TYPE_BOOL:  printf("%d", ir->value.b[i]); break;
239795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      default: assert(0);
240795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      }
241795492247369199d5e79f2503c40920ff8a9b686Ian Romanick   }
242795492247369199d5e79f2503c40920ff8a9b686Ian Romanick   printf(")) ");
24378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
244ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
245ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
246ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickvoid
247ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickir_print_visitor::visit(ir_call *ir)
248ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick{
2495508129fd8beb1113ad2b64bdddb36c954a7b5adIan Romanick   printf("(call (%s) ", ir->callee_name());
2505508129fd8beb1113ad2b64bdddb36c954a7b5adIan Romanick   foreach_iter(exec_list_iterator, iter, *ir) {
2515508129fd8beb1113ad2b64bdddb36c954a7b5adIan Romanick      ir_instruction *const inst = (ir_instruction *) iter.get();
252ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
2535508129fd8beb1113ad2b64bdddb36c954a7b5adIan Romanick      inst->accept(this);
2545508129fd8beb1113ad2b64bdddb36c954a7b5adIan Romanick   }
255ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}
2569578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
2579578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
2589578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickvoid
2599578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickir_print_visitor::visit(ir_return *ir)
2609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick{
2619578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   printf("(return");
2629578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
263fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *const value = ir->get_value();
2649578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   if (value) {
2659578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      printf(" ");
2669578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      value->accept(this);
2679578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
2689578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
269d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf(")");
2709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}
2713c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2723c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2733c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickvoid
2743c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickir_print_visitor::visit(ir_if *ir)
2753c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick{
2763c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   printf("(if ");
2773c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir->condition->accept(this);
2783c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2793c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   printf("(\n");
2803c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   foreach_iter(exec_list_iterator, iter, ir->then_instructions) {
2813c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      ir_instruction *const inst = (ir_instruction *) iter.get();
2823c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2833c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      inst->accept(this);
284b94e402cffc1c1606d8d7375f38ab573877e1c6aEric Anholt      printf("\n");
2853c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
2863c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   printf(")\n");
2873c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2883c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   printf("(\n");
2893c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   foreach_iter(exec_list_iterator, iter, ir->else_instructions) {
2903c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      ir_instruction *const inst = (ir_instruction *) iter.get();
2913c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
2923c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      inst->accept(this);
293b94e402cffc1c1606d8d7375f38ab573877e1c6aEric Anholt      printf("\n");
2943c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
2953c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   printf("))\n");
2963c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}
297fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
298fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
299fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickvoid
300fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickir_print_visitor::visit(ir_loop *ir)
301fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick{
302fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   printf("(loop (");
303fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   if (ir->counter != NULL)
304fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      ir->counter->accept(this);
305fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   printf(") (");
306fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   if (ir->from != NULL)
307fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      ir->from->accept(this);
308fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   printf(") (");
309fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   if (ir->to != NULL)
310fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      ir->to->accept(this);
311fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   printf(") (");
312fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   if (ir->increment != NULL)
313fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      ir->increment->accept(this);
314fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   printf(") (");
315fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   foreach_iter(exec_list_iterator, iter, ir->body_instructions) {
316fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      ir_instruction *const inst = (ir_instruction *) iter.get();
317fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick
318fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick      inst->accept(this);
319fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   }
320fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   printf("))\n");
321fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick}
322f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
323f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick
324f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickvoid
325f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickir_print_visitor::visit(ir_loop_jump *ir)
326f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick{
327f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   printf("%s", ir->is_break() ? "break" : "continue");
328f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick}
329