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