12855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* 22855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Copyright (c) 2013 Rob Clark <robdclark@gmail.com> 32855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * 42855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Permission is hereby granted, free of charge, to any person obtaining a 52855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * copy of this software and associated documentation files (the "Software"), 62855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * to deal in the Software without restriction, including without limitation 72855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * the rights to use, copy, modify, merge, publish, distribute, sublicense, 82855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * and/or sell copies of the Software, and to permit persons to whom the 92855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Software is furnished to do so, subject to the following conditions: 102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * 112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * The above copyright notice and this permission notice (including the next 122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * paragraph) shall be included in all copies or substantial portions of the 132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Software. 142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * 152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * SOFTWARE. 222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark */ 232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <stdio.h> 252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <stdlib.h> 262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <stdint.h> 272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <string.h> 282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <assert.h> 292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <util/u_debug.h> 312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include "disasm.h" 332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include "instr-a3xx.h" 342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic enum debug_t debug; 362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define printf debug_printf 382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic const char *levels[] = { 402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "", 412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "\t", 422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "\t\t", 432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "\t\t\t", 442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "\t\t\t\t", 452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "\t\t\t\t\t", 462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "\t\t\t\t\t\t", 472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "\t\t\t\t\t\t\t", 482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "\t\t\t\t\t\t\t\t", 492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "\t\t\t\t\t\t\t\t\t", 502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "x", 512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "x", 522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "x", 532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "x", 542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "x", 552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "x", 562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark}; 572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic const char *component = "xyzw"; 592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic const char *type[] = { 612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark [TYPE_F16] = "f16", 622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark [TYPE_F32] = "f32", 632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark [TYPE_U16] = "u16", 642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark [TYPE_U32] = "u32", 652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark [TYPE_S16] = "s16", 662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark [TYPE_S32] = "s32", 672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark [TYPE_U8] = "u8", 682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark [TYPE_S8] = "s8", 692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark}; 702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void print_reg(reg_t reg, bool full, bool r, bool c, bool im, 722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark bool neg, bool abs, bool addr_rel) 732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark const char type = c ? 'c' : 'r'; 752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark // XXX I prefer - and || for neg/abs, but preserving format used 772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark // by libllvm-a3xx for easy diffing.. 782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (abs && neg) 802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(absneg)"); 812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark else if (neg) 822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(neg)"); 832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark else if (abs) 842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(abs)"); 852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (r) 872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(r)"); 882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (im) { 902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("%d", reg.iim_val); 912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else if (addr_rel) { 922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* I would just use %+d but trying to make it diff'able with 932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * libllvm-a3xx... 942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark */ 952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (reg.iim_val < 0) 962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("%s%c<a0.x - %d>", full ? "" : "h", type, -reg.iim_val); 972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark else if (reg.iim_val > 0) 982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("%s%c<a0.x + %d>", full ? "" : "h", type, reg.iim_val); 992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark else 1002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("%s%c<a0.x>", full ? "" : "h", type); 1012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else if ((reg.num == REG_A0) && !c) { 1022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("a0.%c", component[reg.comp]); 1032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else if ((reg.num == REG_P0) && !c) { 1042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("p0.%c", component[reg.comp]); 1052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 106bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf("%s%c%d.%c", full ? "" : "h", type, reg.num & 0x3f, component[reg.comp]); 1072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 1082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 1092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* current instruction repeat flag: */ 1122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic unsigned repeat; 1132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void print_reg_dst(reg_t reg, bool full, bool addr_rel) 1152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 1162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg(reg, full, false, false, false, false, false, addr_rel); 1172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 1182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void print_reg_src(reg_t reg, bool full, bool r, bool c, bool im, 1202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark bool neg, bool abs, bool addr_rel) 1212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 1222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg(reg, full, r, c, im, neg, abs, addr_rel); 1232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 1242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 125bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* TODO switch to using reginfo struct everywhere, since more readable 126bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * than passing a bunch of bools to print_reg_src 127bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark */ 128bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 129bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clarkstruct reginfo { 130bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark reg_t reg; 131bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark bool full; 132bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark bool r; 133bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark bool c; 134bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark bool im; 135bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark bool neg; 136bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark bool abs; 137bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark bool addr_rel; 138bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark}; 139bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 140bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clarkstatic void print_src(struct reginfo *info) 141bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark{ 142bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark print_reg_src(info->reg, info->full, info->r, info->c, info->im, 143bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark info->neg, info->abs, info->addr_rel); 144bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark} 145bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 146bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark//static void print_dst(struct reginfo *info) 147bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark//{ 148bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark// print_reg_dst(info->reg, info->full, info->addr_rel); 149bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark//} 150bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 1512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void print_instr_cat0(instr_t *instr) 1522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 1532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat0_t *cat0 = &instr->cat0; 1542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark switch (cat0->opc) { 1562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_KILL: 1572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(" %sp0.%c", cat0->inv ? "!" : "", 1582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark component[cat0->comp]); 1592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 1602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_BR: 1612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(" %sp0.%c, #%d", cat0->inv ? "!" : "", 162660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark component[cat0->comp], cat0->a3xx.immed); 1632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 1642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_JUMP: 1652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_CALL: 166660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark printf(" #%d", cat0->a3xx.immed); 1672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 1682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 1692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 170660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark if ((debug & PRINT_VERBOSE) && (cat0->a3xx.dummy1|cat0->dummy2|cat0->dummy3|cat0->dummy4)) 171660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark printf("\t{0: %x,%x,%x,%x}", cat0->a3xx.dummy1, cat0->dummy2, cat0->dummy3, cat0->dummy4); 1722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 1732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void print_instr_cat1(instr_t *instr) 1752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 1762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat1_t *cat1 = &instr->cat1; 1772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1784317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark if (cat1->ul) 1792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(ul)"); 1802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat1->src_type == cat1->dst_type) { 1822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if ((cat1->src_type == TYPE_S16) && (((reg_t)cat1->dst).num == REG_A0)) { 1832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* special case (nmemonic?): */ 1842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("mova"); 1852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 1862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("mov.%s%s", type[cat1->src_type], type[cat1->dst_type]); 1872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 1882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 1892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("cov.%s%s", type[cat1->src_type], type[cat1->dst_type]); 1902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 1912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(" "); 1932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat1->even) 1952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(even)"); 1962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat1->pos_inf) 1982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(pos_infinity)"); 1992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg_dst((reg_t)(cat1->dst), type_size(cat1->dst_type) == 32, 2012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->dst_rel); 2022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", "); 2042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* ugg, have to special case this.. vs print_reg().. */ 2062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat1->src_im) { 2072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (type_float(cat1->src_type)) 2082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(%f)", cat1->fim_val); 209203f37540a698a812f0a66e2f3f1fff954af22abRob Clark else if (type_uint(cat1->src_type)) 210203f37540a698a812f0a66e2f3f1fff954af22abRob Clark printf("0x%08x", cat1->uim_val); 2112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark else 2122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("%d", cat1->iim_val); 2132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else if (cat1->src_rel && !cat1->src_c) { 2142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* I would just use %+d but trying to make it diff'able with 2152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * libllvm-a3xx... 2162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark */ 2174317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark char type = cat1->src_rel_c ? 'c' : 'r'; 2182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat1->off < 0) 2194317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark printf("%c<a0.x - %d>", type, -cat1->off); 2202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark else if (cat1->off > 0) 2214317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark printf("%c<a0.x + %d>", type, cat1->off); 2222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark else 223680664dff930ecf3dd12a5086cdd0e10653b61dcRob Clark printf("%c<a0.x>", type); 2242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 2252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg_src((reg_t)(cat1->src), type_size(cat1->src_type) == 32, 2262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->src_r, cat1->src_c, cat1->src_im, false, false, false); 2272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 2282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if ((debug & PRINT_VERBOSE) && (cat1->must_be_0)) 2302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("\t{1: %x}", cat1->must_be_0); 2312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void print_instr_cat2(instr_t *instr) 2342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat2_t *cat2 = &instr->cat2; 2362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark static const char *cond[] = { 2372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "lt", 2382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "le", 2392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "gt", 2402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "ge", 2412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "eq", 2422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "ne", 2432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark "?6?", 2442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 2452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 24670735643f4cf660dc3022f40f853a138aea738c2Rob Clark switch (_OPC(2, cat2->opc)) { 2472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_CMPS_F: 2482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_CMPS_U: 2492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_CMPS_S: 2502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_CMPV_F: 2512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_CMPV_U: 2522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_CMPV_S: 2532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(".%s", cond[cat2->cond]); 2542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 2552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 2562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(" "); 2582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat2->ei) 2592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(ei)"); 2602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg_dst((reg_t)(cat2->dst), cat2->full ^ cat2->dst_half, false); 2612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", "); 2624317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 2634317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark if (cat2->c1.src1_c) { 2644317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat2->c1.src1), cat2->full, cat2->src1_r, 2654317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->c1.src1_c, cat2->src1_im, cat2->src1_neg, 2664317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->src1_abs, false); 2674317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else if (cat2->rel1.src1_rel) { 2684317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat2->rel1.src1), cat2->full, cat2->src1_r, 2694317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->rel1.src1_c, cat2->src1_im, cat2->src1_neg, 2704317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->src1_abs, cat2->rel1.src1_rel); 2714317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else { 2724317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat2->src1), cat2->full, cat2->src1_r, 2734317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark false, cat2->src1_im, cat2->src1_neg, 2744317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->src1_abs, false); 2754317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } 2764317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 27770735643f4cf660dc3022f40f853a138aea738c2Rob Clark switch (_OPC(2, cat2->opc)) { 2782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_ABSNEG_F: 2792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_ABSNEG_S: 2802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_CLZ_B: 2812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_CLZ_S: 2822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_SIGN_F: 2832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_FLOOR_F: 2842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_CEIL_F: 2852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_RNDNE_F: 2862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_RNDAZ_F: 2872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_TRUNC_F: 2882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_NOT_B: 2892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_BFREV_B: 2902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_SETRM: 2912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_CBITS_B: 2922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* these only have one src reg */ 2932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 2942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark default: 2952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", "); 2964317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark if (cat2->c2.src2_c) { 2974317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat2->c2.src2), cat2->full, cat2->src2_r, 2984317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->c2.src2_c, cat2->src2_im, cat2->src2_neg, 2994317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->src2_abs, false); 3004317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else if (cat2->rel2.src2_rel) { 3014317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat2->rel2.src2), cat2->full, cat2->src2_r, 3024317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->rel2.src2_c, cat2->src2_im, cat2->src2_neg, 3034317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->src2_abs, cat2->rel2.src2_rel); 3044317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else { 3054317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat2->src2), cat2->full, cat2->src2_r, 3064317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark false, cat2->src2_im, cat2->src2_neg, 3074317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->src2_abs, false); 3084317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } 3092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 3102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 3112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 3122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void print_instr_cat3(instr_t *instr) 3142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 3152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat3_t *cat3 = &instr->cat3; 316a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark bool full = instr_cat3_full(cat3); 3172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(" "); 3192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg_dst((reg_t)(cat3->dst), full ^ cat3->dst_half, false); 3202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", "); 3214317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark if (cat3->c1.src1_c) { 3224317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat3->c1.src1), full, 3234317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->src1_r, cat3->c1.src1_c, false, cat3->src1_neg, 3244317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark false, false); 3254317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else if (cat3->rel1.src1_rel) { 3264317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat3->rel1.src1), full, 3274317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->src1_r, cat3->rel1.src1_c, false, cat3->src1_neg, 3284317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark false, cat3->rel1.src1_rel); 3294317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else { 3304317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat3->src1), full, 3314317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->src1_r, false, false, cat3->src1_neg, 3324317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark false, false); 3334317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } 3342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", "); 3352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg_src((reg_t)cat3->src2, full, 3362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->src2_r, cat3->src2_c, false, cat3->src2_neg, 3372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark false, false); 3382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", "); 3394317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark if (cat3->c2.src3_c) { 3404317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat3->c2.src3), full, 3414317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->src3_r, cat3->c2.src3_c, false, cat3->src3_neg, 3424317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark false, false); 3434317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else if (cat3->rel2.src3_rel) { 3444317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat3->rel2.src3), full, 3454317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->src3_r, cat3->rel2.src3_c, false, cat3->src3_neg, 3464317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark false, cat3->rel2.src3_rel); 3474317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else { 3484317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat3->src3), full, 3494317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->src3_r, false, false, cat3->src3_neg, 3504317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark false, false); 3514317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } 3522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 3532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void print_instr_cat4(instr_t *instr) 3552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 3562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat4_t *cat4 = &instr->cat4; 3572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(" "); 3592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg_dst((reg_t)(cat4->dst), cat4->full ^ cat4->dst_half, false); 3602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", "); 3614317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 3624317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark if (cat4->c.src_c) { 3634317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat4->c.src), cat4->full, 3644317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->src_r, cat4->c.src_c, cat4->src_im, 3654317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->src_neg, cat4->src_abs, false); 3664317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else if (cat4->rel.src_rel) { 3674317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat4->rel.src), cat4->full, 3684317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->src_r, cat4->rel.src_c, cat4->src_im, 3694317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->src_neg, cat4->src_abs, cat4->rel.src_rel); 3704317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else { 3714317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark print_reg_src((reg_t)(cat4->src), cat4->full, 3724317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->src_r, false, cat4->src_im, 3734317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->src_neg, cat4->src_abs, false); 3744317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } 3752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if ((debug & PRINT_VERBOSE) && (cat4->dummy1|cat4->dummy2)) 3772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("\t{4: %x,%x}", cat4->dummy1, cat4->dummy2); 3782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 3792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void print_instr_cat5(instr_t *instr) 3812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 3822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark static const struct { 3832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark bool src1, src2, samp, tex; 3842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } info[0x1f] = { 38570735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_ISAM)] = { true, false, true, true, }, 38670735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_ISAML)] = { true, true, true, true, }, 38770735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_ISAMM)] = { true, false, true, true, }, 38870735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_SAM)] = { true, false, true, true, }, 38970735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_SAMB)] = { true, true, true, true, }, 39070735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_SAML)] = { true, true, true, true, }, 39170735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_SAMGQ)] = { true, false, true, true, }, 39270735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_GETLOD)] = { true, false, true, true, }, 39370735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_CONV)] = { true, true, true, true, }, 39470735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_CONVM)] = { true, true, true, true, }, 39570735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_GETSIZE)] = { true, false, false, true, }, 39670735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_GETBUF)] = { false, false, false, true, }, 39770735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_GETPOS)] = { true, false, false, true, }, 39870735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_GETINFO)] = { false, false, false, true, }, 39970735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_DSX)] = { true, false, false, false, }, 40070735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_DSY)] = { true, false, false, false, }, 40170735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_GATHER4R)] = { true, false, true, true, }, 40270735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_GATHER4G)] = { true, false, true, true, }, 40370735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_GATHER4B)] = { true, false, true, true, }, 40470735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_GATHER4A)] = { true, false, true, true, }, 40570735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_SAMGP0)] = { true, false, true, true, }, 40670735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_SAMGP1)] = { true, false, true, true, }, 40770735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_SAMGP2)] = { true, false, true, true, }, 40870735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_SAMGP3)] = { true, false, true, true, }, 40970735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_DSXPP_1)] = { true, false, false, false, }, 41070735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_DSYPP_1)] = { true, false, false, false, }, 41170735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_RGETPOS)] = { false, false, false, false, }, 41270735643f4cf660dc3022f40f853a138aea738c2Rob Clark [opc_op(OPC_RGETINFO)] = { false, false, false, false, }, 4132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 4142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat5_t *cat5 = &instr->cat5; 4152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int i; 4162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat5->is_3d) printf(".3d"); 4182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat5->is_a) printf(".a"); 4192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat5->is_o) printf(".o"); 4202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat5->is_p) printf(".p"); 4212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat5->is_s) printf(".s"); 4222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat5->is_s2en) printf(".s2en"); 4232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(" "); 4252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 42670735643f4cf660dc3022f40f853a138aea738c2Rob Clark switch (_OPC(5, cat5->opc)) { 4272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_DSXPP_1: 4282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_DSYPP_1: 4292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 4302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark default: 4312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(%s)", type[cat5->type]); 4322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 4332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("("); 4362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark for (i = 0; i < 4; i++) 4372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat5->wrmask & (1 << i)) 4382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("%c", "xyzw"[i]); 4392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(")"); 4402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg_dst((reg_t)(cat5->dst), type_size(cat5->type) == 32, false); 4422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (info[cat5->opc].src1) { 4442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", "); 4452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg_src((reg_t)(cat5->src1), cat5->full, false, false, false, 4462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark false, false, false); 4472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat5->is_s2en) { 4502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", "); 4512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg_src((reg_t)(cat5->s2en.src2), cat5->full, false, false, false, 4522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark false, false, false); 4532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", "); 4542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg_src((reg_t)(cat5->s2en.src3), false, false, false, false, 4552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark false, false, false); 4562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 4572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat5->is_o || info[cat5->opc].src2) { 4582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", "); 4592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_reg_src((reg_t)(cat5->norm.src2), cat5->full, 4602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark false, false, false, false, false, false); 4612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (info[cat5->opc].samp) 4632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", s#%d", cat5->norm.samp); 4642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (info[cat5->opc].tex) 4652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf(", t#%d", cat5->norm.tex); 4662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (debug & PRINT_VERBOSE) { 4692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (cat5->is_s2en) { 4702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if ((debug & PRINT_VERBOSE) && (cat5->s2en.dummy1|cat5->s2en.dummy2|cat5->dummy2)) 4712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("\t{5: %x,%x,%x}", cat5->s2en.dummy1, cat5->s2en.dummy2, cat5->dummy2); 4722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 4732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if ((debug & PRINT_VERBOSE) && (cat5->norm.dummy1|cat5->dummy2)) 4742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("\t{5: %x,%x}", cat5->norm.dummy1, cat5->dummy2); 4752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 4782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void print_instr_cat6(instr_t *instr) 4802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 4812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6_t *cat6 = &instr->cat6; 48220b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark char sd = 0, ss = 0; /* dst/src address space */ 48320b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark bool nodst = false; 484bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark struct reginfo dst, src1, src2; 485bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark int src1off = 0, dstoff = 0; 4862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 487bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark memset(&dst, 0, sizeof(dst)); 488bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark memset(&src1, 0, sizeof(src1)); 489bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark memset(&src2, 0, sizeof(src2)); 490bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 49170735643f4cf660dc3022f40f853a138aea738c2Rob Clark switch (_OPC(6, cat6->opc)) { 492bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_RESINFO: 493bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_RESFMT: 494bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark dst.full = type_size(cat6->type) == 32; 495bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src1.full = type_size(cat6->type) == 32; 496bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src2.full = type_size(cat6->type) == 32; 497bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark break; 498bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_L2G: 499bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_G2L: 500bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark dst.full = true; 501bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src1.full = true; 502bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src2.full = true; 503bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark break; 504bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_STG: 505bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_STL: 506bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_STP: 507bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_STI: 508bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_STLW: 509bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_STGB_4D_4: 510bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_STIB: 511bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark dst.full = true; 512bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src1.full = type_size(cat6->type) == 32; 513bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src2.full = type_size(cat6->type) == 32; 514bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark break; 515bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark default: 516bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark dst.full = type_size(cat6->type) == 32; 517bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src1.full = true; 518bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src2.full = true; 519bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark break; 520bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark } 521bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 52270735643f4cf660dc3022f40f853a138aea738c2Rob Clark switch (_OPC(6, cat6->opc)) { 523bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_PREFETCH: 524bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_RESINFO: 525bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark break; 526bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_ATOMIC_ADD: 527bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_ATOMIC_SUB: 528bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_ATOMIC_XCHG: 529bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_ATOMIC_INC: 530bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_ATOMIC_DEC: 531bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_ATOMIC_CMPXCHG: 532bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_ATOMIC_MIN: 533bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_ATOMIC_MAX: 534bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_ATOMIC_AND: 535bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_ATOMIC_OR: 536bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_ATOMIC_XOR: 537bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark ss = cat6->g ? 'g' : 'l'; 538bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf(".%c", ss); 539bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf(".%s", type[cat6->type]); 540bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark break; 541bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark default: 542bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark dst.im = cat6->g && !cat6->dst_off; 543bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf(".%s", type[cat6->type]); 544bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark break; 545bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark } 546bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf(" "); 5472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 54870735643f4cf660dc3022f40f853a138aea738c2Rob Clark switch (_OPC(6, cat6->opc)) { 54920b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark case OPC_STG: 55020b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark sd = 'g'; 55120b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark break; 55220b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark case OPC_STP: 55320b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark sd = 'p'; 55420b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark break; 55520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark case OPC_STL: 55620b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark case OPC_STLW: 55720b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark sd = 'l'; 55820b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark break; 55920b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark 5602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_LDG: 56120b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark ss = 'g'; 56220b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark break; 5632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_LDP: 56420b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark ss = 'p'; 56520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark break; 5662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_LDL: 5672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_LDLW: 5682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_LDLV: 56920b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark ss = 'l'; 5702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 57120b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark 57220b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark case OPC_L2G: 57320b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark ss = 'l'; 57420b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark sd = 'g'; 5752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 5762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 57720b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark case OPC_G2L: 57820b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark ss = 'g'; 57920b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark sd = 'l'; 5802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 58120b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark 58220b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark case OPC_PREFETCH: 58320b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark ss = 'g'; 58420b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark nodst = true; 58520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark break; 58620b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark 5872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_STI: 588bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark dst.full = false; // XXX or inverts?? 5892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 5902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 5912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 592bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark if (cat6->dst_off) { 593bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark dst.reg = (reg_t)(cat6->c.dst); 594bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark dstoff = cat6->c.off; 59520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark } else { 596bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark dst.reg = (reg_t)(cat6->d.dst); 597bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark } 598bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 599bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark if (cat6->src_off) { 600bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src1.reg = (reg_t)(cat6->a.src1); 601bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src1.im = cat6->a.src1_im; 602bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src2.reg = (reg_t)(cat6->a.src2); 603bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src2.im = cat6->a.src2_im; 604bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src1off = cat6->a.off; 605bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark } else { 606bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src1.reg = (reg_t)(cat6->b.src1); 607bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src1.im = cat6->b.src1_im; 608bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src2.reg = (reg_t)(cat6->b.src2); 609bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark src2.im = cat6->b.src2_im; 610bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark } 611bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 612bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark if (!nodst) { 613bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark if (sd) 614bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf("%c[", sd); 615bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark /* note: dst might actually be a src (ie. address to store to) */ 616bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark print_src(&dst); 617bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark if (dstoff) 618bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf("%+d", dstoff); 619bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark if (sd) 62020b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark printf("]"); 62120b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark printf(", "); 62220b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark } 6232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 624bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark if (ss) 625bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf("%c[", ss); 626bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 627bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark /* can have a larger than normal immed, so hack: */ 628bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark if (src1.im) { 629bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf("%u", src1.reg.dummy13); 630bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark } else { 631bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark print_src(&src1); 632bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark } 633bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 634bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark if (src1off) 635bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf("%+d", src1off); 636bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark if (ss) 637bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf("]"); 638bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 63970735643f4cf660dc3022f40f853a138aea738c2Rob Clark switch (_OPC(6, cat6->opc)) { 640bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_RESINFO: 641bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark case OPC_RESFMT: 642bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark break; 643bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark default: 644bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark printf(", "); 645bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark print_src(&src2); 646bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark break; 6472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 6482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 6492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* size of largest OPC field of all the instruction categories: */ 6512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define NOPC_BITS 6 6522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 65366672e791c1d9d8d168c661695b4959c122e3da5Christian Gmeinerstatic const struct opc_info { 6542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint16_t cat; 6552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint16_t opc; 6562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark const char *name; 6572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark void (*print)(instr_t *instr); 6582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} opcs[1 << (3+NOPC_BITS)] = { 65970735643f4cf660dc3022f40f853a138aea738c2Rob Clark#define OPC(cat, opc, name) [(opc)] = { (cat), (opc), #name, print_instr_cat##cat } 6602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 0: */ 6612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_NOP, nop), 6622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_BR, br), 6632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_JUMP, jump), 6642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_CALL, call), 6652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_RET, ret), 6662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_KILL, kill), 6672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_END, end), 6682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_EMIT, emit), 6692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_CUT, cut), 6702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_CHMASK, chmask), 6712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_CHSH, chsh), 6722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(0, OPC_FLOW_REV, flow_rev), 6732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 1: */ 67570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC(1, OPC_MOV, ), 6762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 2: */ 6782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_ADD_F, add.f), 6792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MIN_F, min.f), 6802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MAX_F, max.f), 6812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MUL_F, mul.f), 6822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_SIGN_F, sign.f), 6832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_CMPS_F, cmps.f), 6842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_ABSNEG_F, absneg.f), 6852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_CMPV_F, cmpv.f), 6862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_FLOOR_F, floor.f), 6872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_CEIL_F, ceil.f), 6882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_RNDNE_F, rndne.f), 6892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_RNDAZ_F, rndaz.f), 6902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_TRUNC_F, trunc.f), 6912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_ADD_U, add.u), 6922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_ADD_S, add.s), 6932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_SUB_U, sub.u), 6942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_SUB_S, sub.s), 6952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_CMPS_U, cmps.u), 6962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_CMPS_S, cmps.s), 6972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MIN_U, min.u), 6982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MIN_S, min.s), 6992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MAX_U, max.u), 7002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MAX_S, max.s), 7012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_ABSNEG_S, absneg.s), 7022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_AND_B, and.b), 7032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_OR_B, or.b), 7042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_NOT_B, not.b), 7052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_XOR_B, xor.b), 7062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_CMPV_U, cmpv.u), 7072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_CMPV_S, cmpv.s), 7082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MUL_U, mul.u), 7092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MUL_S, mul.s), 7102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MULL_U, mull.u), 7112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_BFREV_B, bfrev.b), 7122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_CLZ_S, clz.s), 7132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_CLZ_B, clz.b), 7142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_SHL_B, shl.b), 7152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_SHR_B, shr.b), 7162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_ASHR_B, ashr.b), 7172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_BARY_F, bary.f), 7182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MGEN_B, mgen.b), 7192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_GETBIT_B, getbit.b), 7202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_SETRM, setrm), 7212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_CBITS_B, cbits.b), 7222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_SHB, shb), 7232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(2, OPC_MSAD, msad), 7242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 7252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 3: */ 7262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_MAD_U16, mad.u16), 7272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_MADSH_U16, madsh.u16), 7282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_MAD_S16, mad.s16), 7292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_MADSH_M16, madsh.m16), 7302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_MAD_U24, mad.u24), 7312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_MAD_S24, mad.s24), 7322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_MAD_F16, mad.f16), 7332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_MAD_F32, mad.f32), 7342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_SEL_B16, sel.b16), 7352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_SEL_B32, sel.b32), 7362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_SEL_S16, sel.s16), 7372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_SEL_S32, sel.s32), 7382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_SEL_F16, sel.f16), 7392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_SEL_F32, sel.f32), 7402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_SAD_S16, sad.s16), 7412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(3, OPC_SAD_S32, sad.s32), 7422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 7432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 4: */ 7442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(4, OPC_RCP, rcp), 7452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(4, OPC_RSQ, rsq), 7462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(4, OPC_LOG2, log2), 7472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(4, OPC_EXP2, exp2), 7482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(4, OPC_SIN, sin), 7492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(4, OPC_COS, cos), 7502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(4, OPC_SQRT, sqrt), 7512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 7522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 5: */ 7532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_ISAM, isam), 7542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_ISAML, isaml), 7552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_ISAMM, isamm), 7562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_SAM, sam), 7572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_SAMB, samb), 7582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_SAML, saml), 7592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_SAMGQ, samgq), 7602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_GETLOD, getlod), 7612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_CONV, conv), 7622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_CONVM, convm), 7632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_GETSIZE, getsize), 7642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_GETBUF, getbuf), 7652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_GETPOS, getpos), 7662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_GETINFO, getinfo), 7672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_DSX, dsx), 7682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_DSY, dsy), 7692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_GATHER4R, gather4r), 7702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_GATHER4G, gather4g), 7712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_GATHER4B, gather4b), 7722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_GATHER4A, gather4a), 7732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_SAMGP0, samgp0), 7742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_SAMGP1, samgp1), 7752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_SAMGP2, samgp2), 7762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_SAMGP3, samgp3), 7772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_DSXPP_1, dsxpp.1), 7782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_DSYPP_1, dsypp.1), 7792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_RGETPOS, rgetpos), 7802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(5, OPC_RGETINFO, rgetinfo), 7812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 7822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 7832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 6: */ 7842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_LDG, ldg), 7852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_LDL, ldl), 7862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_LDP, ldp), 7872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_STG, stg), 7882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_STL, stl), 7892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_STP, stp), 7902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_STI, sti), 7912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_G2L, g2l), 7922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_L2G, l2g), 7932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_PREFETCH, prefetch), 7942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_LDLW, ldlw), 7952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_STLW, stlw), 7962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_RESFMT, resfmt), 797bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_RESINFO, resinfo), 798bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_ATOMIC_ADD, atomic.add), 799bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_ATOMIC_SUB, atomic.sub), 800bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_ATOMIC_XCHG, atomic.xchg), 801bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_ATOMIC_INC, atomic.inc), 802bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_ATOMIC_DEC, atomic.dec), 803bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_ATOMIC_CMPXCHG, atomic.cmpxchg), 804bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_ATOMIC_MIN, atomic.min), 805bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_ATOMIC_MAX, atomic.max), 806bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_ATOMIC_AND, atomic.and), 807bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_ATOMIC_OR, atomic.or), 808bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_ATOMIC_XOR, atomic.xor), 809bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC(6, OPC_LDGB_TYPED_4D, ldgb.typed.3d), 8102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_STGB_4D_4, stgb.4d.4), 8112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_STIB, stib), 8122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_LDC_4, ldc.4), 8132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC(6, OPC_LDLV, ldlv), 8142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#undef OPC 8172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark}; 8182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 819a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark#define GETINFO(instr) (&(opcs[((instr)->opc_cat << NOPC_BITS) | instr_opc(instr)])) 8202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 821554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark// XXX hack.. probably should move this table somewhere common: 822554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark#include "ir3.h" 823554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clarkconst char *ir3_instr_name(struct ir3_instruction *instr) 824554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark{ 82570735643f4cf660dc3022f40f853a138aea738c2Rob Clark if (opc_cat(instr->opc) == -1) return "??meta??"; 82670735643f4cf660dc3022f40f853a138aea738c2Rob Clark return opcs[instr->opc].name; 827554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark} 828554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark 8292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void print_instr(uint32_t *dwords, int level, int n) 8302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 8312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_t *instr = (instr_t *)dwords; 832a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark uint32_t opc = instr_opc(instr); 8332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark const char *name; 8342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (debug & PRINT_VERBOSE) 836d6252d0f633292b01c3964d0e3da12f759bec9c5Rob Clark printf("%s%04d[%08xx_%08xx] ", levels[level], n, dwords[1], dwords[0]); 8372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* NOTE: order flags are printed is a bit fugly.. but for now I 8392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * try to match the order in llvm-a3xx disassembler for easy 8402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * diff'ing.. 8412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark */ 8422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (instr->sync) 8442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(sy)"); 8452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (instr->ss && (instr->opc_cat <= 4)) 8462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(ss)"); 8472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (instr->jmp_tgt) 8482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(jp)"); 8492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (instr->repeat && (instr->opc_cat <= 4)) { 8502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(rpt%d)", instr->repeat); 8512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark repeat = instr->repeat; 8522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 8532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark repeat = 0; 8542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 8552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (instr->ul && ((2 <= instr->opc_cat) && (instr->opc_cat <= 4))) 8562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("(ul)"); 8572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark name = GETINFO(instr)->name; 8592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (name) { 8612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("%s", name); 8622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark GETINFO(instr)->print(instr); 8632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 8642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("unknown(%d,%d)", instr->opc_cat, opc); 8652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 8662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark printf("\n"); 8682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 8692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkint disasm_a3xx(uint32_t *dwords, int sizedwords, int level, enum shader_t type) 8712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 8722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int i; 8732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark assert((sizedwords % 2) == 0); 8752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark for (i = 0; i < sizedwords; i += 2) 8772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark print_instr(&dwords[i], level, i/2); 8782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 8792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 0; 8802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 881