12cd769179345799d383f92dd615991755ec24be1Vadim Girlin/*
22cd769179345799d383f92dd615991755ec24be1Vadim Girlin * Copyright 2013 Vadim Girlin <vadimgirlin@gmail.com>
32cd769179345799d383f92dd615991755ec24be1Vadim Girlin *
42cd769179345799d383f92dd615991755ec24be1Vadim Girlin * Permission is hereby granted, free of charge, to any person obtaining a
52cd769179345799d383f92dd615991755ec24be1Vadim Girlin * copy of this software and associated documentation files (the "Software"),
62cd769179345799d383f92dd615991755ec24be1Vadim Girlin * to deal in the Software without restriction, including without limitation
72cd769179345799d383f92dd615991755ec24be1Vadim Girlin * on the rights to use, copy, modify, merge, publish, distribute, sub
82cd769179345799d383f92dd615991755ec24be1Vadim Girlin * license, and/or sell copies of the Software, and to permit persons to whom
92cd769179345799d383f92dd615991755ec24be1Vadim Girlin * the Software is furnished to do so, subject to the following conditions:
102cd769179345799d383f92dd615991755ec24be1Vadim Girlin *
112cd769179345799d383f92dd615991755ec24be1Vadim Girlin * The above copyright notice and this permission notice (including the next
122cd769179345799d383f92dd615991755ec24be1Vadim Girlin * paragraph) shall be included in all copies or substantial portions of the
132cd769179345799d383f92dd615991755ec24be1Vadim Girlin * Software.
142cd769179345799d383f92dd615991755ec24be1Vadim Girlin *
152cd769179345799d383f92dd615991755ec24be1Vadim Girlin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
162cd769179345799d383f92dd615991755ec24be1Vadim Girlin * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
172cd769179345799d383f92dd615991755ec24be1Vadim Girlin * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
182cd769179345799d383f92dd615991755ec24be1Vadim Girlin * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
192cd769179345799d383f92dd615991755ec24be1Vadim Girlin * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
202cd769179345799d383f92dd615991755ec24be1Vadim Girlin * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
212cd769179345799d383f92dd615991755ec24be1Vadim Girlin * USE OR OTHER DEALINGS IN THE SOFTWARE.
222cd769179345799d383f92dd615991755ec24be1Vadim Girlin *
232cd769179345799d383f92dd615991755ec24be1Vadim Girlin * Authors:
242cd769179345799d383f92dd615991755ec24be1Vadim Girlin *      Vadim Girlin
252cd769179345799d383f92dd615991755ec24be1Vadim Girlin */
262cd769179345799d383f92dd615991755ec24be1Vadim Girlin
272cd769179345799d383f92dd615991755ec24be1Vadim Girlin#include "sb_bc.h"
282cd769179345799d383f92dd615991755ec24be1Vadim Girlin
292cd769179345799d383f92dd615991755ec24be1Vadim Girlinnamespace r600_sb {
302cd769179345799d383f92dd615991755ec24be1Vadim Girlin
312cd769179345799d383f92dd615991755ec24be1Vadim Girlinint bc_decoder::decode_cf(unsigned &i, bc_cf& bc) {
322cd769179345799d383f92dd615991755ec24be1Vadim Girlin	int r = 0;
332cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw0 = dw[i];
342cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw1 = dw[i+1];
35a830225adbb77073272961df409885cca6b861eeGlenn Kennard	assert(i+1 <= ndw);
362cd769179345799d383f92dd615991755ec24be1Vadim Girlin
372cd769179345799d383f92dd615991755ec24be1Vadim Girlin	if ((dw1 >> 29) & 1) { // CF_ALU
382cd769179345799d383f92dd615991755ec24be1Vadim Girlin		return decode_cf_alu(i, bc);
392cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else {
402cd769179345799d383f92dd615991755ec24be1Vadim Girlin		// CF_INST field encoding on cayman is the same as on evergreen
412cd769179345799d383f92dd615991755ec24be1Vadim Girlin		unsigned opcode = ctx.is_egcm() ?
422cd769179345799d383f92dd615991755ec24be1Vadim Girlin				CF_WORD1_EG(dw1).get_CF_INST() :
432cd769179345799d383f92dd615991755ec24be1Vadim Girlin				CF_WORD1_R6R7(dw1).get_CF_INST();
442cd769179345799d383f92dd615991755ec24be1Vadim Girlin
452cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.set_op(r600_isa_cf_by_opcode(ctx.isa, opcode, 0));
462cd769179345799d383f92dd615991755ec24be1Vadim Girlin
472cd769179345799d383f92dd615991755ec24be1Vadim Girlin		if (bc.op_ptr->flags & CF_EXP) {
482cd769179345799d383f92dd615991755ec24be1Vadim Girlin			return decode_cf_exp(i, bc);
492cd769179345799d383f92dd615991755ec24be1Vadim Girlin		} else if (bc.op_ptr->flags & CF_MEM) {
502cd769179345799d383f92dd615991755ec24be1Vadim Girlin			return decode_cf_mem(i, bc);
512cd769179345799d383f92dd615991755ec24be1Vadim Girlin		}
522cd769179345799d383f92dd615991755ec24be1Vadim Girlin
532cd769179345799d383f92dd615991755ec24be1Vadim Girlin		if (ctx.is_egcm()) {
542cd769179345799d383f92dd615991755ec24be1Vadim Girlin			CF_WORD0_EGCM w0(dw0);
552cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.addr = w0.get_ADDR();
562cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.jumptable_sel = w0.get_JUMPTABLE_SEL();
572cd769179345799d383f92dd615991755ec24be1Vadim Girlin
582cd769179345799d383f92dd615991755ec24be1Vadim Girlin			if (ctx.is_evergreen()) {
592cd769179345799d383f92dd615991755ec24be1Vadim Girlin				CF_WORD1_EG w1(dw1);
602cd769179345799d383f92dd615991755ec24be1Vadim Girlin
612cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.barrier = w1.get_BARRIER();
622cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.cf_const = w1.get_CF_CONST();
632cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.cond = w1.get_COND();
642cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.count = w1.get_COUNT();
652cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.end_of_program = w1.get_END_OF_PROGRAM();
662cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.pop_count = w1.get_POP_COUNT();
672cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
682cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
692cd769179345799d383f92dd615991755ec24be1Vadim Girlin
702cd769179345799d383f92dd615991755ec24be1Vadim Girlin			} else { // cayman
712cd769179345799d383f92dd615991755ec24be1Vadim Girlin				CF_WORD1_CM w1(dw1);
722cd769179345799d383f92dd615991755ec24be1Vadim Girlin
732cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.barrier = w1.get_BARRIER();
742cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.cf_const = w1.get_CF_CONST();
752cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.cond = w1.get_COND();
762cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.count = w1.get_COUNT();
772cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.pop_count = w1.get_POP_COUNT();
782cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
792cd769179345799d383f92dd615991755ec24be1Vadim Girlin			}
802cd769179345799d383f92dd615991755ec24be1Vadim Girlin
812cd769179345799d383f92dd615991755ec24be1Vadim Girlin
822cd769179345799d383f92dd615991755ec24be1Vadim Girlin		} else {
832cd769179345799d383f92dd615991755ec24be1Vadim Girlin			CF_WORD0_R6R7 w0(dw0);
842cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.addr = w0.get_ADDR();
852cd769179345799d383f92dd615991755ec24be1Vadim Girlin
862cd769179345799d383f92dd615991755ec24be1Vadim Girlin			CF_WORD1_R6R7 w1(dw1);
872cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.barrier = w1.get_BARRIER();
882cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.cf_const = w1.get_CF_CONST();
892cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.cond = w1.get_COND();
902cd769179345799d383f92dd615991755ec24be1Vadim Girlin
912cd769179345799d383f92dd615991755ec24be1Vadim Girlin			if (ctx.is_r600())
922cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.count = w1.get_COUNT();
932cd769179345799d383f92dd615991755ec24be1Vadim Girlin			else
942cd769179345799d383f92dd615991755ec24be1Vadim Girlin				bc.count = w1.get_COUNT() + (w1.get_COUNT_3() << 3);
952cd769179345799d383f92dd615991755ec24be1Vadim Girlin
962cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.end_of_program = w1.get_END_OF_PROGRAM();
972cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.pop_count = w1.get_POP_COUNT();
982cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
992cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
1002cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.call_count = w1.get_CALL_COUNT();
1012cd769179345799d383f92dd615991755ec24be1Vadim Girlin		}
1022cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
1032cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1042cd769179345799d383f92dd615991755ec24be1Vadim Girlin	i += 2;
1052cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1062cd769179345799d383f92dd615991755ec24be1Vadim Girlin	return r;
1072cd769179345799d383f92dd615991755ec24be1Vadim Girlin}
1082cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1092cd769179345799d383f92dd615991755ec24be1Vadim Girlinint bc_decoder::decode_cf_alu(unsigned & i, bc_cf& bc) {
1102cd769179345799d383f92dd615991755ec24be1Vadim Girlin	int r = 0;
1112cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw0 = dw[i++];
1122cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw1 = dw[i++];
1132cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1142cd769179345799d383f92dd615991755ec24be1Vadim Girlin	assert(i <= ndw);
1152cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1162cd769179345799d383f92dd615991755ec24be1Vadim Girlin	CF_ALU_WORD0_ALL w0(dw0);
1172cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1182cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.kc[0].bank = w0.get_KCACHE_BANK0();
1192cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.kc[1].bank = w0.get_KCACHE_BANK1();
1202cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.kc[0].mode = w0.get_KCACHE_MODE0();
1212cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1222cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.addr = w0.get_ADDR();
1232cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1242cd769179345799d383f92dd615991755ec24be1Vadim Girlin	if (ctx.is_r600()) {
1252cd769179345799d383f92dd615991755ec24be1Vadim Girlin		CF_ALU_WORD1_R6 w1(dw1);
1262cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1272cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.set_op(r600_isa_cf_by_opcode(ctx.isa, w1.get_CF_INST(), 1));
1282cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1292cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.kc[0].addr = w1.get_KCACHE_ADDR0();
1302cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.kc[1].mode = w1.get_KCACHE_MODE1();
1312cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.kc[1].addr = w1.get_KCACHE_ADDR1();
1322cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1332cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.barrier = w1.get_BARRIER();
1342cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.count = w1.get_COUNT();
1352cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
1362cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1372cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.uses_waterfall = w1.get_USES_WATERFALL();
1382cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else {
1392cd769179345799d383f92dd615991755ec24be1Vadim Girlin		CF_ALU_WORD1_R7EGCM w1(dw1);
1402cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1412cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.set_op(r600_isa_cf_by_opcode(ctx.isa, w1.get_CF_INST(), 1));
1422cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1432cd769179345799d383f92dd615991755ec24be1Vadim Girlin		if (bc.op == CF_OP_ALU_EXT) {
1442cd769179345799d383f92dd615991755ec24be1Vadim Girlin			CF_ALU_WORD0_EXT_EGCM w0(dw0);
1452cd769179345799d383f92dd615991755ec24be1Vadim Girlin			CF_ALU_WORD1_EXT_EGCM w1(dw1);
1462cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1472cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[0].index_mode = w0.get_KCACHE_BANK_INDEX_MODE0();
1482cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[1].index_mode = w0.get_KCACHE_BANK_INDEX_MODE1();
1492cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[2].index_mode = w0.get_KCACHE_BANK_INDEX_MODE2();
1502cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[3].index_mode = w0.get_KCACHE_BANK_INDEX_MODE3();
1512cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[2].bank = w0.get_KCACHE_BANK2();
1522cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[3].bank = w0.get_KCACHE_BANK3();
1532cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[2].mode = w0.get_KCACHE_MODE2();
1542cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[3].mode = w1.get_KCACHE_MODE3();
1552cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[2].addr = w1.get_KCACHE_ADDR2();
1562cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[3].addr = w1.get_KCACHE_ADDR3();
1572cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1582cd769179345799d383f92dd615991755ec24be1Vadim Girlin			r = decode_cf_alu(i, bc);
1592cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1602cd769179345799d383f92dd615991755ec24be1Vadim Girlin		} else {
1612cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1622cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[0].addr = w1.get_KCACHE_ADDR0();
1632cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[1].mode = w1.get_KCACHE_MODE1();
1642cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.kc[1].addr = w1.get_KCACHE_ADDR1();
1652cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.barrier = w1.get_BARRIER();
1662cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.count = w1.get_COUNT();
1672cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
1682cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1692cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.alt_const = w1.get_ALT_CONST();
1702cd769179345799d383f92dd615991755ec24be1Vadim Girlin		}
1712cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
1722cd769179345799d383f92dd615991755ec24be1Vadim Girlin	return r;
1732cd769179345799d383f92dd615991755ec24be1Vadim Girlin}
1742cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1752cd769179345799d383f92dd615991755ec24be1Vadim Girlinint bc_decoder::decode_cf_exp(unsigned & i, bc_cf& bc) {
1762cd769179345799d383f92dd615991755ec24be1Vadim Girlin	int r = 0;
1772cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw0 = dw[i++];
1782cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw1 = dw[i++];
1792cd769179345799d383f92dd615991755ec24be1Vadim Girlin	assert(i <= ndw);
1802cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1812cd769179345799d383f92dd615991755ec24be1Vadim Girlin	CF_ALLOC_EXPORT_WORD0_ALL w0(dw0);
1822cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.array_base = w0.get_ARRAY_BASE();
1832cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.elem_size = w0.get_ELEM_SIZE();
1842cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.index_gpr = w0.get_INDEX_GPR();
1852cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.rw_gpr = w0.get_RW_GPR();
1862cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.rw_rel = w0.get_RW_REL();
1872cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.type = w0.get_TYPE();
1882cd769179345799d383f92dd615991755ec24be1Vadim Girlin
1892cd769179345799d383f92dd615991755ec24be1Vadim Girlin	if (ctx.is_evergreen()) {
1902cd769179345799d383f92dd615991755ec24be1Vadim Girlin		CF_ALLOC_EXPORT_WORD1_SWIZ_EG w1(dw1);
1912cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.barrier = w1.get_BARRIER();
1922cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.burst_count = w1.get_BURST_COUNT();
1932cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.end_of_program = w1.get_END_OF_PROGRAM();
1942cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[0] = w1.get_SEL_X();
1952cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[1] = w1.get_SEL_Y();
1962cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[2] = w1.get_SEL_Z();
1972cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[3] = w1.get_SEL_W();
1982cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
1992cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.mark = w1.get_MARK();
2002cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2012cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else if (ctx.is_cayman()) {
2022cd769179345799d383f92dd615991755ec24be1Vadim Girlin		CF_ALLOC_EXPORT_WORD1_SWIZ_CM w1(dw1);
2032cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.barrier = w1.get_BARRIER();
2042cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.burst_count = w1.get_BURST_COUNT();
2052cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.mark = w1.get_MARK();
2062cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[0] = w1.get_SEL_X();
2072cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[1] = w1.get_SEL_Y();
2082cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[2] = w1.get_SEL_Z();
2092cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[3] = w1.get_SEL_W();
2102cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
2112cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2122cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else { // r67
2132cd769179345799d383f92dd615991755ec24be1Vadim Girlin		CF_ALLOC_EXPORT_WORD1_SWIZ_R6R7 w1(dw1);
2142cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.barrier = w1.get_BARRIER();
2152cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.burst_count = w1.get_BURST_COUNT();
2162cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.end_of_program = w1.get_END_OF_PROGRAM();
2172cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[0] = w1.get_SEL_X();
2182cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[1] = w1.get_SEL_Y();
2192cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[2] = w1.get_SEL_Z();
2202cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sel[3] = w1.get_SEL_W();
2212cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
2222cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
2232cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
2242cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2252cd769179345799d383f92dd615991755ec24be1Vadim Girlin	return r;
2262cd769179345799d383f92dd615991755ec24be1Vadim Girlin}
2272cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2282cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2292cd769179345799d383f92dd615991755ec24be1Vadim Girlinint bc_decoder::decode_cf_mem(unsigned & i, bc_cf& bc) {
2302cd769179345799d383f92dd615991755ec24be1Vadim Girlin	int r = 0;
2312cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw0 = dw[i++];
2322cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw1 = dw[i++];
2332cd769179345799d383f92dd615991755ec24be1Vadim Girlin	assert(i <= ndw);
2342cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2352cd769179345799d383f92dd615991755ec24be1Vadim Girlin	if (!(bc.op_ptr->flags & CF_RAT)) {
2362cd769179345799d383f92dd615991755ec24be1Vadim Girlin		CF_ALLOC_EXPORT_WORD0_ALL w0(dw0);
2372cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.array_base = w0.get_ARRAY_BASE();
2382cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.elem_size = w0.get_ELEM_SIZE();
2392cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.index_gpr = w0.get_INDEX_GPR();
2402cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.rw_gpr = w0.get_RW_GPR();
2412cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.rw_rel = w0.get_RW_REL();
2422cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.type = w0.get_TYPE();
2432cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else {
2442cd769179345799d383f92dd615991755ec24be1Vadim Girlin		assert(ctx.is_egcm());
2452cd769179345799d383f92dd615991755ec24be1Vadim Girlin		CF_ALLOC_EXPORT_WORD0_RAT_EGCM w0(dw0);
2462cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.elem_size = w0.get_ELEM_SIZE();
2472cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.index_gpr = w0.get_INDEX_GPR();
2482cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.rw_gpr = w0.get_RW_GPR();
2492cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.rw_rel = w0.get_RW_REL();
2502cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.type = w0.get_TYPE();
2512cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.rat_id = w0.get_RAT_ID();
2522cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.rat_inst = w0.get_RAT_INST();
2532cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.rat_index_mode = w0.get_RAT_INDEX_MODE();
2542cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
2552cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2562cd769179345799d383f92dd615991755ec24be1Vadim Girlin	if (ctx.is_evergreen()) {
2572cd769179345799d383f92dd615991755ec24be1Vadim Girlin		CF_ALLOC_EXPORT_WORD1_BUF_EG w1(dw1);
2582cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.barrier = w1.get_BARRIER();
2592cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.burst_count = w1.get_BURST_COUNT();
2602cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.end_of_program = w1.get_END_OF_PROGRAM();
2612cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
2622cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.mark = w1.get_MARK();
263322cd2457ccf66a0a88d92f0b0dec1cb3f93eae4Jan Vesely		bc.array_size = w1.get_ARR_SIZE();
2642cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.comp_mask = w1.get_COMP_MASK();
2652cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2662cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else if (ctx.is_cayman()) {
2672cd769179345799d383f92dd615991755ec24be1Vadim Girlin		CF_ALLOC_EXPORT_WORD1_BUF_CM w1(dw1);
2682cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.barrier = w1.get_BARRIER();
2692cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.burst_count = w1.get_BURST_COUNT();
2702cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.mark = w1.get_MARK();
2712cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
272322cd2457ccf66a0a88d92f0b0dec1cb3f93eae4Jan Vesely		bc.array_size = w1.get_ARR_SIZE();
2732cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.comp_mask = w1.get_COMP_MASK();
2742cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2752cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else { // r67
2762cd769179345799d383f92dd615991755ec24be1Vadim Girlin		CF_ALLOC_EXPORT_WORD1_BUF_R6R7 w1(dw1);
2772cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.barrier = w1.get_BARRIER();
2782cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.burst_count = w1.get_BURST_COUNT();
2792cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.end_of_program = w1.get_END_OF_PROGRAM();
2802cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
2812cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
282322cd2457ccf66a0a88d92f0b0dec1cb3f93eae4Jan Vesely		bc.array_size = w1.get_ARR_SIZE();
2832cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.comp_mask = w1.get_COMP_MASK();
2842cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
2852cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
2862cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2872cd769179345799d383f92dd615991755ec24be1Vadim Girlin	return r;
2882cd769179345799d383f92dd615991755ec24be1Vadim Girlin}
2892cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2902cd769179345799d383f92dd615991755ec24be1Vadim Girlinint bc_decoder::decode_alu(unsigned & i, bc_alu& bc) {
2912cd769179345799d383f92dd615991755ec24be1Vadim Girlin	int r = 0;
2922cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw0 = dw[i++];
2932cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw1 = dw[i++];
2942cd769179345799d383f92dd615991755ec24be1Vadim Girlin	assert(i <= ndw);
2952cd769179345799d383f92dd615991755ec24be1Vadim Girlin
2962cd769179345799d383f92dd615991755ec24be1Vadim Girlin	ALU_WORD0_ALL w0(dw0);
2972cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.index_mode = w0.get_INDEX_MODE();
2982cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.last = w0.get_LAST();
2992cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.pred_sel = w0.get_PRED_SEL();
3002cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src[0].chan = w0.get_SRC0_CHAN();
3012cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src[0].sel = w0.get_SRC0_SEL();
3022cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src[0].neg = w0.get_SRC0_NEG();
3032cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src[0].rel = w0.get_SRC0_REL();
3042cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src[1].chan = w0.get_SRC1_CHAN();
3052cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src[1].sel = w0.get_SRC1_SEL();
3062cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src[1].neg = w0.get_SRC1_NEG();
3072cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src[1].rel = w0.get_SRC1_REL();
3082cd769179345799d383f92dd615991755ec24be1Vadim Girlin
3092cd769179345799d383f92dd615991755ec24be1Vadim Girlin	if ((dw1 >> 15) & 7) { // op3
3102cd769179345799d383f92dd615991755ec24be1Vadim Girlin		ALU_WORD1_OP3_ALL w1(dw1);
3112cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.set_op(r600_isa_alu_by_opcode(ctx.isa, w1.get_ALU_INST(), 1));
3122cd769179345799d383f92dd615991755ec24be1Vadim Girlin
313b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard		if (bc.op == ALU_OP3_LDS_IDX_OP) {
314b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			ALU_WORD0_LDS_IDX_OP_EGCM iw0(dw0);
315b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			ALU_WORD1_LDS_IDX_OP_EGCM iw1(dw1);
316b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.index_mode = iw0.get_INDEX_MODE();
317b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.last = iw0.get_LAST();
318b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.pred_sel = iw0.get_PRED_SEL();
319b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[0].chan = iw0.get_SRC0_CHAN();
320b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[0].sel = iw0.get_SRC0_SEL();
321b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[0].rel = iw0.get_SRC0_REL();
322b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard
323b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[1].chan = iw0.get_SRC1_CHAN();
324b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[1].sel = iw0.get_SRC1_SEL();
325b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[1].rel = iw0.get_SRC1_REL();
326b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard
327b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.bank_swizzle = iw1.get_BANK_SWIZZLE();
328b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[2].chan = iw1.get_SRC2_CHAN();
329b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[2].sel = iw1.get_SRC2_SEL();
330b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[2].rel = iw1.get_SRC2_REL();
331b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.dst_chan = iw1.get_DST_CHAN();
332b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			// TODO: clean up
33343ac091e4c735a50edf61972090ba83126f295e9Nicolai Hähnle			for (size_t k = 0, e = r600_alu_op_table_size(); k != e; k++) {
33443ac091e4c735a50edf61972090ba83126f295e9Nicolai Hähnle				if (((r600_alu_op_table[k].opcode[1] >> 8) & 0xff) == iw1.get_LDS_OP()) {
33543ac091e4c735a50edf61972090ba83126f295e9Nicolai Hähnle					bc.op_ptr = &r600_alu_op_table[k];
336b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard					bc.op = k;
337b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard					break;
338b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard				}
339b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			}
340b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.lds_idx_offset =
341b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard				(iw0.get_IDX_OFFSET_4() << 4) |
342b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard				(iw0.get_IDX_OFFSET_5() << 5) |
343b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard				(iw1.get_IDX_OFFSET_1() << 1) |
344b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard				(iw1.get_IDX_OFFSET_0() << 0) |
345b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard				(iw1.get_IDX_OFFSET_2() << 2) |
346b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard				(iw1.get_IDX_OFFSET_3() << 3);
347b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard		}
348b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard		else {
349b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.bank_swizzle = w1.get_BANK_SWIZZLE();
350b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.clamp = w1.get_CLAMP();
351b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.dst_chan = w1.get_DST_CHAN();
352b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.dst_gpr = w1.get_DST_GPR();
353b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.dst_rel = w1.get_DST_REL();
354b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard
355b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[2].chan = w1.get_SRC2_CHAN();
356b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[2].sel = w1.get_SRC2_SEL();
357b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[2].neg = w1.get_SRC2_NEG();
358b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard			bc.src[2].rel = w1.get_SRC2_REL();
359b2fa64b16166925200b09f7de62244358d22f0b7Glenn Kennard		}
3602cd769179345799d383f92dd615991755ec24be1Vadim Girlin
3612cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else { // op2
3622cd769179345799d383f92dd615991755ec24be1Vadim Girlin		if (ctx.is_r600()) {
3632cd769179345799d383f92dd615991755ec24be1Vadim Girlin			ALU_WORD1_OP2_R6 w1(dw1);
3642cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.set_op(r600_isa_alu_by_opcode(ctx.isa, w1.get_ALU_INST(), 0));
3652cd769179345799d383f92dd615991755ec24be1Vadim Girlin
3662cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.bank_swizzle = w1.get_BANK_SWIZZLE();
3672cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.clamp = w1.get_CLAMP();
3682cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.dst_chan = w1.get_DST_CHAN();
3692cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.dst_gpr = w1.get_DST_GPR();
3702cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.dst_rel = w1.get_DST_REL();
3712cd769179345799d383f92dd615991755ec24be1Vadim Girlin
3722cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.omod = w1.get_OMOD();
3732cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.src[0].abs = w1.get_SRC0_ABS();
3742cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.src[1].abs = w1.get_SRC1_ABS();
3752cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.write_mask = w1.get_WRITE_MASK();
3762cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.update_exec_mask = w1.get_UPDATE_EXEC_MASK();
3772cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.update_pred = w1.get_UPDATE_PRED();
3782cd769179345799d383f92dd615991755ec24be1Vadim Girlin
3792cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.fog_merge = w1.get_FOG_MERGE();
3802cd769179345799d383f92dd615991755ec24be1Vadim Girlin
3812cd769179345799d383f92dd615991755ec24be1Vadim Girlin		} else {
3822cd769179345799d383f92dd615991755ec24be1Vadim Girlin			ALU_WORD1_OP2_R7EGCM w1(dw1);
3832cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.set_op(r600_isa_alu_by_opcode(ctx.isa, w1.get_ALU_INST(), 0));
3842cd769179345799d383f92dd615991755ec24be1Vadim Girlin
3852cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.bank_swizzle = w1.get_BANK_SWIZZLE();
3862cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.clamp = w1.get_CLAMP();
3872cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.dst_chan = w1.get_DST_CHAN();
3882cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.dst_gpr = w1.get_DST_GPR();
3892cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.dst_rel = w1.get_DST_REL();
3902cd769179345799d383f92dd615991755ec24be1Vadim Girlin
3912cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.omod = w1.get_OMOD();
3922cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.src[0].abs = w1.get_SRC0_ABS();
3932cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.src[1].abs = w1.get_SRC1_ABS();
3942cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.write_mask = w1.get_WRITE_MASK();
3952cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.update_exec_mask = w1.get_UPDATE_EXEC_MASK();
3962cd769179345799d383f92dd615991755ec24be1Vadim Girlin			bc.update_pred = w1.get_UPDATE_PRED();
3972cd769179345799d383f92dd615991755ec24be1Vadim Girlin		}
3982cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
3992cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4002cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.slot_flags = (alu_op_flags)bc.op_ptr->slots[ctx.isa->hw_class];
4012cd769179345799d383f92dd615991755ec24be1Vadim Girlin	return r;
4022cd769179345799d383f92dd615991755ec24be1Vadim Girlin}
4032cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4042cd769179345799d383f92dd615991755ec24be1Vadim Girlinint bc_decoder::decode_fetch(unsigned & i, bc_fetch& bc) {
4052cd769179345799d383f92dd615991755ec24be1Vadim Girlin	int r = 0;
4062cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw0 = dw[i];
4072cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw1 = dw[i+1];
4082cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw2 = dw[i+2];
4092cd769179345799d383f92dd615991755ec24be1Vadim Girlin	assert(i + 4 <= ndw);
4102cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4112cd769179345799d383f92dd615991755ec24be1Vadim Girlin	unsigned fetch_opcode = dw0 & 0x1F;
4122cd769179345799d383f92dd615991755ec24be1Vadim Girlin
413fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	if (fetch_opcode == 2) { // MEM_INST_MEM
414fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie		unsigned mem_op = (dw0 >> 8) & 0x7;
415fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie		unsigned gds_op;
416fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie		if (mem_op == 4) {
417fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie			gds_op = (dw1 >> 9) & 0x1f;
418fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie			fetch_opcode = FETCH_OP_GDS_ADD + gds_op;
419fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie		} else if (mem_op == 5)
420fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie			fetch_opcode = FETCH_OP_TF_WRITE;
421fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie		bc.set_op(fetch_opcode);
422fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	} else
423fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie		bc.set_op(r600_isa_fetch_by_opcode(ctx.isa, fetch_opcode));
424fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie
425fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	if (bc.op_ptr->flags & FF_GDS)
426fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie		return decode_fetch_gds(i, bc);
4272cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4282cd769179345799d383f92dd615991755ec24be1Vadim Girlin	if (bc.op_ptr->flags & FF_VTX)
4292cd769179345799d383f92dd615991755ec24be1Vadim Girlin		return decode_fetch_vtx(i, bc);
4302cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4312cd769179345799d383f92dd615991755ec24be1Vadim Girlin	// tex
4322cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4332cd769179345799d383f92dd615991755ec24be1Vadim Girlin	if (ctx.is_r600()) {
4342cd769179345799d383f92dd615991755ec24be1Vadim Girlin		TEX_WORD0_R6 w0(dw0);
4352cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4362cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.bc_frac_mode = w0.get_BC_FRAC_MODE();
4372cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.fetch_whole_quad = w0.get_FETCH_WHOLE_QUAD();
4382cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.resource_id = w0.get_RESOURCE_ID();
4392cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_gpr = w0.get_SRC_GPR();
4402cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_rel = w0.get_SRC_REL();
4412cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4422cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else if (ctx.is_r600()) {
4432cd769179345799d383f92dd615991755ec24be1Vadim Girlin		TEX_WORD0_R7 w0(dw0);
4442cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4452cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.bc_frac_mode = w0.get_BC_FRAC_MODE();
4462cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.fetch_whole_quad = w0.get_FETCH_WHOLE_QUAD();
4472cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.resource_id = w0.get_RESOURCE_ID();
4482cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_gpr = w0.get_SRC_GPR();
4492cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_rel = w0.get_SRC_REL();
4502cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.alt_const = w0.get_ALT_CONST();
4512cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4522cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else { // eg/cm
4532cd769179345799d383f92dd615991755ec24be1Vadim Girlin		TEX_WORD0_EGCM w0(dw0);
4542cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4552cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.fetch_whole_quad = w0.get_FETCH_WHOLE_QUAD();
4562cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.resource_id = w0.get_RESOURCE_ID();
4572cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_gpr = w0.get_SRC_GPR();
4582cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_rel = w0.get_SRC_REL();
4592cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.alt_const = w0.get_ALT_CONST();
4602cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.inst_mod = w0.get_INST_MOD();
4612cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.resource_index_mode = w0.get_RESOURCE_INDEX_MODE();
4622cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.sampler_index_mode = w0.get_SAMPLER_INDEX_MODE();
4632cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
4642cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4652cd769179345799d383f92dd615991755ec24be1Vadim Girlin	TEX_WORD1_ALL w1(dw1);
4662cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.coord_type[0] = w1.get_COORD_TYPE_X();
4672cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.coord_type[1] = w1.get_COORD_TYPE_Y();
4682cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.coord_type[2] = w1.get_COORD_TYPE_Z();
4692cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.coord_type[3] = w1.get_COORD_TYPE_W();
4702cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.dst_gpr = w1.get_DST_GPR();
4712cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.dst_rel = w1.get_DST_REL();
4722cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.dst_sel[0] = w1.get_DST_SEL_X();
4732cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.dst_sel[1] = w1.get_DST_SEL_Y();
4742cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.dst_sel[2] = w1.get_DST_SEL_Z();
4752cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.dst_sel[3] = w1.get_DST_SEL_W();
4762cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.lod_bias = w1.get_LOD_BIAS();
4772cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4782cd769179345799d383f92dd615991755ec24be1Vadim Girlin	TEX_WORD2_ALL w2(dw2);
4792cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.offset[0] = w2.get_OFFSET_X();
4802cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.offset[1] = w2.get_OFFSET_Y();
4812cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.offset[2] = w2.get_OFFSET_Z();
4822cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.sampler_id = w2.get_SAMPLER_ID();
4832cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src_sel[0] = w2.get_SRC_SEL_X();
4842cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src_sel[1] = w2.get_SRC_SEL_Y();
4852cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src_sel[2] = w2.get_SRC_SEL_Z();
4862cd769179345799d383f92dd615991755ec24be1Vadim Girlin	bc.src_sel[3] = w2.get_SRC_SEL_W();
4872cd769179345799d383f92dd615991755ec24be1Vadim Girlin
4882cd769179345799d383f92dd615991755ec24be1Vadim Girlin	i += 4;
4892cd769179345799d383f92dd615991755ec24be1Vadim Girlin	return r;
4902cd769179345799d383f92dd615991755ec24be1Vadim Girlin}
4912cd769179345799d383f92dd615991755ec24be1Vadim Girlin
492fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlieint bc_decoder::decode_fetch_gds(unsigned & i, bc_fetch& bc) {
493fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	int r = 0;
494fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	uint32_t dw0 = dw[i];
495fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	uint32_t dw1 = dw[i+1];
496fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	uint32_t dw2 = dw[i+2];
497fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	uint32_t tmp;
498fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	/* GDS instructions align to 4 words boundaries */
499fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	i+= 4;
500fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	assert(i <= ndw);
501fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie
502fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	MEM_GDS_WORD0_EGCM w0(dw0);
503fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.src_gpr = w0.get_SRC_GPR();
504fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	tmp = w0.get_SRC_REL_MODE();
505fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.src_rel_global = (tmp == 2);
506fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.src_sel[0] = w0.get_SRC_SEL_X();
507fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.src_sel[1] = w0.get_SRC_SEL_Y();
508fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.src_sel[2] = w0.get_SRC_SEL_Z();
509fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie
510fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	MEM_GDS_WORD1_EGCM w1(dw1);
511fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.dst_gpr = w1.get_DST_GPR();
512fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	tmp = w1.get_DST_REL_MODE();
513fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.dst_rel_global = (tmp == 2);
514fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.src2_gpr = w1.get_SRC_GPR();
515fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie
516fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	MEM_GDS_WORD2_EGCM w2(dw2);
517fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.dst_sel[0] = w2.get_DST_SEL_X();
518fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.dst_sel[1] = w2.get_DST_SEL_Y();
519fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.dst_sel[2] = w2.get_DST_SEL_Z();
520fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	bc.dst_sel[3] = w2.get_DST_SEL_W();
521fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie	return r;
522fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie}
523fe4eb49df9ee93d9fe97d16149f682a6ebe79d42Dave Airlie
5242cd769179345799d383f92dd615991755ec24be1Vadim Girlinint bc_decoder::decode_fetch_vtx(unsigned & i, bc_fetch& bc) {
5252cd769179345799d383f92dd615991755ec24be1Vadim Girlin	int r = 0;
5262cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw0 = dw[i];
5272cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw1 = dw[i+1];
5282cd769179345799d383f92dd615991755ec24be1Vadim Girlin	uint32_t dw2 = dw[i+2];
5292cd769179345799d383f92dd615991755ec24be1Vadim Girlin	i+= 4;
5302cd769179345799d383f92dd615991755ec24be1Vadim Girlin	assert(i <= ndw);
5312cd769179345799d383f92dd615991755ec24be1Vadim Girlin
5322cd769179345799d383f92dd615991755ec24be1Vadim Girlin	if (ctx.is_cayman()) {
5332cd769179345799d383f92dd615991755ec24be1Vadim Girlin		VTX_WORD0_CM w0(dw0);
5342cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.resource_id = w0.get_BUFFER_ID();
5352cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.fetch_type = w0.get_FETCH_TYPE();
5362cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.fetch_whole_quad = w0.get_FETCH_WHOLE_QUAD();
5372cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_gpr = w0.get_SRC_GPR();
5382cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_rel = w0.get_SRC_REL();
5392cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_sel[0] = w0.get_SRC_SEL_X();
5402cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.coalesced_read = w0.get_COALESCED_READ();
5412cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.lds_req = w0.get_LDS_REQ();
5422cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.structured_read = w0.get_STRUCTURED_READ();
5432cd769179345799d383f92dd615991755ec24be1Vadim Girlin
5442cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else {
5452cd769179345799d383f92dd615991755ec24be1Vadim Girlin		VTX_WORD0_R6R7EG w0(dw0);
5462cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.resource_id = w0.get_BUFFER_ID();
5472cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.fetch_type = w0.get_FETCH_TYPE();
5482cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.fetch_whole_quad = w0.get_FETCH_WHOLE_QUAD();
5492cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.mega_fetch_count = w0.get_MEGA_FETCH_COUNT();
5502cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_gpr = w0.get_SRC_GPR();
5512cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_rel = w0.get_SRC_REL();
5522cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.src_sel[0] = w0.get_SRC_SEL_X();
5532cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
5542cd769179345799d383f92dd615991755ec24be1Vadim Girlin
5552cd769179345799d383f92dd615991755ec24be1Vadim Girlin	if (bc.op == FETCH_OP_SEMFETCH) {
5562cd769179345799d383f92dd615991755ec24be1Vadim Girlin		VTX_WORD1_SEM_ALL w1(dw1);
5572cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.data_format = w1.get_DATA_FORMAT();
5582cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.dst_sel[0] = w1.get_DST_SEL_X();
5592cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.dst_sel[1] = w1.get_DST_SEL_Y();
5602cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.dst_sel[2] = w1.get_DST_SEL_Z();
5612cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.dst_sel[3] = w1.get_DST_SEL_W();
5622cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.format_comp_all = w1.get_FORMAT_COMP_ALL();
5632cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.num_format_all = w1.get_NUM_FORMAT_ALL();
5642cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.srf_mode_all = w1.get_SRF_MODE_ALL();
5652cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.use_const_fields = w1.get_USE_CONST_FIELDS();
5662cd769179345799d383f92dd615991755ec24be1Vadim Girlin
5672cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.semantic_id = w1.get_SEMANTIC_ID();
5682cd769179345799d383f92dd615991755ec24be1Vadim Girlin
5692cd769179345799d383f92dd615991755ec24be1Vadim Girlin	} else {
5702cd769179345799d383f92dd615991755ec24be1Vadim Girlin		VTX_WORD1_GPR_ALL w1(dw1);
5712cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.data_format = w1.get_DATA_FORMAT();
5722cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.dst_sel[0] = w1.get_DST_SEL_X();
5732cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.dst_sel[1] = w1.get_DST_SEL_Y();
5742cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.dst_sel[2] = w1.get_DST_SEL_Z();
5752cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.dst_sel[3] = w1.get_DST_SEL_W();
5762cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.format_comp_all = w1.get_FORMAT_COMP_ALL();
5772cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.num_format_all = w1.get_NUM_FORMAT_ALL();
5782cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.srf_mode_all = w1.get_SRF_MODE_ALL();
5792cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.use_const_fields = w1.get_USE_CONST_FIELDS();
5802cd769179345799d383f92dd615991755ec24be1Vadim Girlin
5812cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.dst_gpr = w1.get_DST_GPR();
5822cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.dst_rel = w1.get_DST_REL();
5832cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
5842cd769179345799d383f92dd615991755ec24be1Vadim Girlin
5852cd769179345799d383f92dd615991755ec24be1Vadim Girlin	switch (ctx.hw_class) {
5862cd769179345799d383f92dd615991755ec24be1Vadim Girlin	case HW_CLASS_R600:
5872cd769179345799d383f92dd615991755ec24be1Vadim Girlin	{
5882cd769179345799d383f92dd615991755ec24be1Vadim Girlin		VTX_WORD2_R6 w2(dw2);
5892cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.const_buf_no_stride = w2.get_CONST_BUF_NO_STRIDE();
5902cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.endian_swap = w2.get_ENDIAN_SWAP();
5912cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.mega_fetch = w2.get_MEGA_FETCH();
5922cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.offset[0] = w2.get_OFFSET();
5932cd769179345799d383f92dd615991755ec24be1Vadim Girlin		break;
5942cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
5952cd769179345799d383f92dd615991755ec24be1Vadim Girlin	case HW_CLASS_R700:
5962cd769179345799d383f92dd615991755ec24be1Vadim Girlin	{
5972cd769179345799d383f92dd615991755ec24be1Vadim Girlin		VTX_WORD2_R7 w2(dw2);
5982cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.const_buf_no_stride = w2.get_CONST_BUF_NO_STRIDE();
5992cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.endian_swap = w2.get_ENDIAN_SWAP();
6002cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.mega_fetch = w2.get_MEGA_FETCH();
6012cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.offset[0] = w2.get_OFFSET();
6022cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.alt_const = w2.get_ALT_CONST();
6032cd769179345799d383f92dd615991755ec24be1Vadim Girlin		break;
6042cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
6052cd769179345799d383f92dd615991755ec24be1Vadim Girlin	case HW_CLASS_EVERGREEN:
6062cd769179345799d383f92dd615991755ec24be1Vadim Girlin	{
6072cd769179345799d383f92dd615991755ec24be1Vadim Girlin		VTX_WORD2_EG w2(dw2);
6082cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.const_buf_no_stride = w2.get_CONST_BUF_NO_STRIDE();
6092cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.endian_swap = w2.get_ENDIAN_SWAP();
6102cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.mega_fetch = w2.get_MEGA_FETCH();
6112cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.offset[0] = w2.get_OFFSET();
6122cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.alt_const = w2.get_ALT_CONST();
6132cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.resource_index_mode = w2.get_BUFFER_INDEX_MODE();
6142cd769179345799d383f92dd615991755ec24be1Vadim Girlin		break;
6152cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
6162cd769179345799d383f92dd615991755ec24be1Vadim Girlin	case HW_CLASS_CAYMAN:
6172cd769179345799d383f92dd615991755ec24be1Vadim Girlin	{
6182cd769179345799d383f92dd615991755ec24be1Vadim Girlin		VTX_WORD2_CM w2(dw2);
6192cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.const_buf_no_stride = w2.get_CONST_BUF_NO_STRIDE();
6202cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.endian_swap = w2.get_ENDIAN_SWAP();
6212cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.offset[0] = w2.get_OFFSET();
6222cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.alt_const = w2.get_ALT_CONST();
6232cd769179345799d383f92dd615991755ec24be1Vadim Girlin		bc.resource_index_mode = w2.get_BUFFER_INDEX_MODE();
6242cd769179345799d383f92dd615991755ec24be1Vadim Girlin		break;
6252cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
6262cd769179345799d383f92dd615991755ec24be1Vadim Girlin	default:
6272cd769179345799d383f92dd615991755ec24be1Vadim Girlin		assert(!"unknown hw class");
6282cd769179345799d383f92dd615991755ec24be1Vadim Girlin		return -1;
6292cd769179345799d383f92dd615991755ec24be1Vadim Girlin	}
6302cd769179345799d383f92dd615991755ec24be1Vadim Girlin
6312cd769179345799d383f92dd615991755ec24be1Vadim Girlin	return r;
6322cd769179345799d383f92dd615991755ec24be1Vadim Girlin}
6332cd769179345799d383f92dd615991755ec24be1Vadim Girlin
6342cd769179345799d383f92dd615991755ec24be1Vadim Girlin}
635