1d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller/*
2d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * Copyright 2011 Christoph Bumiller
3d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller *
4d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * Permission is hereby granted, free of charge, to any person obtaining a
5d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * copy of this software and associated documentation files (the "Software"),
6d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * to deal in the Software without restriction, including without limitation
7d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * and/or sell copies of the Software, and to permit persons to whom the
9d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * Software is furnished to do so, subject to the following conditions:
10d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller *
11d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * The above copyright notice and this permission notice shall be included in
12d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * all copies or substantial portions of the Software.
13d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller *
14d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
173d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
183d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
193d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
203d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER DEALINGS IN THE SOFTWARE.
21d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller */
2257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
235eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "codegen/nv50_ir.h"
245eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "codegen/nv50_ir_target.h"
2563a15117a5eb495924bbcb70c067b6e11ab04476Marcin Ślusarz
2663a15117a5eb495924bbcb70c067b6e11ab04476Marcin Ślusarz#define __STDC_FORMAT_MACROS
2730ebc8650caa8f67deebaae397a04dfdfc50d1dfMarek Olšák#include <inttypes.h>
2857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
2957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernamespace nv50_ir {
3057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
3157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerenum TextStyle
3257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
3357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   TXT_DEFAULT,
3457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   TXT_GPR,
3557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   TXT_REGISTER,
3657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   TXT_FLAGS,
3757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   TXT_MEM,
3857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   TXT_IMMD,
3957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   TXT_BRA,
4057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   TXT_INSN
4157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller};
4257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
4396259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarzstatic const char *_colour[8] =
4457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
4557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "\x1b[00m",
4657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "\x1b[34m",
4757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "\x1b[35m",
4857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "\x1b[35m",
4957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "\x1b[36m",
5057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "\x1b[33m",
5157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "\x1b[37m",
5257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "\x1b[32m"
5357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller};
5457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
5596259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarzstatic const char *_nocolour[8] =
5696259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz{
5796259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz      "", "", "", "", "", "", "", ""
5896259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz};
5996259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz
6096259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarzstatic const char **colour;
6196259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz
6296259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarzstatic void init_colours()
6396259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz{
6496259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz   if (getenv("NV50_PROG_DEBUG_NO_COLORS") != NULL)
6596259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz      colour = _nocolour;
6696259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz   else
6796259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz      colour = _colour;
6896259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz}
6996259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz
7057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerconst char *operationStr[OP_LAST + 1] =
7157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
7257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "nop",
7357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "phi",
7457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "union",
7557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "split",
7657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "merge",
7757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "consec",
7857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "mov",
7957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "ld",
8057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "st",
8157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "add",
8257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "sub",
8357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "mul",
8457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "div",
8557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "mod",
8657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "mad",
8757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "fma",
8857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "sad",
8985132c7453230960f34cfe7b7b7fcaaab158d79fSamuel Pitoiset   "shladd",
9057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "abs",
9157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "neg",
9257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "not",
9357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "and",
9457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "or",
9557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "xor",
9657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "shl",
9757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "shr",
9857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "max",
9957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "min",
10057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "sat",
10157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "ceil",
10257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "floor",
10357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "trunc",
10457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "cvt",
10557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "set and",
10657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "set or",
10757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "set xor",
10857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "set",
10957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "selp",
11057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "slct",
11157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "rcp",
11257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "rsq",
11357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "lg2",
11457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "sin",
11557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "cos",
11657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "ex2",
11757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "exp",
11857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "log",
11957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "presin",
12057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "preex2",
12157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "sqrt",
12257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "pow",
12357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "bra",
12457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "call",
12557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "ret",
12657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "cont",
12757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "break",
12857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "preret",
12957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "precont",
13057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "prebreak",
13157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "brkpt",
13257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "joinat",
13357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "join",
13457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "discard",
13557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "exit",
13622b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "membar",
13757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "vfetch",
13857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "pfetch",
1399d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin   "afetch",
14057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "export",
14157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "linterp",
14257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "pinterp",
14357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "emit",
14457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "restart",
14557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "tex",
14657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "texbias",
14757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "texlod",
14857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "texfetch",
14957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "texquery",
15057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "texgrad",
15157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "texgather",
152d5faf8e78603a27dbedb2e9e28b58b1b2bc32858Ilia Mirkin   "texquerylod",
15357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "texcsaa",
15422b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "texprep",
15522b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "suldb",
15622b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "suldp",
15722b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "sustb",
15822b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "sustp",
15922b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "suredb",
16022b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "suredp",
16122b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "sulea",
16222b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "subfm",
16322b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "suclamp",
16422b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "sueau",
1652c4eeb0b5cf17caa06cb3fa46d4f64e6a8005d23Ilia Mirkin   "suq",
16622b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "madsp",
16722b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "texbar",
16857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "dfdx",
16957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "dfdy",
17057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "rdsv",
17157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "wrsv",
172af38ef907c89ecb1125bf258cafa0793f79a5eb7Ilia Mirkin   "pixld",
17357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "quadop",
17457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "quadon",
17557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "quadpop",
17657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "popcnt",
17757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "insbf",
17857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "extbf",
179b4b20d42f6a8cd5aec3ba529a0b8d6ea22e73305Ilia Mirkin   "bfind",
18022b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "permt",
18122b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "atom",
18222b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "bar",
18322b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "vadd",
18422b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "vavg",
18522b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "vmin",
18622b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "vmax",
18722b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "vsad",
18822b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "vset",
18922b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "vshr",
19022b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "vshl",
19122b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "vsel",
19218fdfbdc32f204d6728c1ad57a693b1a6ad0aec9Christoph Bumiller   "cctl",
193d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   "shfl",
19407ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset   "vote",
1957c47db359e193f21be796df3a7b5d037dd42b28fSamuel Pitoiset   "bufq",
19657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "(invalid)"
19757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller};
19857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
19922b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumillerstatic const char *atomSubOpStr[] =
20022b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller{
20122b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller   "add", "min", "max", "inc", "dec", "and", "or", "xor", "cas", "exch"
20222b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller};
20322b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller
2040c930557bf96721ce50ca95b5201be09da905cb8Samuel Pitoisetstatic const char *ldstSubOpStr[] =
2050c930557bf96721ce50ca95b5201be09da905cb8Samuel Pitoiset{
2060c930557bf96721ce50ca95b5201be09da905cb8Samuel Pitoiset   "", "lock", "unlock"
2070c930557bf96721ce50ca95b5201be09da905cb8Samuel Pitoiset};
2080c930557bf96721ce50ca95b5201be09da905cb8Samuel Pitoiset
209a734c0f8ba4a99e3ae42fe7ca9b1af16a01587b3Samuel Pitoisetstatic const char *subfmOpStr[] =
210a734c0f8ba4a99e3ae42fe7ca9b1af16a01587b3Samuel Pitoiset{
211a734c0f8ba4a99e3ae42fe7ca9b1af16a01587b3Samuel Pitoiset   "", "3d"
212a734c0f8ba4a99e3ae42fe7ca9b1af16a01587b3Samuel Pitoiset};
213a734c0f8ba4a99e3ae42fe7ca9b1af16a01587b3Samuel Pitoiset
214c0d92078bbce7c2d8f017bd7d9c86f339a751bdcSamuel Pitoisetstatic const char *shflOpStr[] =
215c0d92078bbce7c2d8f017bd7d9c86f339a751bdcSamuel Pitoiset{
216c0d92078bbce7c2d8f017bd7d9c86f339a751bdcSamuel Pitoiset  "idx", "up", "down", "bfly"
217c0d92078bbce7c2d8f017bd7d9c86f339a751bdcSamuel Pitoiset};
218c0d92078bbce7c2d8f017bd7d9c86f339a751bdcSamuel Pitoiset
219908ba1955434e10f7fc3579bc07f3bc46f4bff3fSamuel Pitoisetstatic const char *pixldOpStr[] =
220908ba1955434e10f7fc3579bc07f3bc46f4bff3fSamuel Pitoiset{
221908ba1955434e10f7fc3579bc07f3bc46f4bff3fSamuel Pitoiset   "count", "covmask", "offset", "cent_offset", "sampleid"
222908ba1955434e10f7fc3579bc07f3bc46f4bff3fSamuel Pitoiset};
223908ba1955434e10f7fc3579bc07f3bc46f4bff3fSamuel Pitoiset
224a6d3b2e176ce60852710b769f35b5dbcd4416b20Samuel Pitoisetstatic const char *rcprsqOpStr[] =
225a6d3b2e176ce60852710b769f35b5dbcd4416b20Samuel Pitoiset{
226a6d3b2e176ce60852710b769f35b5dbcd4416b20Samuel Pitoiset   "", "64h"
227a6d3b2e176ce60852710b769f35b5dbcd4416b20Samuel Pitoiset};
228a6d3b2e176ce60852710b769f35b5dbcd4416b20Samuel Pitoiset
229fa10d1d67472cd2e821c5aa196590d43896a78fbSamuel Pitoisetstatic const char *emitOpStr[] =
230fa10d1d67472cd2e821c5aa196590d43896a78fbSamuel Pitoiset{
231fa10d1d67472cd2e821c5aa196590d43896a78fbSamuel Pitoiset   "", "restart"
232fa10d1d67472cd2e821c5aa196590d43896a78fbSamuel Pitoiset};
233fa10d1d67472cd2e821c5aa196590d43896a78fbSamuel Pitoiset
23403dc87caab25b5c33314ac9ef673fea92c78938eSamuel Pitoisetstatic const char *cctlOpStr[] =
23503dc87caab25b5c33314ac9ef673fea92c78938eSamuel Pitoiset{
23603dc87caab25b5c33314ac9ef673fea92c78938eSamuel Pitoiset   "", "", "", "", "", "iv", "ivall"
23703dc87caab25b5c33314ac9ef673fea92c78938eSamuel Pitoiset};
23803dc87caab25b5c33314ac9ef673fea92c78938eSamuel Pitoiset
239d588e4f1925c5a2fc3efbf9ab192f0f6494be57bSamuel Pitoisetstatic const char *barOpStr[] =
240d588e4f1925c5a2fc3efbf9ab192f0f6494be57bSamuel Pitoiset{
241d588e4f1925c5a2fc3efbf9ab192f0f6494be57bSamuel Pitoiset   "sync", "arrive", "red and", "red or", "red popc"
242d588e4f1925c5a2fc3efbf9ab192f0f6494be57bSamuel Pitoiset};
243d588e4f1925c5a2fc3efbf9ab192f0f6494be57bSamuel Pitoiset
24457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic const char *DataTypeStr[] =
24557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
24657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "-",
24757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "u8", "s8",
24857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "u16", "s16",
24957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "u32", "s32",
25057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "u64", "s64",
25157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "f16", "f32", "f64",
25257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "b96", "b128"
25357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller};
25457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
25557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic const char *RoundModeStr[] =
25657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
25757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "", "rm", "rz", "rp", "rni", "rmi", "rzi", "rpi"
25857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller};
25957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
26057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic const char *CondCodeStr[] =
26157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
26257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "never",
26357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "lt",
26457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "eq",
26557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "le",
26657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "gt",
26757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "ne",
26857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "ge",
26957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "",
27057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "(invalid)",
27157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "ltu",
27257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "equ",
27357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "leu",
27457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "gtu",
27557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "neu",
27657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "geu",
27757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "",
27857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "no",
27957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "nc",
28057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "ns",
28157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "na",
28257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "a",
28357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "s",
28457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "c",
28557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "o"
28657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller};
28757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
28857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic const char *SemanticStr[SV_LAST + 1] =
28957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
29057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "POSITION",
29157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "VERTEX_ID",
29257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "INSTANCE_ID",
29357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "INVOCATION_ID",
29457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "PRIMITIVE_ID",
29557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "VERTEX_COUNT",
29657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "LAYER",
29757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "VIEWPORT_INDEX",
29857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "Y_DIR",
29957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "FACE",
30057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "POINT_SIZE",
30157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "POINT_COORD",
30257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "CLIP_DISTANCE",
30357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "SAMPLE_INDEX",
304f715a0a39a0f7f19443e7721ae792878ba504eedIlia Mirkin   "SAMPLE_POS",
305b3a2398aded19e25124a4a1d228eb3843827f6b2Ilia Mirkin   "SAMPLE_MASK",
3067e0036a49258326cc2d875f2960d18c6b3665036Ilia Mirkin   "TESS_OUTER",
3077e0036a49258326cc2d875f2960d18c6b3665036Ilia Mirkin   "TESS_INNER",
30857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "TESS_COORD",
30957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "TID",
31057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "CTAID",
31157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "NTID",
31257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "GRIDID",
31357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "NCTAID",
31457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "LANEID",
31557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "PHYSID",
31657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "NPHYSID",
31757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "CLOCK",
31857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "LBASE",
31957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "SBASE",
32067250acbaba924ccaab696f2b348dfa898c41d0bChristoph Bumiller   "VERTEX_STRIDE",
321d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   "INVOCATION_INFO",
32239f51ec96f00f601b9c4d4e321dacb3af9dc866fIlia Mirkin   "THREAD_KILL",
323b214e0d2fb736afcc6eb222a29a4d2fad31acacfSamuel Pitoiset   "BASEVERTEX",
324b214e0d2fb736afcc6eb222a29a4d2fad31acacfSamuel Pitoiset   "BASEINSTANCE",
325b214e0d2fb736afcc6eb222a29a4d2fad31acacfSamuel Pitoiset   "DRAWID",
326ea6b236ab1a53cc0a616088aec4a0ec4d804f77dSamuel Pitoiset   "WORK_DIM",
32757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "?",
32857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   "(INVALID)"
32957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller};
33057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
331a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumillerstatic const char *interpStr[16] =
332a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller{
333a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "pass",
334a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "mul",
335a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "flat",
336a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "sc",
337a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "cent pass",
338a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "cent mul",
339a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "cent flat",
340a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "cent sc",
341a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "off pass",
342a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "off mul",
343a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "off flat",
344a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "off sc",
345a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "samp pass",
346a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "samp mul",
347a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "samp flat",
348a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller   "samp sc"
349a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller};
350a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller
35157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define PRINT(args...)                                \
35257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   do {                                               \
35357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      pos += snprintf(&buf[pos], size - pos, args);   \
35457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   } while(0)
35557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
35657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define SPACE_PRINT(cond, args...)                      \
35757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   do {                                                 \
35857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (cond)                                         \
35957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         buf[pos++] = ' ';                              \
36057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      pos += snprintf(&buf[pos], size - pos, args);     \
36157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   } while(0)
36257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
36357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define SPACE()                                    \
36457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   do {                                            \
36557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (pos < size)                              \
36657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         buf[pos++] = ' ';                         \
36757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   } while(0)
36857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
36957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerint Modifier::print(char *buf, size_t size) const
37057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
37157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   size_t pos = 0;
37257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
37357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (bits)
37457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("%s", colour[TXT_INSN]);
37557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
37657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   size_t base = pos;
37757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
37857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (bits & NV50_IR_MOD_NOT)
37957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("not");
38057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (bits & NV50_IR_MOD_SAT)
38157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      SPACE_PRINT(pos > base && pos < size, "sat");
38257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (bits & NV50_IR_MOD_NEG)
38357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      SPACE_PRINT(pos > base && pos < size, "neg");
38457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (bits & NV50_IR_MOD_ABS)
38557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      SPACE_PRINT(pos > base && pos < size, "abs");
38657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
38757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return pos;
38857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
389322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller
39057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerint LValue::print(char *buf, size_t size, DataType ty) const
39157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
39257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   const char *postFix = "";
39357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   size_t pos = 0;
39457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   int idx = join->reg.data.id >= 0 ? join->reg.data.id : id;
39557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   char p = join->reg.data.id >= 0 ? '$' : '%';
39657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   char r;
39757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   int col = TXT_DEFAULT;
39857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
39957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   switch (reg.file) {
40057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case FILE_GPR:
40157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      r = 'r'; col = TXT_GPR;
402322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller      if (reg.size == 2) {
403322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller         if (p == '$') {
404322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller            postFix = (idx & 1) ? "h" : "l";
405322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller            idx /= 2;
406322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller         } else {
407322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller            postFix = "s";
408322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller         }
409322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller      } else
410322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller      if (reg.size == 8) {
41157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         postFix = "d";
412322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller      } else
413322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller      if (reg.size == 16) {
41457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         postFix = "q";
415322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller      } else
416322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller      if (reg.size == 12) {
417e43a3a66a9d8a99021d76ff4d07dec7b8cfd62caChristoph Bumiller         postFix = "t";
418322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller      }
41957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      break;
42057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case FILE_PREDICATE:
42157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      r = 'p'; col = TXT_REGISTER;
42257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (reg.size == 2)
42357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         postFix = "d";
42457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      else
42557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (reg.size == 4)
42657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         postFix = "q";
42757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      break;
42857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case FILE_FLAGS:
42957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      r = 'c'; col = TXT_FLAGS;
43057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      break;
43157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case FILE_ADDRESS:
43257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      r = 'a'; col = TXT_REGISTER;
43357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      break;
43457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   default:
43557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      assert(!"invalid file for lvalue");
43657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      r = '?';
43757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      break;
43857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
43957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
44057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   PRINT("%s%c%c%i%s", colour[col], p, r, idx, postFix);
44157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
44257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return pos;
44357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
44457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
44557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerint ImmediateValue::print(char *buf, size_t size, DataType ty) const
44657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
44757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   size_t pos = 0;
44857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
44957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   PRINT("%s", colour[TXT_IMMD]);
45057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
45157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   switch (ty) {
45257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case TYPE_F32: PRINT("%f", reg.data.f32); break;
45357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case TYPE_F64: PRINT("%f", reg.data.f64); break;
45457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case TYPE_U8:  PRINT("0x%02x", reg.data.u8); break;
45557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case TYPE_S8:  PRINT("%i", reg.data.s8); break;
45657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case TYPE_U16: PRINT("0x%04x", reg.data.u16); break;
45757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case TYPE_S16: PRINT("%i", reg.data.s16); break;
45857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case TYPE_U32: PRINT("0x%08x", reg.data.u32); break;
45957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case TYPE_S32: PRINT("%i", reg.data.s32); break;
46057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case TYPE_U64:
46157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case TYPE_S64:
46257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   default:
463e838d91b94c3d1d20db62a61bfd9163f675d3139Mauro Rossi      PRINT("0x%016" PRIx64, reg.data.u64);
46457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      break;
46557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
46657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return pos;
46757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
46857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
46957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerint Symbol::print(char *buf, size_t size, DataType ty) const
47057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
47157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return print(buf, size, NULL, NULL, ty);
47257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
47357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
47457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerint Symbol::print(char *buf, size_t size,
47557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                  Value *rel, Value *dimRel, DataType ty) const
47657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
47757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   size_t pos = 0;
47857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   char c;
47957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
48057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (ty == TYPE_NONE)
48157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      ty = typeOfSize(reg.size);
48257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
48357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (reg.file == FILE_SYSTEM_VALUE) {
48457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("%ssv[%s%s:%i%s", colour[TXT_MEM],
48557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller            colour[TXT_REGISTER],
48657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller            SemanticStr[reg.data.sv.sv], reg.data.sv.index, colour[TXT_MEM]);
48757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (rel) {
48857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         PRINT("%s+", colour[TXT_DEFAULT]);
48957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         pos += rel->print(&buf[pos], size - pos);
49057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      }
49157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("%s]", colour[TXT_MEM]);
49257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      return pos;
49357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
49457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
49557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   switch (reg.file) {
49657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case FILE_MEMORY_CONST:  c = 'c'; break;
49757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case FILE_SHADER_INPUT:  c = 'a'; break;
49857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case FILE_SHADER_OUTPUT: c = 'o'; break;
49961d52a5fb9379eede3bf68b011f9477176341ee9Hans de Goede   case FILE_MEMORY_BUFFER: c = 'b'; break; // Only used before lowering
50057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case FILE_MEMORY_GLOBAL: c = 'g'; break;
50157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case FILE_MEMORY_SHARED: c = 's'; break;
50257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   case FILE_MEMORY_LOCAL:  c = 'l'; break;
50357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   default:
50457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      assert(!"invalid file");
50557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      c = '?';
50657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      break;
50757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
50857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
50957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (c == 'c')
51057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("%s%c%i[", colour[TXT_MEM], c, reg.fileIndex);
51157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   else
51257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("%s%c[", colour[TXT_MEM], c);
51357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
51457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (dimRel) {
51557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      pos += dimRel->print(&buf[pos], size - pos, TYPE_S32);
51657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("%s][", colour[TXT_MEM]);
51757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
51857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
51957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (rel) {
52057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      pos += rel->print(&buf[pos], size - pos);
52157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("%s%c", colour[TXT_DEFAULT], (reg.data.offset < 0) ? '-' : '+');
52257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   } else {
52357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      assert(reg.data.offset >= 0);
52457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
52557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   PRINT("%s0x%x%s]", colour[TXT_IMMD], abs(reg.data.offset), colour[TXT_MEM]);
52657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
52757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return pos;
52857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
52957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
53057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid Instruction::print() const
53157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
53257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   #define BUFSZ 512
53357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
53457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   const size_t size = BUFSZ;
53557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
53657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   char buf[BUFSZ];
53757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   int s, d;
53857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   size_t pos = 0;
53957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
54057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   PRINT("%s", colour[TXT_INSN]);
54157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
54257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (join)
54357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("join ");
54457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
54557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (predSrc >= 0) {
54657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      const size_t pre = pos;
54757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (getSrc(predSrc)->reg.file == FILE_PREDICATE) {
54857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         if (cc == CC_NOT_P)
54957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller            PRINT("not");
55057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      } else {
55157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         PRINT("%s", CondCodeStr[cc]);
55257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      }
553322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller      if (pos > pre)
55457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         SPACE();
5559362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller      pos += getSrc(predSrc)->print(&buf[pos], BUFSZ - pos);
55657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT(" %s", colour[TXT_INSN]);
55757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
55857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
55957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (saturate)
56057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("sat ");
56157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
56257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (asFlow()) {
56357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("%s", operationStr[op]);
564c893b9406060d3735b2c9e307ae89f6d83a4be40Christoph Bumiller      if (asFlow()->indirect)
565c893b9406060d3735b2c9e307ae89f6d83a4be40Christoph Bumiller         PRINT(" ind");
566c893b9406060d3735b2c9e307ae89f6d83a4be40Christoph Bumiller      if (asFlow()->absolute)
567c893b9406060d3735b2c9e307ae89f6d83a4be40Christoph Bumiller         PRINT(" abs");
56857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (op == OP_CALL && asFlow()->builtin) {
56957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         PRINT(" %sBUILTIN:%i", colour[TXT_BRA], asFlow()->target.builtin);
57057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      } else
57157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (op == OP_CALL && asFlow()->target.fn) {
57298116cc3dc3fc2cd84990cc2c968f05fe2978b4aFrancisco Jerez         PRINT(" %s%s:%i", colour[TXT_BRA],
57398116cc3dc3fc2cd84990cc2c968f05fe2978b4aFrancisco Jerez               asFlow()->target.fn->getName(),
57498116cc3dc3fc2cd84990cc2c968f05fe2978b4aFrancisco Jerez               asFlow()->target.fn->getLabel());
57557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      } else
57657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (asFlow()->target.bb)
57757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         PRINT(" %sBB:%i", colour[TXT_BRA], asFlow()->target.bb->getId());
57857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   } else {
57957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("%s ", operationStr[op]);
580a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller      if (op == OP_LINTERP || op == OP_PINTERP)
581a9f22b91e5b6f0d462de8a92e13d7c5af35dadc4Christoph Bumiller         PRINT("%s ", interpStr[ipa]);
58222b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller      switch (op) {
58322b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller      case OP_SUREDP:
5848489f20689c8d3d372c4143311cca23cd6a5fc58Samuel Pitoiset      case OP_SUREDB:
58522b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller      case OP_ATOM:
58647b390fe45e5e6f982c60b58985892438959cd8eJan Vesely         if (subOp < ARRAY_SIZE(atomSubOpStr))
58722b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller            PRINT("%s ", atomSubOpStr[subOp]);
58822b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller         break;
5890c930557bf96721ce50ca95b5201be09da905cb8Samuel Pitoiset      case OP_LOAD:
5900c930557bf96721ce50ca95b5201be09da905cb8Samuel Pitoiset      case OP_STORE:
59147b390fe45e5e6f982c60b58985892438959cd8eJan Vesely         if (subOp < ARRAY_SIZE(ldstSubOpStr))
5920c930557bf96721ce50ca95b5201be09da905cb8Samuel Pitoiset            PRINT("%s ", ldstSubOpStr[subOp]);
5930c930557bf96721ce50ca95b5201be09da905cb8Samuel Pitoiset         break;
594a734c0f8ba4a99e3ae42fe7ca9b1af16a01587b3Samuel Pitoiset      case OP_SUBFM:
59547b390fe45e5e6f982c60b58985892438959cd8eJan Vesely         if (subOp < ARRAY_SIZE(subfmOpStr))
596a734c0f8ba4a99e3ae42fe7ca9b1af16a01587b3Samuel Pitoiset            PRINT("%s ", subfmOpStr[subOp]);
597a734c0f8ba4a99e3ae42fe7ca9b1af16a01587b3Samuel Pitoiset         break;
598c0d92078bbce7c2d8f017bd7d9c86f339a751bdcSamuel Pitoiset      case OP_SHFL:
599c0d92078bbce7c2d8f017bd7d9c86f339a751bdcSamuel Pitoiset         if (subOp < ARRAY_SIZE(shflOpStr))
600c0d92078bbce7c2d8f017bd7d9c86f339a751bdcSamuel Pitoiset            PRINT("%s ", shflOpStr[subOp]);
601c0d92078bbce7c2d8f017bd7d9c86f339a751bdcSamuel Pitoiset         break;
602908ba1955434e10f7fc3579bc07f3bc46f4bff3fSamuel Pitoiset      case OP_PIXLD:
603908ba1955434e10f7fc3579bc07f3bc46f4bff3fSamuel Pitoiset         if (subOp < ARRAY_SIZE(pixldOpStr))
604908ba1955434e10f7fc3579bc07f3bc46f4bff3fSamuel Pitoiset            PRINT("%s ", pixldOpStr[subOp]);
605908ba1955434e10f7fc3579bc07f3bc46f4bff3fSamuel Pitoiset         break;
606a6d3b2e176ce60852710b769f35b5dbcd4416b20Samuel Pitoiset      case OP_RCP:
607a6d3b2e176ce60852710b769f35b5dbcd4416b20Samuel Pitoiset      case OP_RSQ:
608a6d3b2e176ce60852710b769f35b5dbcd4416b20Samuel Pitoiset         if (subOp < ARRAY_SIZE(rcprsqOpStr))
609a6d3b2e176ce60852710b769f35b5dbcd4416b20Samuel Pitoiset            PRINT("%s ", rcprsqOpStr[subOp]);
610a6d3b2e176ce60852710b769f35b5dbcd4416b20Samuel Pitoiset         break;
611fa10d1d67472cd2e821c5aa196590d43896a78fbSamuel Pitoiset      case OP_EMIT:
612fa10d1d67472cd2e821c5aa196590d43896a78fbSamuel Pitoiset         if (subOp < ARRAY_SIZE(emitOpStr))
613fa10d1d67472cd2e821c5aa196590d43896a78fbSamuel Pitoiset            PRINT("%s ", emitOpStr[subOp]);
614fa10d1d67472cd2e821c5aa196590d43896a78fbSamuel Pitoiset         break;
61503dc87caab25b5c33314ac9ef673fea92c78938eSamuel Pitoiset      case OP_CCTL:
61603dc87caab25b5c33314ac9ef673fea92c78938eSamuel Pitoiset         if (subOp < ARRAY_SIZE(cctlOpStr))
61703dc87caab25b5c33314ac9ef673fea92c78938eSamuel Pitoiset            PRINT("%s ", cctlOpStr[subOp]);
61803dc87caab25b5c33314ac9ef673fea92c78938eSamuel Pitoiset         break;
619d588e4f1925c5a2fc3efbf9ab192f0f6494be57bSamuel Pitoiset      case OP_BAR:
620d588e4f1925c5a2fc3efbf9ab192f0f6494be57bSamuel Pitoiset         if (subOp < ARRAY_SIZE(barOpStr))
621d588e4f1925c5a2fc3efbf9ab192f0f6494be57bSamuel Pitoiset            PRINT("%s ", barOpStr[subOp]);
622d588e4f1925c5a2fc3efbf9ab192f0f6494be57bSamuel Pitoiset         break;
62322b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller      default:
62422b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller         if (subOp)
62522b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller            PRINT("(SUBOP:%u) ", subOp);
62622b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller         break;
62722b762f9b495b14400f30bd6537f7c5a6d262325Christoph Bumiller      }
62857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (perPatch)
62957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         PRINT("patch ");
63057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (asTex())
631c2dfcd7f0eaf4eda375eb320e0e87793a80ef92dChristoph Bumiller         PRINT("%s %s$r%u $s%u %s", asTex()->tex.target.getName(),
632c2dfcd7f0eaf4eda375eb320e0e87793a80ef92dChristoph Bumiller               colour[TXT_MEM], asTex()->tex.r, asTex()->tex.s,
633c2dfcd7f0eaf4eda375eb320e0e87793a80ef92dChristoph Bumiller               colour[TXT_INSN]);
63457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (postFactor)
63557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         PRINT("x2^%i ", postFactor);
63657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT("%s%s", dnz ? "dnz " : (ftz ? "ftz " : ""),  DataTypeStr[dType]);
63757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
63857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
63957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (rnd != ROUND_N)
64057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT(" %s", RoundModeStr[rnd]);
64157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
6428cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez   if (defExists(1))
64357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT(" {");
64457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   for (d = 0; defExists(d); ++d) {
64557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      SPACE();
6469362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller      pos += getDef(d)->print(&buf[pos], size - pos);
64757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
64857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (d > 1)
64957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT(" %s}", colour[TXT_INSN]);
65057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   else
65157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (!d && !asFlow())
65257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT(" %s#", colour[TXT_INSN]);
65357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
65457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (asCmp())
65557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT(" %s%s", colour[TXT_INSN], CondCodeStr[asCmp()->setCond]);
65657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
65757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (sType != dType)
65857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      PRINT(" %s%s", colour[TXT_INSN], DataTypeStr[sType]);
65957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
66057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   for (s = 0; srcExists(s); ++s) {
6619362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller      if (s == predSrc || src(s).usedAsPtr)
66257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         continue;
66357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      const size_t pre = pos;
66457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      SPACE();
6659362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller      pos += src(s).mod.print(&buf[pos], BUFSZ - pos);
66657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (pos > pre + 1)
66757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         SPACE();
6689362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller      if (src(s).isIndirect(0) || src(s).isIndirect(1))
6699362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller         pos += getSrc(s)->asSym()->print(&buf[pos], BUFSZ - pos,
6709362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller                                          getIndirect(s, 0),
6719362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller                                          getIndirect(s, 1));
67257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      else
6739362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller         pos += getSrc(s)->print(&buf[pos], BUFSZ - pos, sType);
67457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
675322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller   if (exit)
676322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller      PRINT("%s exit", colour[TXT_INSN]);
67757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
67857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   PRINT("%s", colour[TXT_DEFAULT]);
67957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
68057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   buf[MIN2(pos, BUFSZ - 1)] = 0;
68157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
68257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   INFO("%s (%u)\n", buf, encSize);
68357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
68457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
68557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass PrintPass : public Pass
68657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
68757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic:
68857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   PrintPass() : serial(0) { }
68957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
69057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   virtual bool visit(Function *);
69157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   virtual bool visit(BasicBlock *);
69257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   virtual bool visit(Instruction *);
69357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
69457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate:
69557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   int serial;
69657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller};
69757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
69857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool
69957594065c30feec9376be9b2132659f7d87362eeChristoph BumillerPrintPass::visit(Function *fn)
70057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
701d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller   char str[16];
702d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller
703d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller   INFO("\n%s:%i (", fn->getName(), fn->getLabel());
704d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller
705d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller   if (!fn->outs.empty())
706d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller      INFO("out");
707d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller   for (std::deque<ValueRef>::iterator it = fn->outs.begin();
708d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller        it != fn->outs.end();
709d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller        ++it) {
710d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller      it->get()->print(str, sizeof(str), typeOfSize(it->get()->reg.size));
711d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller      INFO(" %s", str);
712d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller   }
713d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller
714d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller   if (!fn->ins.empty())
715d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller      INFO("%s%sin", colour[TXT_DEFAULT], fn->outs.empty() ? "" : ", ");
716d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller   for (std::deque<ValueDef>::iterator it = fn->ins.begin();
717d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller        it != fn->ins.end();
718d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller        ++it) {
719d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller      it->get()->print(str, sizeof(str), typeOfSize(it->get()->reg.size));
720d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller      INFO(" %s", str);
721d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller   }
722d39169cb6dd25f92e62254aa3920c2add2b3ca25Christoph Bumiller   INFO("%s)\n", colour[TXT_DEFAULT]);
72357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
72457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return true;
72557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
72657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
72757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool
72857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerPrintPass::visit(BasicBlock *bb)
72957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
73057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#if 0
73157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   INFO("---\n");
73257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   for (Graph::EdgeIterator ei = bb->cfg.incident(); !ei.end(); ei.next())
73357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      INFO(" <- BB:%i (%s)\n",
73457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller           BasicBlock::get(ei.getNode())->getId(),
73557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller           ei.getEdge()->typeStr());
73657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#endif
73757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   INFO("BB:%i (%u instructions) - ", bb->getId(), bb->getInsnCount());
73857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
73957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (bb->idom())
74057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      INFO("idom = BB:%i, ", bb->idom()->getId());
74157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
74257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   INFO("df = { ");
74357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   for (DLList::Iterator df = bb->getDF().iterator(); !df.end(); df.next())
74457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      INFO("BB:%i ", BasicBlock::get(df)->getId());
74557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
74657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   INFO("}\n");
74757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
74857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   for (Graph::EdgeIterator ei = bb->cfg.outgoing(); !ei.end(); ei.next())
74957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      INFO(" -> BB:%i (%s)\n",
75057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller           BasicBlock::get(ei.getNode())->getId(),
75157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller           ei.getEdge()->typeStr());
75257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
75357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return true;
75457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
75557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
75657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool
75757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerPrintPass::visit(Instruction *insn)
75857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
75957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   INFO("%3i: ", serial++);
76057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   insn->print();
76157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return true;
76257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
76357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
76457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid
76557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerFunction::print()
76657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
76757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   PrintPass pass;
76857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   pass.run(this, true, false);
76957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
77057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
77157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid
77257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerProgram::print()
77357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
77457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   PrintPass pass;
77596259b51285469a229c3740c2b467d4455ed0c8dMarcin Ślusarz   init_colours();
77657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   pass.run(this, true, false);
77757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
77857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
77957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid
78057594065c30feec9376be9b2132659f7d87362eeChristoph BumillerFunction::printLiveIntervals() const
78157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
78257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   INFO("printing live intervals ...\n");
78357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
78457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   for (ArrayList::Iterator it = allLValues.iterator(); !it.end(); it.next()) {
78557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      const Value *lval = Value::get(it)->asLValue();
78657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (lval && !lval->livei.isEmpty()) {
78757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         INFO("livei(%%%i): ", lval->id);
78857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         lval->livei.print();
78957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      }
79057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
79157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
79257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
79357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} // namespace nv50_ir
794