Path: blob/21.2-virgl/src/broadcom/compiler/vir_dump.c
4564 views
/*1* Copyright © 2016-2017 Broadcom2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS20* IN THE SOFTWARE.21*/2223#include "broadcom/common/v3d_device_info.h"24#include "v3d_compiler.h"2526/* Prints a human-readable description of the uniform reference. */27void28vir_dump_uniform(enum quniform_contents contents,29uint32_t data)30{31static const char *quniform_names[] = {32[QUNIFORM_LINE_WIDTH] = "line_width",33[QUNIFORM_AA_LINE_WIDTH] = "aa_line_width",34[QUNIFORM_VIEWPORT_X_SCALE] = "vp_x_scale",35[QUNIFORM_VIEWPORT_Y_SCALE] = "vp_y_scale",36[QUNIFORM_VIEWPORT_Z_OFFSET] = "vp_z_offset",37[QUNIFORM_VIEWPORT_Z_SCALE] = "vp_z_scale",38[QUNIFORM_SHARED_OFFSET] = "shared_offset",39};4041switch (contents) {42case QUNIFORM_CONSTANT:43fprintf(stderr, "0x%08x / %f", data, uif(data));44break;4546case QUNIFORM_UNIFORM:47fprintf(stderr, "push[%d]", data);48break;4950case QUNIFORM_TEXTURE_CONFIG_P1:51fprintf(stderr, "tex[%d].p1", data);52break;5354case QUNIFORM_TMU_CONFIG_P0:55fprintf(stderr, "tex[%d].p0 | 0x%x",56v3d_unit_data_get_unit(data),57v3d_unit_data_get_offset(data));58break;5960case QUNIFORM_TMU_CONFIG_P1:61fprintf(stderr, "tex[%d].p1 | 0x%x",62v3d_unit_data_get_unit(data),63v3d_unit_data_get_offset(data));64break;6566case QUNIFORM_IMAGE_TMU_CONFIG_P0:67fprintf(stderr, "img[%d].p0 | 0x%x",68v3d_unit_data_get_unit(data),69v3d_unit_data_get_offset(data));70break;7172case QUNIFORM_TEXTURE_WIDTH:73fprintf(stderr, "tex[%d].width", data);74break;75case QUNIFORM_TEXTURE_HEIGHT:76fprintf(stderr, "tex[%d].height", data);77break;78case QUNIFORM_TEXTURE_DEPTH:79fprintf(stderr, "tex[%d].depth", data);80break;81case QUNIFORM_TEXTURE_ARRAY_SIZE:82fprintf(stderr, "tex[%d].array_size", data);83break;84case QUNIFORM_TEXTURE_LEVELS:85fprintf(stderr, "tex[%d].levels", data);86break;8788case QUNIFORM_IMAGE_WIDTH:89fprintf(stderr, "img[%d].width", data);90break;91case QUNIFORM_IMAGE_HEIGHT:92fprintf(stderr, "img[%d].height", data);93break;94case QUNIFORM_IMAGE_DEPTH:95fprintf(stderr, "img[%d].depth", data);96break;97case QUNIFORM_IMAGE_ARRAY_SIZE:98fprintf(stderr, "img[%d].array_size", data);99break;100101case QUNIFORM_SPILL_OFFSET:102fprintf(stderr, "spill_offset");103break;104105case QUNIFORM_SPILL_SIZE_PER_THREAD:106fprintf(stderr, "spill_size_per_thread");107break;108109case QUNIFORM_UBO_ADDR:110fprintf(stderr, "ubo[%d]+0x%x",111v3d_unit_data_get_unit(data),112v3d_unit_data_get_offset(data));113break;114115case QUNIFORM_SSBO_OFFSET:116fprintf(stderr, "ssbo[%d]", data);117break;118119case QUNIFORM_GET_SSBO_SIZE:120fprintf(stderr, "ssbo_size[%d]", data);121break;122123case QUNIFORM_GET_UBO_SIZE:124fprintf(stderr, "ubo_size[%d]", data);125break;126127case QUNIFORM_NUM_WORK_GROUPS:128fprintf(stderr, "num_wg.%c", data < 3 ? "xyz"[data] : '?');129break;130131default:132if (quniform_contents_is_texture_p0(contents)) {133fprintf(stderr, "tex[%d].p0: 0x%08x",134contents - QUNIFORM_TEXTURE_CONFIG_P0_0,135data);136} else if (contents < ARRAY_SIZE(quniform_names) &&137quniform_names[contents]) {138fprintf(stderr, "%s",139quniform_names[contents]);140} else {141fprintf(stderr, "%d / 0x%08x", contents, data);142}143}144}145146static void147vir_print_reg(struct v3d_compile *c, const struct qinst *inst,148struct qreg reg)149{150switch (reg.file) {151152case QFILE_NULL:153fprintf(stderr, "null");154break;155156case QFILE_LOAD_IMM:157fprintf(stderr, "0x%08x (%f)", reg.index, uif(reg.index));158break;159160case QFILE_REG:161fprintf(stderr, "rf%d", reg.index);162break;163164case QFILE_MAGIC:165fprintf(stderr, "%s",166v3d_qpu_magic_waddr_name(c->devinfo, reg.index));167break;168169case QFILE_SMALL_IMM: {170uint32_t unpacked;171bool ok = v3d_qpu_small_imm_unpack(c->devinfo,172inst->qpu.raddr_b,173&unpacked);174assert(ok); (void) ok;175176int8_t *p = (int8_t *)&inst->qpu.raddr_b;177if (*p >= -16 && *p <= 15)178fprintf(stderr, "%d", unpacked);179else180fprintf(stderr, "%f", uif(unpacked));181break;182}183184case QFILE_VPM:185fprintf(stderr, "vpm%d.%d",186reg.index / 4, reg.index % 4);187break;188189case QFILE_TEMP:190fprintf(stderr, "t%d", reg.index);191break;192}193}194195static void196vir_dump_sig_addr(const struct v3d_device_info *devinfo,197const struct v3d_qpu_instr *instr)198{199if (devinfo->ver < 41)200return;201202if (!instr->sig_magic)203fprintf(stderr, ".rf%d", instr->sig_addr);204else {205const char *name =206v3d_qpu_magic_waddr_name(devinfo, instr->sig_addr);207if (name)208fprintf(stderr, ".%s", name);209else210fprintf(stderr, ".UNKNOWN%d", instr->sig_addr);211}212}213214static void215vir_dump_sig(struct v3d_compile *c, struct qinst *inst)216{217struct v3d_qpu_sig *sig = &inst->qpu.sig;218219if (sig->thrsw)220fprintf(stderr, "; thrsw");221if (sig->ldvary) {222fprintf(stderr, "; ldvary");223vir_dump_sig_addr(c->devinfo, &inst->qpu);224}225if (sig->ldvpm)226fprintf(stderr, "; ldvpm");227if (sig->ldtmu) {228fprintf(stderr, "; ldtmu");229vir_dump_sig_addr(c->devinfo, &inst->qpu);230}231if (sig->ldtlb) {232fprintf(stderr, "; ldtlb");233vir_dump_sig_addr(c->devinfo, &inst->qpu);234}235if (sig->ldtlbu) {236fprintf(stderr, "; ldtlbu");237vir_dump_sig_addr(c->devinfo, &inst->qpu);238}239if (sig->ldunif)240fprintf(stderr, "; ldunif");241if (sig->ldunifrf) {242fprintf(stderr, "; ldunifrf");243vir_dump_sig_addr(c->devinfo, &inst->qpu);244}245if (sig->ldunifa)246fprintf(stderr, "; ldunifa");247if (sig->ldunifarf) {248fprintf(stderr, "; ldunifarf");249vir_dump_sig_addr(c->devinfo, &inst->qpu);250}251if (sig->wrtmuc)252fprintf(stderr, "; wrtmuc");253}254255static void256vir_dump_alu(struct v3d_compile *c, struct qinst *inst)257{258struct v3d_qpu_instr *instr = &inst->qpu;259int nsrc = vir_get_nsrc(inst);260enum v3d_qpu_input_unpack unpack[2];261262if (inst->qpu.alu.add.op != V3D_QPU_A_NOP) {263fprintf(stderr, "%s", v3d_qpu_add_op_name(instr->alu.add.op));264fprintf(stderr, "%s", v3d_qpu_cond_name(instr->flags.ac));265fprintf(stderr, "%s", v3d_qpu_pf_name(instr->flags.apf));266fprintf(stderr, "%s", v3d_qpu_uf_name(instr->flags.auf));267fprintf(stderr, " ");268269vir_print_reg(c, inst, inst->dst);270fprintf(stderr, "%s", v3d_qpu_pack_name(instr->alu.add.output_pack));271272unpack[0] = instr->alu.add.a_unpack;273unpack[1] = instr->alu.add.b_unpack;274} else {275fprintf(stderr, "%s", v3d_qpu_mul_op_name(instr->alu.mul.op));276fprintf(stderr, "%s", v3d_qpu_cond_name(instr->flags.mc));277fprintf(stderr, "%s", v3d_qpu_pf_name(instr->flags.mpf));278fprintf(stderr, "%s", v3d_qpu_uf_name(instr->flags.muf));279fprintf(stderr, " ");280281vir_print_reg(c, inst, inst->dst);282fprintf(stderr, "%s", v3d_qpu_pack_name(instr->alu.mul.output_pack));283284unpack[0] = instr->alu.mul.a_unpack;285unpack[1] = instr->alu.mul.b_unpack;286}287288for (int i = 0; i < nsrc; i++) {289fprintf(stderr, ", ");290vir_print_reg(c, inst, inst->src[i]);291fprintf(stderr, "%s", v3d_qpu_unpack_name(unpack[i]));292}293294vir_dump_sig(c, inst);295}296297void298vir_dump_inst(struct v3d_compile *c, struct qinst *inst)299{300struct v3d_qpu_instr *instr = &inst->qpu;301302switch (inst->qpu.type) {303case V3D_QPU_INSTR_TYPE_ALU:304vir_dump_alu(c, inst);305break;306case V3D_QPU_INSTR_TYPE_BRANCH:307fprintf(stderr, "b");308if (instr->branch.ub)309fprintf(stderr, "u");310311fprintf(stderr, "%s",312v3d_qpu_branch_cond_name(instr->branch.cond));313fprintf(stderr, "%s", v3d_qpu_msfign_name(instr->branch.msfign));314315switch (instr->branch.bdi) {316case V3D_QPU_BRANCH_DEST_ABS:317fprintf(stderr, " zero_addr+0x%08x", instr->branch.offset);318break;319320case V3D_QPU_BRANCH_DEST_REL:321fprintf(stderr, " %d", instr->branch.offset);322break;323324case V3D_QPU_BRANCH_DEST_LINK_REG:325fprintf(stderr, " lri");326break;327328case V3D_QPU_BRANCH_DEST_REGFILE:329fprintf(stderr, " rf%d", instr->branch.raddr_a);330break;331}332333if (instr->branch.ub) {334switch (instr->branch.bdu) {335case V3D_QPU_BRANCH_DEST_ABS:336fprintf(stderr, ", a:unif");337break;338339case V3D_QPU_BRANCH_DEST_REL:340fprintf(stderr, ", r:unif");341break;342343case V3D_QPU_BRANCH_DEST_LINK_REG:344fprintf(stderr, ", lri");345break;346347case V3D_QPU_BRANCH_DEST_REGFILE:348fprintf(stderr, ", rf%d", instr->branch.raddr_a);349break;350}351}352break;353}354355if (vir_has_uniform(inst)) {356fprintf(stderr, " (");357vir_dump_uniform(c->uniform_contents[inst->uniform],358c->uniform_data[inst->uniform]);359fprintf(stderr, ")");360}361}362363void364vir_dump(struct v3d_compile *c)365{366int ip = 0;367int pressure = 0;368369vir_for_each_block(block, c) {370fprintf(stderr, "BLOCK %d:\n", block->index);371vir_for_each_inst(inst, block) {372if (c->live_intervals_valid) {373for (int i = 0; i < c->num_temps; i++) {374if (c->temp_start[i] == ip)375pressure++;376}377378fprintf(stderr, "P%4d ", pressure);379380bool first = true;381382for (int i = 0; i < c->num_temps; i++) {383if (c->temp_start[i] != ip)384continue;385386if (first) {387first = false;388} else {389fprintf(stderr, ", ");390}391if (BITSET_TEST(c->spillable, i))392fprintf(stderr, "S%4d", i);393else394fprintf(stderr, "U%4d", i);395}396397if (first)398fprintf(stderr, " ");399else400fprintf(stderr, " ");401}402403if (c->live_intervals_valid) {404bool first = true;405406for (int i = 0; i < c->num_temps; i++) {407if (c->temp_end[i] != ip)408continue;409410if (first) {411first = false;412} else {413fprintf(stderr, ", ");414}415fprintf(stderr, "E%4d", i);416pressure--;417}418419if (first)420fprintf(stderr, " ");421else422fprintf(stderr, " ");423}424425vir_dump_inst(c, inst);426fprintf(stderr, "\n");427ip++;428}429if (block->successors[1]) {430fprintf(stderr, "-> BLOCK %d, %d\n",431block->successors[0]->index,432block->successors[1]->index);433} else if (block->successors[0]) {434fprintf(stderr, "-> BLOCK %d\n",435block->successors[0]->index);436}437}438}439440441