1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2011 Christoph Bumiller 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software. 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir.h" 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir_target.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace nv50_ir { 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum TextStyle 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TXT_DEFAULT, 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TXT_GPR, 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TXT_REGISTER, 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TXT_FLAGS, 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TXT_MEM, 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TXT_IMMD, 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TXT_BRA, 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TXT_INSN 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *_colour[8] = 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\x1b[00m", 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\x1b[34m", 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\x1b[35m", 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\x1b[35m", 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\x1b[36m", 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\x1b[33m", 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\x1b[37m", 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\x1b[32m" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *_nocolour[8] = 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "", "", "", "", "", "", "", "" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char **colour; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init_colours() 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (getenv("NV50_PROG_DEBUG_NO_COLORS") != NULL) 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colour = _nocolour; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colour = _colour; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *OpClassStr[OPCLASS_OTHER + 1] = 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "MOVE", 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "LOAD", 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "STORE", 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "ARITH", 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "SHIFT", 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "SFU", 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "LOGIC", 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "COMPARE", 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "CONVERT", 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "ATOMIC", 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "TEXTURE", 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "SURFACE", 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "FLOW", 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "(INVALID)", 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "PSEUDO", 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "OTHER" 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst char *operationStr[OP_LAST + 1] = 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "nop", 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "phi", 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "union", 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "split", 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "merge", 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "consec", 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "mov", 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "ld", 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "st", 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "add", 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "sub", 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "mul", 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "div", 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "mod", 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "mad", 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "fma", 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "sad", 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "abs", 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "neg", 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "not", 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "and", 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "or", 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "xor", 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "shl", 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "shr", 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "max", 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "min", 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "sat", 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "ceil", 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "floor", 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "trunc", 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "cvt", 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "set and", 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "set or", 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "set xor", 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "set", 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "selp", 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "slct", 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "rcp", 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "rsq", 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "lg2", 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "sin", 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "cos", 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "ex2", 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "exp", 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "log", 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "presin", 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "preex2", 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "sqrt", 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "pow", 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "bra", 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "call", 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "ret", 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "cont", 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "break", 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "preret", 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "precont", 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "prebreak", 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "brkpt", 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "joinat", 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "join", 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "discard", 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "exit", 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "barrier", 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "vfetch", 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "pfetch", 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "export", 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "linterp", 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "pinterp", 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "emit", 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "restart", 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "tex", 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "texbias", 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "texlod", 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "texfetch", 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "texquery", 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "texgrad", 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "texgather", 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "texcsaa", 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "suld", 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "sust", 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "dfdx", 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "dfdy", 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "rdsv", 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "wrsv", 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "pixld", 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "quadop", 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "quadon", 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "quadpop", 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "popcnt", 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "insbf", 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "extbf", 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "texbar", 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "(invalid)" 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *DataTypeStr[] = 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "-", 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "u8", "s8", 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "u16", "s16", 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "u32", "s32", 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "u64", "s64", 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "f16", "f32", "f64", 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "b96", "b128" 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *RoundModeStr[] = 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "", "rm", "rz", "rp", "rni", "rmi", "rzi", "rpi" 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *CondCodeStr[] = 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "never", 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "lt", 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "eq", 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "le", 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "gt", 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "ne", 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "ge", 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "", 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "(invalid)", 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "ltu", 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "equ", 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "leu", 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "gtu", 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "neu", 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "geu", 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "", 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "no", 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "nc", 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "ns", 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "na", 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "a", 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "s", 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "c", 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "o" 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *SemanticStr[SV_LAST + 1] = 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "POSITION", 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "VERTEX_ID", 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "INSTANCE_ID", 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "INVOCATION_ID", 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "PRIMITIVE_ID", 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "VERTEX_COUNT", 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "LAYER", 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "VIEWPORT_INDEX", 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Y_DIR", 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "FACE", 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "POINT_SIZE", 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "POINT_COORD", 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "CLIP_DISTANCE", 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "SAMPLE_INDEX", 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "TESS_FACTOR", 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "TESS_COORD", 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "TID", 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "CTAID", 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "NTID", 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "GRIDID", 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "NCTAID", 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "LANEID", 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "PHYSID", 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "NPHYSID", 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "CLOCK", 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "LBASE", 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "SBASE", 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "?", 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "(INVALID)" 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *interpStr[16] = 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "pass", 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "mul", 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "flat", 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "sc", 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "cent pass", 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "cent mul", 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "cent flat", 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "cent sc", 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "off pass", 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "off mul", 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "off flat", 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "off sc", 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "samp pass", 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "samp mul", 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "samp flat", 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "samp sc" 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PRINT(args...) \ 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos += snprintf(&buf[pos], size - pos, args); \ 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while(0) 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SPACE_PRINT(cond, args...) \ 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cond) \ 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf[pos++] = ' '; \ 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos += snprintf(&buf[pos], size - pos, args); \ 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while(0) 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SPACE() \ 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pos < size) \ 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf[pos++] = ' '; \ 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while(0) 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint Modifier::print(char *buf, size_t size) const 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_t pos = 0; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bits) 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s", colour[TXT_INSN]); 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_t base = pos; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bits & NV50_IR_MOD_NOT) 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("not"); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bits & NV50_IR_MOD_SAT) 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SPACE_PRINT(pos > base && pos < size, "sat"); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bits & NV50_IR_MOD_NEG) 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SPACE_PRINT(pos > base && pos < size, "neg"); 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bits & NV50_IR_MOD_ABS) 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SPACE_PRINT(pos > base && pos < size, "abs"); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pos; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint LValue::print(char *buf, size_t size, DataType ty) const 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *postFix = ""; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_t pos = 0; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int idx = join->reg.data.id >= 0 ? join->reg.data.id : id; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char p = join->reg.data.id >= 0 ? '$' : '%'; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char r; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int col = TXT_DEFAULT; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (reg.file) { 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_GPR: 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = 'r'; col = TXT_GPR; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.size == 2) { 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p == '$') { 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org postFix = (idx & 1) ? "h" : "l"; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org idx /= 2; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org postFix = "s"; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.size == 8) { 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org postFix = "d"; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.size == 16) { 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org postFix = "q"; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.size == 12) { 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org postFix = "t"; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_PREDICATE: 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = 'p'; col = TXT_REGISTER; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.size == 2) 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org postFix = "d"; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.size == 4) 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org postFix = "q"; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_FLAGS: 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = 'c'; col = TXT_FLAGS; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_ADDRESS: 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = 'a'; col = TXT_REGISTER; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid file for lvalue"); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = '?'; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s%c%c%i%s", colour[col], p, r, idx, postFix); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pos; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint ImmediateValue::print(char *buf, size_t size, DataType ty) const 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_t pos = 0; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s", colour[TXT_IMMD]); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ty) { 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: PRINT("%f", reg.data.f32); break; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F64: PRINT("%f", reg.data.f64); break; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U8: PRINT("0x%02x", reg.data.u8); break; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S8: PRINT("%i", reg.data.s8); break; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: PRINT("0x%04x", reg.data.u16); break; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: PRINT("%i", reg.data.s16); break; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: PRINT("0x%08x", reg.data.u32); break; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: PRINT("%i", reg.data.s32); break; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U64: 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S64: 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("0x%016lx", reg.data.u64); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pos; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint Symbol::print(char *buf, size_t size, DataType ty) const 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return print(buf, size, NULL, NULL, ty); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint Symbol::print(char *buf, size_t size, 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *rel, Value *dimRel, DataType ty) const 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_t pos = 0; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char c; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ty == TYPE_NONE) 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ty = typeOfSize(reg.size); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.file == FILE_SYSTEM_VALUE) { 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%ssv[%s%s:%i%s", colour[TXT_MEM], 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colour[TXT_REGISTER], 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SemanticStr[reg.data.sv.sv], reg.data.sv.index, colour[TXT_MEM]); 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rel) { 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s+", colour[TXT_DEFAULT]); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos += rel->print(&buf[pos], size - pos); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s]", colour[TXT_MEM]); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pos; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (reg.file) { 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_CONST: c = 'c'; break; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_SHADER_INPUT: c = 'a'; break; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_SHADER_OUTPUT: c = 'o'; break; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_GLOBAL: c = 'g'; break; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_SHARED: c = 's'; break; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_LOCAL: c = 'l'; break; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid file"); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = '?'; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c == 'c') 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s%c%i[", colour[TXT_MEM], c, reg.fileIndex); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s%c[", colour[TXT_MEM], c); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dimRel) { 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos += dimRel->print(&buf[pos], size - pos, TYPE_S32); 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s][", colour[TXT_MEM]); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rel) { 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos += rel->print(&buf[pos], size - pos); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s%c", colour[TXT_DEFAULT], (reg.data.offset < 0) ? '-' : '+'); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.data.offset >= 0); 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s0x%x%s]", colour[TXT_IMMD], abs(reg.data.offset), colour[TXT_MEM]); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pos; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid Instruction::print() const 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org #define BUFSZ 512 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const size_t size = BUFSZ; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char buf[BUFSZ]; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int s, d; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_t pos = 0; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s", colour[TXT_INSN]); 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (join) 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("join "); 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (predSrc >= 0) { 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const size_t pre = pos; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (getSrc(predSrc)->reg.file == FILE_PREDICATE) { 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cc == CC_NOT_P) 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("not"); 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s", CondCodeStr[cc]); 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pos > pre) 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SPACE(); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos += getSrc(predSrc)->print(&buf[pos], BUFSZ - pos); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT(" %s", colour[TXT_INSN]); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (saturate) 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("sat "); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (asFlow()) { 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s", operationStr[op]); 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (op == OP_CALL && asFlow()->builtin) { 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT(" %sBUILTIN:%i", colour[TXT_BRA], asFlow()->target.builtin); 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (op == OP_CALL && asFlow()->target.fn) { 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT(" %s%s:%i", colour[TXT_BRA], 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org asFlow()->target.fn->getName(), 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org asFlow()->target.fn->getLabel()); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (asFlow()->target.bb) 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT(" %sBB:%i", colour[TXT_BRA], asFlow()->target.bb->getId()); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s ", operationStr[op]); 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (op == OP_LINTERP || op == OP_PINTERP) 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s ", interpStr[ipa]); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (subOp) 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("(SUBOP:%u) ", subOp); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (perPatch) 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("patch "); 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (asTex()) 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s ", asTex()->tex.target.getName()); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (postFactor) 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("x2^%i ", postFactor); 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s%s", dnz ? "dnz " : (ftz ? "ftz " : ""), DataTypeStr[dType]); 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rnd != ROUND_N) 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT(" %s", RoundModeStr[rnd]); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (defExists(1)) 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT(" {"); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (d = 0; defExists(d); ++d) { 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SPACE(); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos += getDef(d)->print(&buf[pos], size - pos); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (d > 1) 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT(" %s}", colour[TXT_INSN]); 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!d && !asFlow()) 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT(" %s#", colour[TXT_INSN]); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (asCmp()) 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT(" %s%s", colour[TXT_INSN], CondCodeStr[asCmp()->setCond]); 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sType != dType) 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT(" %s%s", colour[TXT_INSN], DataTypeStr[sType]); 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (s = 0; srcExists(s); ++s) { 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s == predSrc || src(s).usedAsPtr) 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const size_t pre = pos; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SPACE(); 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos += src(s).mod.print(&buf[pos], BUFSZ - pos); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pos > pre + 1) 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SPACE(); 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src(s).isIndirect(0) || src(s).isIndirect(1)) 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos += getSrc(s)->asSym()->print(&buf[pos], BUFSZ - pos, 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org getIndirect(s, 0), 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org getIndirect(s, 1)); 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos += getSrc(s)->print(&buf[pos], BUFSZ - pos, sType); 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (exit) 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s exit", colour[TXT_INSN]); 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRINT("%s", colour[TXT_DEFAULT]); 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf[MIN2(pos, BUFSZ - 1)] = 0; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("%s (%u)\n", buf, encSize); 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass PrintPass : public Pass 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PrintPass() : serial(0) { } 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual bool visit(Function *); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual bool visit(BasicBlock *); 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual bool visit(Instruction *); 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int serial; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPrintPass::visit(Function *fn) 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("\n%s:%i\n", fn->getName(), fn->getLabel()); 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPrintPass::visit(BasicBlock *bb) 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("---\n"); 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (Graph::EdgeIterator ei = bb->cfg.incident(); !ei.end(); ei.next()) 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO(" <- BB:%i (%s)\n", 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock::get(ei.getNode())->getId(), 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ei.getEdge()->typeStr()); 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("BB:%i (%u instructions) - ", bb->getId(), bb->getInsnCount()); 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bb->idom()) 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("idom = BB:%i, ", bb->idom()->getId()); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("df = { "); 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (DLList::Iterator df = bb->getDF().iterator(); !df.end(); df.next()) 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("BB:%i ", BasicBlock::get(df)->getId()); 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("}\n"); 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (Graph::EdgeIterator ei = bb->cfg.outgoing(); !ei.end(); ei.next()) 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO(" -> BB:%i (%s)\n", 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock::get(ei.getNode())->getId(), 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ei.getEdge()->typeStr()); 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPrintPass::visit(Instruction *insn) 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("%3i: ", serial++); 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->print(); 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFunction::print() 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PrintPass pass; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pass.run(this, true, false); 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgProgram::print() 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PrintPass pass; 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_colours(); 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pass.run(this, true, false); 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFunction::printLiveIntervals() const 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("printing live intervals ...\n"); 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (ArrayList::Iterator it = allLValues.iterator(); !it.end(); it.next()) { 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const Value *lval = Value::get(it)->asLValue(); 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (lval && !lval->livei.isEmpty()) { 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("livei(%%%i): ", lval->id); 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lval->livei.print(); 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // namespace nv50_ir 653