blob: 89aa2332adbf7c7ead38b45fb76e416fe21d8087 [file] [log] [blame]
#include "util/macros.h"
#include "disassemble.h"
#define _BITS(bits, pos, width) (((bits) >> (pos)) & ((1 << (width)) - 1))
static void
bi_disasm_add_ld_var_special_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".auto", ".reserved", ".auto", ".reserved", ".auto", ".reserved", ".auto", ".reserved", ".auto", ".reserved", ".auto", ".reserved", ".auto", ".reserved", ".auto", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *register_format = register_format_table[(_BITS(bits, 3, 2) << 0) | (_BITS(bits, 10, 4) << 2)];
static const char *vecsize_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".v2", ".reserved", "", ".reserved", ".v2", ".reserved", "", ".reserved", ".v2", ".reserved", "", ".reserved", ".v2", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *vecsize = vecsize_table[(_BITS(bits, 3, 2) << 0) | (_BITS(bits, 10, 4) << 2)];
static const char *varying_name_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".point", ".reserved", ".frag_w", ".reserved", ".point", ".reserved", ".frag_w", ".reserved", ".point", ".reserved", ".frag_w", ".reserved", ".point", ".reserved", ".frag_w", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *varying_name = varying_name_table[(_BITS(bits, 3, 2) << 0) | (_BITS(bits, 10, 4) << 2)];
static const char *update_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".clobber", ".reserved", ".clobber", ".reserved", ".clobber", ".reserved", ".clobber", ".reserved", ".clobber", ".reserved", ".clobber", ".reserved", ".clobber", ".reserved", ".clobber", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *update = update_table[(_BITS(bits, 3, 2) << 0) | (_BITS(bits, 10, 4) << 2)];
static const char *sample_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".center", ".reserved", ".center", ".reserved", ".centroid", ".reserved", ".centroid", ".reserved", ".sample", ".reserved", ".sample", ".reserved", ".explicit", ".reserved", ".explicit", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *sample = sample_table[(_BITS(bits, 3, 2) << 0) | (_BITS(bits, 10, 4) << 2)];
fputs("+LD_VAR_SPECIAL", fp);
fputs(varying_name, fp);
fputs(vecsize, fp);
fputs(update, fp);
fputs(register_format, fp);
fputs(sample, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_frcp_f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
static const char *divzero_table[] = {
"", ".divzero"
};
const char *divzero = divzero_table[_BITS(bits, 5, 1)];
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 8, 1)];
fputs("+FRCP.f16", fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_var_imm_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *register_format = register_format_table[(_BITS(bits, 19, 1) << 0) | (_BITS(bits, 10, 4) << 1)];
static const char *sample_table[] = {
".center", ".center", ".centroid", ".centroid", ".sample", ".sample", ".explicit", ".explicit", "", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".center", ".center", ".centroid", ".centroid", ".center", ".center", ".centroid", ".centroid", ".sample", ".sample", ".explicit", ".explicit", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *sample = sample_table[(_BITS(bits, 19, 1) << 0) | (_BITS(bits, 10, 4) << 1)];
static const char *update_table[] = {
".store", ".store", ".store", ".store", ".store", ".store", ".store", ".store", ".retrieve", ".retrieve", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".conditional", ".conditional", ".conditional", ".conditional", ".clobber", ".clobber", ".clobber", ".clobber", ".clobber", ".clobber", ".clobber", ".clobber", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *update = update_table[(_BITS(bits, 19, 1) << 0) | (_BITS(bits, 10, 4) << 1)];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 8, 2)];
fputs("+LD_VAR_IMM", fp);
fputs(vecsize, fp);
fputs(update, fp);
fputs(register_format, fp);
fputs(sample, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fprintf(fp, ", index:%u", _BITS(bits, 3, 5));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_gclk_u64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *source_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".system_timestamp", ".cycle_counter"
};
const char *source = source_table[_BITS(bits, 0, 3)];
fputs("+LD_GCLK.u64", fp);
fputs(source, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v4s8_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".b0101", ".b2323"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 1) << 0)];
static const char *lanes0_table[] = {
"", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 9, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v4s8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_f32_to_u32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 4, 2) << 0)];
fputs("+F32_TO_U32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *extend_table[] = {
"", "", "", ""
};
const char *extend = extend_table[(_BITS(bits, 9, 2) << 0)];
static const char *lane_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane = lane_table[(_BITS(bits, 9, 2) << 0)];
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i8", fp);
fputs(seg, fp);
fputs(lane, fp);
fputs(extend, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_icmp_v4i8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
static const char *cmpf_table[] = {
".eq", ".ne"
};
const char *cmpf = cmpf_table[_BITS(bits, 6, 1)];
fputs("+ICMP.v4i8", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v4u8_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".b0101", ".reserved", ".b2323"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *lanes0_table[] = {
".reserved", "", ".reserved", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v4u8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_vn_asst2_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *scale_table[] = {
".scale"
};
const char *scale = scale_table[0];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 4, 1)];
fputs("+VN_ASST2.f32", fp);
fputs(scale, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_imul_i32_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen1_table[] = {
".b0", ".b1", ".b2", ".b3", ".b0", ".b1", ".b2", ".b3"
};
const char *widen1 = widen1_table[(_BITS(bits, 9, 2) << 0) | (_BITS(bits, 11, 1) << 2)];
static const char *extend1_table[] = {
".zext", ".zext", ".zext", ".zext", ".sext", ".sext", ".sext", ".sext"
};
const char *extend1 = extend1_table[(_BITS(bits, 9, 2) << 0) | (_BITS(bits, 11, 1) << 2)];
fputs("*IMUL.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(widen1, fp);
fputs(extend1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_icmp_v2s16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[(_BITS(bits, 12, 1) << 0)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 6, 2)];
static const char *swz1_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz1 = swz1_table[_BITS(bits, 8, 2)];
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
fputs("+ICMP.v2s16", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(swz1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v2u16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".h00", ".reserved", ".h11"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *lanes0_table[] = {
".reserved", "", ".reserved", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v2u16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_xor_v2i16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b00", ".b11", ".b22", ".b33"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 13, 1)];
fputs("*LSHIFT_XOR.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_atom_c_return_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *atom_opc_table[] = {
".reserved", ".reserved", ".aadd", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".asmin", ".asmax", ".aumin", ".aumax", ".aand", ".aor", ".axor", ".reserved"
};
const char *atom_opc = atom_opc_table[_BITS(bits, 9, 4)];
fputs("*ATOM_C_RETURN.i32", fp);
fputs(atom_opc, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_cube_tsel(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[(_BITS(bits, 9, 1) << 0)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[(_BITS(bits, 9, 1) << 0)];
fputs("+CUBE_TSEL", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(neg1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_atest(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen1_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen1 = widen1_table[_BITS(bits, 6, 2)];
fputs("+ATEST", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(widen1, fp);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_fmin_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *abs1_table[] = {
"", ".abs"
};
const char *abs1 = abs1_table[_BITS(bits, 6, 1)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 8, 1)];
static const char *clamp_table[] = {
"", ".clamp_0_inf", ".clamp_m1_1", ".clamp_0_1"
};
const char *clamp = clamp_table[_BITS(bits, 11, 2)];
static const char *sem_table[] = {
"", ".nan_propagate", ".c", ".inverse_c"
};
const char *sem = sem_table[_BITS(bits, 13, 2)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 15, 1)];
fputs("+FMIN.f32", fp);
fputs(clamp, fp);
fputs(sem, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs(abs0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(abs1, fp);
fputs(neg1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_or_v4i8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
""
};
const char *lanes2 = lanes2_table[0];
static const char *not1_table[] = {
".not", ""
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*RSHIFT_OR.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branchc_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *combine_table[] = {
".any", ".all"
};
const char *combine = combine_table[_BITS(bits, 10, 1)];
fputs("+BRANCHC.i32", fp);
fputs(combine, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frexpe_v2f16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *sqrt_table[] = {
""
};
const char *sqrt = sqrt_table[0];
static const char *log_table[] = {
".log"
};
const char *log = log_table[0];
static const char *neg_table[] = {
""
};
const char *neg = neg_table[0];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
fputs("+FREXPE.v2f16", fp);
fputs(neg, fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_v2f16_to_v2s16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 4, 2) << 0)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 6, 2)];
fputs("+V2F16_TO_V2S16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_u32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".h0", ".reserved", ".h1"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.u32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *extend_table[] = {
".sext", ".zext"
};
const char *extend = extend_table[(_BITS(bits, 9, 1) << 0)];
static const char *lane_table[] = {
".w0", ".w0"
};
const char *lane = lane_table[(_BITS(bits, 9, 1) << 0)];
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i16", fp);
fputs(seg, fp);
fputs(lane, fp);
fputs(extend, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_csel_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".eq", ".gt", ".ge", ".reserved"
};
const char *cmpf = cmpf_table[(_BITS(bits, 12, 2) << 0)];
fputs("*CSEL.f32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v2s16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
"", ".h10", "", ".h10"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 1) << 0) | (_BITS(bits, 10, 1) << 1)];
static const char *lanes0_table[] = {
"", "", ".h10", ".h10"
};
const char *lanes0 = lanes0_table[(_BITS(bits, 9, 1) << 0) | (_BITS(bits, 10, 1) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v2s16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_atom_post_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *atom_opc_table[] = {
".reserved", ".reserved", ".aadd", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".asmin", ".asmax", ".aumin", ".aumax", ".aand", ".aor", ".axor", ".reserved"
};
const char *atom_opc = atom_opc_table[_BITS(bits, 6, 4)];
fputs("*ATOM_POST.i32", fp);
fputs(atom_opc, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frexpm_v2f16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *sqrt_table[] = {
""
};
const char *sqrt = sqrt_table[0];
static const char *log_table[] = {
".log"
};
const char *log = log_table[0];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 6, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
fputs("+FREXPM.v2f16", fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(abs0, fp);
fputs(swz0, fp);
fputs(neg0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_u8_to_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 2)];
fputs("+U8_TO_U32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_store_i128(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+STORE.i128", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_attr_tex_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".f16", ".f32", ".s32", ".u32", ".s16", ".u16", ".f64", ".i64"
};
const char *register_format = register_format_table[(_BITS(bits, 13, 3) << 0)];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 11, 2)];
fputs("+LD_ATTR_TEX", fp);
fputs(register_format, fp);
fputs(vecsize, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_store_i16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+STORE.i16", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_quiet_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 2)];
fputs("+QUIET.v2f16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_arshift_v4i8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
""
};
const char *lanes2 = lanes2_table[0];
fputs("*ARSHIFT.v4i8", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0x8 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_store_i96(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+STORE.i96", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_u16_to_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 1)];
fputs("+U16_TO_F32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_zs_emit(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *z_table[] = {
".reserved", "", ".z", ".z"
};
const char *z = z_table[(_BITS(bits, 9, 2) << 0)];
static const char *stencil_table[] = {
".reserved", ".stencil", "", ".stencil"
};
const char *stencil = stencil_table[(_BITS(bits, 9, 2) << 0)];
fputs("+ZS_EMIT", fp);
fputs(stencil, fp);
fputs(z, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_discard_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".eq", ".ne", ".lt", ".le", ".eq", ".ne", ".lt", ".le", ".eq", ".ne", ".lt", ".le", ".eq", ".ne", ".lt", ".le", ".eq", ".ne", ".lt", ".le", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = cmpf_table[(_BITS(bits, 6, 2) << 0) | (_BITS(bits, 8, 3) << 2)];
static const char *widen1_table[] = {
".h0", ".h0", ".h0", ".h0", ".h0", ".h0", ".h0", ".h0", ".h1", ".h1", ".h1", ".h1", ".h1", ".h1", ".h1", ".h1", "", "", "", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen1 = widen1_table[(_BITS(bits, 6, 2) << 0) | (_BITS(bits, 8, 3) << 2)];
static const char *widen0_table[] = {
".h0", ".h0", ".h0", ".h0", ".h1", ".h1", ".h1", ".h1", ".h0", ".h0", ".h0", ".h0", ".h1", ".h1", ".h1", ".h1", "", "", "", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen0 = widen0_table[(_BITS(bits, 6, 2) << 0) | (_BITS(bits, 8, 3) << 2)];
fputs("+DISCARD.f32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(widen1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_isubb_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("*ISUBB.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_fadd_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *abs1_table[] = {
""
};
const char *abs1 = abs1_table[0];
static const char *neg0_table[] = {
""
};
const char *neg0 = neg0_table[0];
static const char *widen0_table[] = {
""
};
const char *widen0 = widen0_table[0];
static const char *neg1_table[] = {
""
};
const char *neg1 = neg1_table[0];
static const char *abs0_table[] = {
""
};
const char *abs0 = abs0_table[0];
static const char *clamp_table[] = {
""
};
const char *clamp = clamp_table[0];
static const char *round_table[] = {
".rto"
};
const char *round = round_table[0];
static const char *widen1_table[] = {
""
};
const char *widen1 = widen1_table[0];
fputs("+FADD.f32", fp);
fputs(round, fp);
fputs(clamp, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs(abs0, fp);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(abs1, fp);
fputs(neg1, fp);
fputs(widen1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_s8_to_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 2)];
fputs("+S8_TO_F32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fpclass_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+FPCLASS.f32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_icmpf_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+ICMPF.i32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_fadd_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
"", "", "", "", "", "", "", "", "", "", "", "", ".h0", ".h0", ".h0", ".h0"
};
const char *widen0 = widen0_table[(_BITS(bits, 13, 2) << 0) | (_BITS(bits, 9, 2) << 2)];
static const char *widen1_table[] = {
"", "", "", "", ".h0", ".h0", ".h0", ".h0", ".h1", ".h1", ".h1", ".h1", ".h0", ".h0", ".h0", ".h0"
};
const char *widen1 = widen1_table[(_BITS(bits, 13, 2) << 0) | (_BITS(bits, 9, 2) << 2)];
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz", "", ".rtp", ".rtn", ".rtz", "", ".rtp", ".rtn", ".rtz", "", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 13, 2) << 0) | (_BITS(bits, 9, 2) << 2)];
static const char *abs1_table[] = {
"", ".abs"
};
const char *abs1 = abs1_table[_BITS(bits, 6, 1)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 8, 1)];
static const char *clamp_table[] = {
"", ".clamp_0_inf", ".clamp_m1_1", ".clamp_0_1"
};
const char *clamp = clamp_table[_BITS(bits, 11, 2)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 15, 1)];
fputs("+FADD.f32", fp);
fputs(round, fp);
fputs(clamp, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs(abs0, fp);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(abs1, fp);
fputs(neg1, fp);
fputs(widen1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_var_imm_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".auto", ".auto", ".auto", ".auto", ".auto", ".reserved", ".reserved", ".reserved", ".auto", ".auto", ".auto", ".auto", ".auto", ".auto", ".reserved", ".reserved"
};
const char *register_format = register_format_table[(_BITS(bits, 10, 4) << 0)];
static const char *sample_table[] = {
".center", ".centroid", ".sample", ".explicit", "", ".reserved", ".reserved", ".reserved", ".center", ".centroid", ".center", ".centroid", ".sample", ".explicit", ".reserved", ".reserved"
};
const char *sample = sample_table[(_BITS(bits, 10, 4) << 0)];
static const char *update_table[] = {
".store", ".store", ".store", ".store", ".retrieve", ".reserved", ".reserved", ".reserved", ".conditional", ".conditional", ".clobber", ".clobber", ".clobber", ".clobber", ".reserved", ".reserved"
};
const char *update = update_table[(_BITS(bits, 10, 4) << 0)];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 8, 2)];
fputs("+LD_VAR_IMM", fp);
fputs(vecsize, fp);
fputs(update, fp);
fputs(register_format, fp);
fputs(sample, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fprintf(fp, ", index:%u", _BITS(bits, 3, 5));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v2s16_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".b01", ".b23"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 1) << 0)];
static const char *lanes0_table[] = {
"", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 9, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v2s16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_mkvec_v4i8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".b2"
};
const char *lane0 = lane0_table[_BITS(bits, 12, 1)];
static const char *lane1_table[] = {
"", ".b2"
};
const char *lane1 = lane1_table[_BITS(bits, 13, 1)];
static const char *lane2_table[] = {
"", ".b2"
};
const char *lane2 = lane2_table[_BITS(bits, 14, 1)];
static const char *lane3_table[] = {
"", ".b2"
};
const char *lane3 = lane3_table[_BITS(bits, 15, 1)];
fputs("*MKVEC.v4i8", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(lane1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lane2, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs(lane3, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_clper_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane_op_table[] = {
"", ".xor", ".accumulate", ".shift"
};
const char *lane_op = lane_op_table[_BITS(bits, 6, 2)];
static const char *subgroup_table[] = {
".subgroup2", ".subgroup4", ".subgroup8", ".reserved"
};
const char *subgroup = subgroup_table[_BITS(bits, 8, 2)];
static const char *inactive_result_table[] = {
".zero", ".umax", ".i1", ".v2i1", ".smin", ".smax", ".v2smin", ".v2smax", ".v4smin", ".v4smax", ".f1", ".v2f1", ".infn", ".inf", ".v2infn", ".v2inf"
};
const char *inactive_result = inactive_result_table[_BITS(bits, 10, 4)];
fputs("+CLPER.i32", fp);
fputs(lane_op, fp);
fputs(subgroup, fp);
fputs(inactive_result, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0x7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_atom_pre_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *atom_opc_table[] = {
".aaddu", ".aadds", ".aadd", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".asmin", ".asmax", ".aumin", ".aumax", ".aand", ".aor", ".axor", ".reserved"
};
const char *atom_opc = atom_opc_table[_BITS(bits, 9, 4)];
fputs("*ATOM_PRE.i64", fp);
fputs(atom_opc, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_v2u16_to_v2f16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 4, 2) << 0)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 6, 2)];
fputs("+V2U16_TO_V2F16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frexpm_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg0_table[] = {
""
};
const char *neg0 = neg0_table[0];
static const char *log_table[] = {
""
};
const char *log = log_table[0];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 6, 1)];
static const char *sqrt_table[] = {
"", ".sqrt"
};
const char *sqrt = sqrt_table[_BITS(bits, 7, 1)];
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
fputs("+FREXPM.f32", fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(abs0, fp);
fputs(widen0, fp);
fputs(neg0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_texs_2d_f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *skip_table[] = {
"", ".skip"
};
const char *skip = skip_table[_BITS(bits, 9, 1)];
static const char *lod_mode_table[] = {
".computed_lod", ""
};
const char *lod_mode = lod_mode_table[_BITS(bits, 13, 1)];
fputs("+TEXS_2D.f16", fp);
fputs(skip, fp);
fputs(lod_mode, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", texture_index:%u", _BITS(bits, 6, 3));
fprintf(fp, ", sampler_index:%u", _BITS(bits, 10, 3));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_blend(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+BLEND", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_v2f16_to_v2u16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 4, 2) << 0)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 6, 2)];
fputs("+V2F16_TO_V2U16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_u16_to_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 1)];
fputs("*U16_TO_U32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branch_f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *widen0_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h1", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h1", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h1", ".h1", ".reserved", ".reserved", ".reserved"
};
static const char *widen0_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h1", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h1", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h1", ".h1", ".reserved", ".reserved", ".reserved"
};
const char *widen0 = ordering ? widen0_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen0_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *cmpf_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".eq", ".eq", ".ne", ".eq", ".reserved", ".reserved", ".reserved", ".reserved", ".gt", ".gt", ".ge", ".gt", ".reserved", ".reserved", ".reserved", ".reserved", ".lt", ".lt", ".le", ".lt", ".reserved", ".reserved", ".reserved"
};
static const char *cmpf_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ne", ".ne", ".ne", ".eq", ".reserved", ".reserved", ".reserved", ".reserved", ".ge", ".ge", ".ge", ".gt", ".reserved", ".reserved", ".reserved", ".reserved", ".le", ".le", ".le", ".lt", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = ordering ? cmpf_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : cmpf_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *widen1_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h0", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h0", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h0", ".h0", ".reserved", ".reserved", ".reserved"
};
static const char *widen1_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h0", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h0", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h0", ".h0", ".reserved", ".reserved", ".reserved"
};
const char *widen1 = ordering ? widen1_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen1_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
fputs("+BRANCH.f16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(widen1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_xor_v2i16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".reserved", ".b01", ".b23", ""
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 13, 1)];
fputs("*RSHIFT_XOR.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_rrot_double_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *bytes2_table[] = {
"", ".bytes2"
};
const char *bytes2 = bytes2_table[_BITS(bits, 9, 1)];
static const char *lane2_table[] = {
"", ".b2"
};
const char *lane2 = lane2_table[_BITS(bits, 10, 1)];
static const char *result_word_table[] = {
"", ".w1"
};
const char *result_word = result_word_table[_BITS(bits, 11, 1)];
fputs("*RROT_DOUBLE.i32", fp);
fputs(result_word, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(bytes2, fp);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_quiet_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+QUIET.f32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_branch_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *widen0_0[] = {
"", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen0_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen0 = ordering ? widen0_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen0_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *cmpf_0[] = {
".lt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".le", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ge", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".gt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *cmpf_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = ordering ? cmpf_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : cmpf_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *widen1_0[] = {
"", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen1_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen1 = ordering ? widen1_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen1_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
fputs("+BRANCH.s32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(widen1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i8_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *extend_table[] = {
".sext", ".zext"
};
const char *extend = extend_table[(_BITS(bits, 9, 1) << 0)];
static const char *lane_table[] = {
".w0", ".w0"
};
const char *lane = lane_table[(_BITS(bits, 9, 1) << 0)];
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i8", fp);
fputs(seg, fp);
fputs(lane, fp);
fputs(extend, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_fma_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
"", "", "", ".h0", ".h0", ".h1", ".h0", ".h1", "", "", "", ".h0", ".h0", ".h1", ".h0", ".h1"
};
const char *widen0 = widen0_table[(_BITS(bits, 9, 3) << 0) | (_BITS(bits, 17, 1) << 3)];
static const char *neg0_table[] = {
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
};
const char *neg0 = neg0_table[(_BITS(bits, 9, 3) << 0) | (_BITS(bits, 17, 1) << 3)];
static const char *widen1_table[] = {
"", ".h0", ".h1", ".h0", ".h1", ".h1", "", "", "", ".h0", ".h1", ".h0", ".h1", ".h1", "", ""
};
const char *widen1 = widen1_table[(_BITS(bits, 9, 3) << 0) | (_BITS(bits, 17, 1) << 3)];
static const char *neg1_table[] = {
"", "", "", "", "", "", "", "", ".neg", ".neg", ".neg", ".neg", ".neg", ".neg", ".neg", ".neg"
};
const char *neg1 = neg1_table[(_BITS(bits, 9, 3) << 0) | (_BITS(bits, 17, 1) << 3)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 12, 1)];
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[_BITS(bits, 13, 2)];
static const char *clamp_table[] = {
"", ".clamp_0_inf", ".clamp_m1_1", ".clamp_0_1"
};
const char *clamp = clamp_table[_BITS(bits, 15, 2)];
static const char *abs1_table[] = {
"", ".abs"
};
const char *abs1 = abs1_table[_BITS(bits, 19, 1)];
static const char *neg2_table[] = {
"", ".neg"
};
const char *neg2 = neg2_table[_BITS(bits, 18, 1)];
static const char *abs2_table[] = {
"", ".abs"
};
const char *abs2 = abs2_table[_BITS(bits, 20, 1)];
fputs("*FMA.f32", fp);
fputs(round, fp);
fputs(clamp, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(neg0, fp);
fputs(abs0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(widen1, fp);
fputs(neg1, fp);
fputs(abs1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(neg2, fp);
fputs(abs2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branch_diverg(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+BRANCH_DIVERG", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_s16_to_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 1)];
fputs("+S16_TO_F32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_or_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane2_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane2 = lane2_table[_BITS(bits, 9, 2)];
static const char *not1_table[] = {
".not", ""
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*RSHIFT_OR.i32", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_store_i8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+STORE.i8", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_branch_u16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *cmpf_0[] = {
".reserved", ".reserved", ".reserved", ".lt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".le", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ge", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".gt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *cmpf_1[] = {
".reserved", ".lt", ".lt", ".lt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".le", ".le", ".le", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ge", ".ge", ".ge", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".gt", ".gt", ".gt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = ordering ? cmpf_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : cmpf_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *widen0_0[] = {
".reserved", ".reserved", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen0_1[] = {
".reserved", ".h0", ".h1", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen0 = ordering ? widen0_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen0_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *widen1_0[] = {
".reserved", ".reserved", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen1_1[] = {
".reserved", ".h0", ".h1", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen1 = ordering ? widen1_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen1_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
fputs("+BRANCH.u16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(widen1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_double_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *bytes2_table[] = {
"", ".bytes2"
};
const char *bytes2 = bytes2_table[_BITS(bits, 9, 1)];
static const char *lane2_table[] = {
"", ".b2"
};
const char *lane2 = lane2_table[_BITS(bits, 10, 1)];
static const char *result_word_table[] = {
"", ".w1"
};
const char *result_word = result_word_table[_BITS(bits, 11, 1)];
fputs("*LSHIFT_DOUBLE.i32", fp);
fputs(result_word, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(bytes2, fp);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_frexpm_v2f16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *sqrt_table[] = {
""
};
const char *sqrt = sqrt_table[0];
static const char *log_table[] = {
".log"
};
const char *log = log_table[0];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 6, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
fputs("*FREXPM.v2f16", fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(swz0, fp);
fputs(neg0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_dtsel_imm(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("*DTSEL_IMM", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fprintf(fp, ", table:%u", _BITS(bits, 3, 6));
fputs("\n", fp);
}
static void
bi_disasm_add_fatan_assist_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+FATAN_ASSIST.f32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_vn_asst1_f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *h_table[] = {
"", ".h"
};
const char *h = h_table[_BITS(bits, 9, 1)];
static const char *l_table[] = {
"", ".l"
};
const char *l = l_table[_BITS(bits, 10, 1)];
static const char *neg2_table[] = {
"", ".neg2"
};
const char *neg2 = neg2_table[_BITS(bits, 11, 1)];
fputs("*VN_ASST1.f16", fp);
fputs(h, fp);
fputs(l, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(neg2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i48(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i48", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_atom_post_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *atom_opc_table[] = {
".aaddu", ".aadds", ".aadd", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".asmin", ".asmax", ".aumin", ".aumax", ".aand", ".aor", ".axor", ".reserved"
};
const char *atom_opc = atom_opc_table[_BITS(bits, 6, 4)];
fputs("*ATOM_POST.i64", fp);
fputs(atom_opc, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_arshift_v2i16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".reserved", ".b01", ".b23", ""
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
fputs("*ARSHIFT.v2i16", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0x8 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_fadd_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
"", "", "", ".h0", ".h0", ".h1", ".h0", ".h1"
};
const char *widen0 = widen0_table[(_BITS(bits, 9, 3) << 0)];
static const char *widen1_table[] = {
"", ".h0", ".h1", ".h0", ".h1", ".h1", "", ""
};
const char *widen1 = widen1_table[(_BITS(bits, 9, 3) << 0)];
static const char *abs1_table[] = {
"", ".abs"
};
const char *abs1 = abs1_table[_BITS(bits, 6, 1)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 8, 1)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 12, 1)];
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[_BITS(bits, 13, 2)];
static const char *clamp_table[] = {
"", ".clamp_0_inf", ".clamp_m1_1", ".clamp_0_1"
};
const char *clamp = clamp_table[_BITS(bits, 15, 2)];
fputs("*FADD.f32", fp);
fputs(round, fp);
fputs(clamp, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(neg0, fp);
fputs(abs0, fp);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(abs1, fp);
fputs(neg1, fp);
fputs(widen1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_v2f32_to_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *abs1_table[] = {
"", ".abs", "", ".abs"
};
const char *abs1 = abs1_table[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *neg0_table[] = {
"", "", ".neg", ".neg"
};
const char *neg0 = neg0_table[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *neg1_table[] = {
"", "", ".neg", ".neg"
};
const char *neg1 = neg1_table[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *abs0_table[] = {
"", ".abs", "", ".abs"
};
const char *abs0 = abs0_table[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *clamp_table[] = {
"", ".clamp_0_inf", ".clamp_m1_1", ".clamp_0_1"
};
const char *clamp = clamp_table[_BITS(bits, 8, 2)];
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz", ".rtna", ".reserved", ".reserved", ".reserved"
};
const char *round = round_table[_BITS(bits, 10, 3)];
fputs("+V2F32_TO_V2F16", fp);
fputs(clamp, fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(abs1, fp);
fputs(neg1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_icmp_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[(_BITS(bits, 6, 1) << 0)];
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
fputs("+ICMP.s32", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_var_tex_f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *update_table[] = {
".store", ".retrieve", ".reserved", ".reserved"
};
const char *update = update_table[(_BITS(bits, 5, 2) << 0)];
static const char *sample_table[] = {
".center", "", ".reserved", ".reserved"
};
const char *sample = sample_table[(_BITS(bits, 5, 2) << 0)];
static const char *skip_table[] = {
"", ".skip"
};
const char *skip = skip_table[_BITS(bits, 7, 1)];
static const char *lod_mode_table[] = {
".computed_lod", ""
};
const char *lod_mode = lod_mode_table[_BITS(bits, 9, 1)];
fputs("+VAR_TEX.f16", fp);
fputs(update, fp);
fputs(skip, fp);
fputs(lod_mode, fp);
fputs(sample, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fprintf(fp, ", varying_index:%u", _BITS(bits, 0, 3));
fprintf(fp, ", texture_index:%u", _BITS(bits, 3, 2));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_f16_to_s32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 5, 1)];
fputs("+F16_TO_S32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_imul_v4i8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *replicate1_table[] = {
".b0000", ".b1111", ".b2222", ".b3333"
};
const char *replicate1 = replicate1_table[(_BITS(bits, 9, 2) << 0)];
static const char *replicate0_table[] = {
"", "", "", ""
};
const char *replicate0 = replicate0_table[(_BITS(bits, 9, 2) << 0)];
fputs("*IMUL.v4i8", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(replicate0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(replicate1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_fma_rscale_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg0_table[] = {
"", "", "", "", "", "", "", "", "", "", "", "", ".reserved", ".reserved", "", ""
};
const char *neg0 = neg0_table[(_BITS(bits, 16, 1) << 0) | (_BITS(bits, 12, 3) << 1)];
static const char *neg1_table[] = {
"", ".neg", "", ".neg", "", ".neg", "", ".neg", "", ".neg", "", ".neg", ".reserved", ".reserved", "", ".neg"
};
const char *neg1 = neg1_table[(_BITS(bits, 16, 1) << 0) | (_BITS(bits, 12, 3) << 1)];
static const char *clamp_table[] = {
"", "", ".clamp_0_inf", ".clamp_0_inf", ".clamp_m1_1", ".clamp_m1_1", ".clamp_0_1", ".clamp_0_1", "", "", "", "", ".reserved", ".reserved", "", ""
};
const char *clamp = clamp_table[(_BITS(bits, 16, 1) << 0) | (_BITS(bits, 12, 3) << 1)];
static const char *round_table[] = {
"", "", "", "", "", "", "", "", "", "", ".rtz", ".rtz", ".reserved", ".reserved", "", ""
};
const char *round = round_table[(_BITS(bits, 16, 1) << 0) | (_BITS(bits, 12, 3) << 1)];
static const char *special_table[] = {
"", "", "", "", "", "", "", "", ".n", ".n", ".n", ".n", ".reserved", ".reserved", ".left", ".left"
};
const char *special = special_table[(_BITS(bits, 16, 1) << 0) | (_BITS(bits, 12, 3) << 1)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 15, 1)];
static const char *neg2_table[] = {
"", ".neg"
};
const char *neg2 = neg2_table[_BITS(bits, 17, 1)];
fputs("*FMA_RSCALE.v2f16", fp);
fputs(round, fp);
fputs(clamp, fp);
fputs(special, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(neg0, fp);
fputs(abs0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(neg1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(neg2, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_v2s16_to_v2f16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 2)];
fputs("+V2S16_TO_V2F16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_var_flat_imm_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".auto"
};
const char *register_format = register_format_table[0];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 8, 2)];
static const char *function_table[] = {
".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".and", ".or"
};
const char *function = function_table[_BITS(bits, 0, 3)];
fputs("+LD_VAR_FLAT_IMM", fp);
fputs(vecsize, fp);
fputs(register_format, fp);
fputs(function, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fprintf(fp, ", index:%u", _BITS(bits, 3, 5));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_var_tex_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *update_table[] = {
".store", ".retrieve", ".reserved", ".reserved"
};
const char *update = update_table[(_BITS(bits, 5, 2) << 0)];
static const char *sample_table[] = {
".center", "", ".reserved", ".reserved"
};
const char *sample = sample_table[(_BITS(bits, 5, 2) << 0)];
static const char *skip_table[] = {
"", ".skip"
};
const char *skip = skip_table[_BITS(bits, 7, 1)];
static const char *lod_mode_table[] = {
".computed_lod", ""
};
const char *lod_mode = lod_mode_table[_BITS(bits, 9, 1)];
fputs("+VAR_TEX.f32", fp);
fputs(update, fp);
fputs(skip, fp);
fputs(lod_mode, fp);
fputs(sample, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fprintf(fp, ", varying_index:%u", _BITS(bits, 0, 3));
fprintf(fp, ", texture_index:%u", _BITS(bits, 3, 2));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_lea_attr_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".auto"
};
const char *register_format = register_format_table[0];
fputs("+LEA_ATTR", fp);
fputs(register_format, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_doorbell(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+DOORBELL", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_csel_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[(_BITS(bits, 12, 1) << 0)];
fputs("*CSEL.u32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_fma_iaddc_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("*IADDC.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v2s16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".h00", ".h11"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 1) << 0)];
static const char *lanes0_table[] = {
"", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 9, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v2s16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fadd_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *abs1_table[] = {
"", ".abs"
};
const char *abs1 = abs1_table[_BITS(bits, 6, 1)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 8, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 9, 2)];
static const char *swz1_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz1 = swz1_table[_BITS(bits, 11, 2)];
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[_BITS(bits, 13, 2)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 15, 1)];
fputs("+FADD.v2f16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs(swz0, fp);
fputs(abs0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(abs1, fp);
fputs(neg1, fp);
fputs(swz1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frexpm_v2f16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg0_table[] = {
""
};
const char *neg0 = neg0_table[0];
static const char *log_table[] = {
""
};
const char *log = log_table[0];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 6, 1)];
static const char *sqrt_table[] = {
"", ".sqrt"
};
const char *sqrt = sqrt_table[_BITS(bits, 7, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
fputs("+FREXPM.v2f16", fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(abs0, fp);
fputs(swz0, fp);
fputs(neg0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_frexpm_v2f16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg0_table[] = {
""
};
const char *neg0 = neg0_table[0];
static const char *log_table[] = {
""
};
const char *log = log_table[0];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 6, 1)];
static const char *sqrt_table[] = {
"", ".sqrt"
};
const char *sqrt = sqrt_table[_BITS(bits, 7, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
fputs("*FREXPM.v2f16", fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(swz0, fp);
fputs(neg0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_s32_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".b0", ".b1", ".b2", ".b3"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 2) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.s32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_v2u16_to_v2f16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 2)];
fputs("+V2U16_TO_V2F16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_s32_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".b0", ".b1", ".b2", ".b3"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 2) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.s32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v4u8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ""
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0)];
static const char *lanes0_table[] = {
".reserved", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v4u8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_eureka(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+EUREKA", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_lea_attr_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".f16", ".f32", ".s32", ".u32", ".s16", ".u16", ".f64", ".i64"
};
const char *register_format = register_format_table[(_BITS(bits, 11, 3) << 0)];
fputs("+LEA_ATTR", fp);
fputs(register_format, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_var_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".auto", ".auto", ".auto", ".auto", ".auto", ".reserved", ".reserved", ".reserved", ".auto", ".auto", ".auto", ".auto", ".auto", ".auto", ".reserved", ".reserved"
};
const char *register_format = register_format_table[(_BITS(bits, 10, 4) << 0)];
static const char *sample_table[] = {
".center", ".centroid", ".sample", ".explicit", "", ".reserved", ".reserved", ".reserved", ".center", ".centroid", ".center", ".centroid", ".sample", ".explicit", ".reserved", ".reserved"
};
const char *sample = sample_table[(_BITS(bits, 10, 4) << 0)];
static const char *update_table[] = {
".store", ".store", ".store", ".store", ".retrieve", ".reserved", ".reserved", ".reserved", ".conditional", ".conditional", ".clobber", ".clobber", ".clobber", ".clobber", ".reserved", ".reserved"
};
const char *update = update_table[(_BITS(bits, 10, 4) << 0)];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 8, 2)];
fputs("+LD_VAR", fp);
fputs(vecsize, fp);
fputs(update, fp);
fputs(register_format, fp);
fputs(sample, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_swz_v4i8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".b0000", ".b1111", ".b2222", ".b3333", ".b0011", ".b2233", ".b1032", ".b3210"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 3)];
fputs("+SWZ.v4i8", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_arshift_v2i16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b00", ".b11", ".b22", ".b33"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
fputs("*ARSHIFT.v2i16", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0x8 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v4u8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ""
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0)];
static const char *lanes0_table[] = {
".reserved", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v4u8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_s32_to_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 4, 2) << 0)];
fputs("+S32_TO_F32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_hadd_v4s8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtn", ".rtp"
};
const char *round = round_table[_BITS(bits, 12, 1)];
fputs("+HADD.v4s8", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_atom_c1_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *atom_opc_table[] = {
".ainc", ".adec", ".aumax1", ".asmax1", ".aor1", ".reserved", ".reserved", ".reserved"
};
const char *atom_opc = atom_opc_table[_BITS(bits, 6, 3)];
fputs("*ATOM_C1.i64", fp);
fputs(atom_opc, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_s32_to_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
fputs("+S32_TO_F32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_xor_v4i8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
""
};
const char *lanes2 = lanes2_table[0];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 13, 1)];
fputs("*RSHIFT_XOR.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_u8_to_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 2)];
fputs("*U8_TO_U32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v2s16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".h00", ".h11"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 1) << 0)];
static const char *lanes0_table[] = {
"", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 9, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v2s16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_store_i24(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+STORE.i24", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_fcos_table_u6(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *offset_table[] = {
"", ".offset"
};
const char *offset = offset_table[_BITS(bits, 4, 1)];
fputs("+FCOS_TABLE.u6", fp);
fputs(offset, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_xor_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane2_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane2 = lane2_table[_BITS(bits, 9, 2)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 13, 1)];
fputs("*LSHIFT_XOR.i32", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_seg_add(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", ".reserved", ".wgl", ".reserved", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 3, 3)];
static const char *preserve_null_table[] = {
"", ".preserve_null"
};
const char *preserve_null = preserve_null_table[_BITS(bits, 7, 1)];
fputs("*SEG_ADD", fp);
fputs(seg, fp);
fputs(preserve_null, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_csel_v2i16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".reserved", ".reserved", ".reserved", ".eq", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = cmpf_table[(_BITS(bits, 12, 3) << 0)];
fputs("*CSEL.v2i16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_fatan_table_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+FATAN_TABLE.f32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_logb_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
fputs("+LOGB.f32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_or_v4i8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b0000", ".b1111", ".b2222", ".b3333"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
".not", ""
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*LSHIFT_OR.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_atom_c1_return_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *atom_opc_table[] = {
".ainc", ".adec", ".aumax1", ".asmax1", ".aor1", ".reserved", ".reserved", ".reserved"
};
const char *atom_opc = atom_opc_table[_BITS(bits, 6, 3)];
fputs("*ATOM_C1_RETURN.i32", fp);
fputs(atom_opc, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_store_i48(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+STORE.i48", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_branchz_i16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".reserved", ".ne", ".ne", ".reserved", ".reserved", ".eq", ".eq", ".reserved"
};
const char *cmpf = cmpf_table[(_BITS(bits, 4, 2) << 0) | (_BITS(bits, 3, 1) << 2)];
static const char *widen0_table[] = {
".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved"
};
const char *widen0 = widen0_table[(_BITS(bits, 4, 2) << 0) | (_BITS(bits, 3, 1) << 2)];
fputs("+BRANCHZ.i16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_icmp_v2u16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[(_BITS(bits, 12, 1) << 0)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 6, 2)];
static const char *swz1_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz1 = swz1_table[_BITS(bits, 8, 2)];
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
fputs("+ICMP.v2u16", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(swz1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fexp_table_u4(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *adj_table[] = {
"", ".small", ".low", ".reserved"
};
const char *adj = adj_table[_BITS(bits, 3, 2)];
fputs("+FEXP_TABLE.u4", fp);
fputs(adj, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i64", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_ilogb_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
fputs("+ILOGB.f32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_imul_i32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen1_table[] = {
".h0", ".h1", ".h0", ".h1"
};
const char *widen1 = widen1_table[(_BITS(bits, 9, 1) << 0) | (_BITS(bits, 10, 1) << 1)];
static const char *extend1_table[] = {
".zext", ".zext", ".sext", ".sext"
};
const char *extend1 = extend1_table[(_BITS(bits, 9, 1) << 0) | (_BITS(bits, 10, 1) << 1)];
fputs("*IMUL.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(widen1, fp);
fputs(extend1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v4s8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".b0000", ".b1111", ".b2222", ".b3333"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 2) << 0)];
static const char *lanes0_table[] = {
"", "", "", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 9, 2) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v4s8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_and_v4i8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b0000", ".b1111", ".b2222", ".b3333"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
"", ".not"
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
".not", ""
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*LSHIFT_AND.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_store_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+STORE.i32", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_and_v2i16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b00", ".b11", ".b22", ".b33"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
"", ".not"
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
".not", ""
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*RSHIFT_AND.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frsq_approx_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
".h0", ".h1"
};
const char *widen0 = widen0_table[(_BITS(bits, 7, 1) << 0)];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
static const char *divzero_table[] = {
"", ".divzero"
};
const char *divzero = divzero_table[_BITS(bits, 5, 1)];
fputs("+FRSQ_APPROX.f32", fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v2u16_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".b01", ".reserved", ".b23"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *lanes0_table[] = {
".reserved", "", ".reserved", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v2u16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_icmp_v4u8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[(_BITS(bits, 6, 1) << 0)];
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
fputs("+ICMP.v4u8", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_cvt(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 9, 2)];
fputs("+LD_CVT", fp);
fputs(vecsize, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_hadd_v2s16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtn", ".rtp"
};
const char *round = round_table[_BITS(bits, 12, 1)];
static const char *swap1_table[] = {
"", ".h10"
};
const char *swap1 = swap1_table[_BITS(bits, 9, 1)];
static const char *swap0_table[] = {
"", ".h10"
};
const char *swap0 = swap0_table[_BITS(bits, 10, 1)];
fputs("+HADD.v2s16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swap0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(swap1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_frshift_double_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *bytes2_table[] = {
"", ".bytes2"
};
const char *bytes2 = bytes2_table[_BITS(bits, 9, 1)];
static const char *lane2_table[] = {
"", ".b2"
};
const char *lane2 = lane2_table[_BITS(bits, 10, 1)];
fputs("*FRSHIFT_DOUBLE.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(bytes2, fp);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branchz_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".ne", ".eq"
};
const char *cmpf = cmpf_table[(_BITS(bits, 3, 1) << 0)];
fputs("+BRANCHZ.i32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_u32_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".b0", ".reserved", ".b1", ".reserved", ".b2", ".reserved", ".b3"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 2) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.u32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_st_cvt(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 9, 2)];
fputs("+ST_CVT", fp);
fputs(vecsize, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_frexpe_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *log_table[] = {
""
};
const char *log = log_table[0];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 6, 1)];
static const char *sqrt_table[] = {
"", ".sqrt"
};
const char *sqrt = sqrt_table[_BITS(bits, 8, 1)];
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
fputs("+FREXPE.f32", fp);
fputs(neg, fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_arshift_v4i8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b0000", ".b1111", ".b2222", ".b3333"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
fputs("*ARSHIFT.v4i8", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0x8 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branchz_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".lt", ".le", ".ge", ".gt", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = cmpf_table[(_BITS(bits, 9, 3) << 0)];
fputs("+BRANCHZ.u32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_s32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".h0", ".h1"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.s32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_f32_to_s32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
fputs("+F32_TO_S32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_fpow_sc_apply(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+FPOW_SC_APPLY", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_seg_sub(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", ".reserved", ".wgl", ".reserved", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 3, 3)];
static const char *preserve_null_table[] = {
"", ".preserve_null"
};
const char *preserve_null = preserve_null_table[_BITS(bits, 7, 1)];
fputs("*SEG_SUB", fp);
fputs(seg, fp);
fputs(preserve_null, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_mov_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("*MOV.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lrot_double_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *bytes2_table[] = {
"", ".bytes2"
};
const char *bytes2 = bytes2_table[_BITS(bits, 9, 1)];
static const char *lane2_table[] = {
"", ".b2"
};
const char *lane2 = lane2_table[_BITS(bits, 10, 1)];
static const char *result_word_table[] = {
"", ".w1"
};
const char *result_word = result_word_table[_BITS(bits, 11, 1)];
fputs("*LROT_DOUBLE.i32", fp);
fputs(result_word, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(bytes2, fp);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_fcmp_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *abs1_0[] = {
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ".reserved"
};
static const char *abs1_1[] = {
"", ".abs", "", ".abs", "", ".abs", "", ".abs", "", ".abs", "", ".abs", "", ".abs", ".reserved", ".reserved"
};
const char *abs1 = ordering ? abs1_1[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 13, 3) << 1)] : abs1_0[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 13, 3) << 1)];
static const char *cmpf_0[] = {
".eq", ".eq", ".gt", ".gt", ".ge", ".ge", ".ne", ".ne", ".lt", ".lt", ".le", ".le", ".gtlt", ".gtlt", ".total", ".reserved"
};
static const char *cmpf_1[] = {
".eq", ".eq", ".gt", ".gt", ".ge", ".ge", ".ne", ".ne", ".lt", ".lt", ".le", ".le", ".gtlt", ".gtlt", ".reserved", ".reserved"
};
const char *cmpf = ordering ? cmpf_1[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 13, 3) << 1)] : cmpf_0[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 13, 3) << 1)];
static const char *abs0_0[] = {
"", ".abs", "", ".abs", "", ".abs", "", ".abs", "", ".abs", "", ".abs", "", ".abs", "", ".reserved"
};
static const char *abs0_1[] = {
".abs", ".abs", ".abs", ".abs", ".abs", ".abs", ".abs", ".abs", ".abs", ".abs", ".abs", ".abs", ".abs", ".abs", ".reserved", ".reserved"
};
const char *abs0 = ordering ? abs0_1[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 13, 3) << 1)] : abs0_0[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 13, 3) << 1)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 8, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 9, 2)];
static const char *swz1_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz1 = swz1_table[_BITS(bits, 11, 2)];
static const char *result_type_table[] = {
"", ".f1", ".m1", ".reserved"
};
const char *result_type = result_type_table[_BITS(bits, 16, 2)];
fputs("*FCMP.v2f16", fp);
fputs(cmpf, fp);
fputs(result_type, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(swz0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(abs1, fp);
fputs(neg1, fp);
fputs(swz1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frcbrt_approx_b_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+FRCBRT_APPROX_B.f32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v2u16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", "", ".reserved", ".h10", ".reserved", "", ".reserved", ".h10"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1) | (_BITS(bits, 10, 1) << 2)];
static const char *lanes0_table[] = {
".reserved", "", ".reserved", "", ".reserved", ".h10", ".reserved", ".h10"
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1) | (_BITS(bits, 10, 1) << 2)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v2u16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_u32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ""
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.u32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_icmp_v2i16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 6, 2)];
static const char *swz1_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz1 = swz1_table[_BITS(bits, 8, 2)];
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
static const char *cmpf_table[] = {
".eq", ".ne"
};
const char *cmpf = cmpf_table[_BITS(bits, 11, 1)];
fputs("+ICMP.v2i16", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(swz1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_or_v2i16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".reserved", ".b01", ".b23", ""
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
".not", ""
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*RSHIFT_OR.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_jump(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+JUMP", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fround_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 7, 1)];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 8, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[_BITS(bits, 9, 2)];
fputs("+FROUND.v2f16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branch_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *widen0_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen0_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen0 = ordering ? widen0_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen0_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *cmpf_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".eq", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *cmpf_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ne", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = ordering ? cmpf_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : cmpf_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *widen1_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen1_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen1 = ordering ? widen1_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen1_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
fputs("+BRANCH.i32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(widen1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_u32_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".b0", ".reserved", ".b1", ".reserved", ".b2", ".reserved", ".b3"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 2) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.u32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_s32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
""
};
const char *lanes1 = lanes1_table[0];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.s32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_vn_asst2_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *scale_table[] = {
""
};
const char *scale = scale_table[0];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 3, 1)];
fputs("+VN_ASST2.f32", fp);
fputs(scale, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_atom_c1_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *atom_opc_table[] = {
".ainc", ".adec", ".aumax1", ".asmax1", ".aor1", ".reserved", ".reserved", ".reserved"
};
const char *atom_opc = atom_opc_table[_BITS(bits, 6, 3)];
fputs("*ATOM_C1.i32", fp);
fputs(atom_opc, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_and_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane2_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane2 = lane2_table[_BITS(bits, 9, 2)];
static const char *not1_table[] = {
"", ".not"
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
".not", ""
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*RSHIFT_AND.i32", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_swz_v2i16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".h00", ".h10", ".reserved", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 2)];
fputs("+SWZ.v2i16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_vn_asst1_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg2_table[] = {
"", ".neg2"
};
const char *neg2 = neg2_table[_BITS(bits, 12, 1)];
fputs("*VN_ASST1.f32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(neg2, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_seg_sub(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", ".reserved", ".wgl", ".reserved", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 3, 3)];
static const char *preserve_null_table[] = {
"", ".preserve_null"
};
const char *preserve_null = preserve_null_table[_BITS(bits, 7, 1)];
fputs("+SEG_SUB", fp);
fputs(seg, fp);
fputs(preserve_null, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_ldexp_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz", ".rtna", ".reserved", ".inf", ".inf0"
};
const char *round = round_table[_BITS(bits, 6, 3)];
fputs("+LDEXP.f32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_icmpi_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[_BITS(bits, 6, 1)];
fputs("+ICMPI.u32", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_clz_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *mask_table[] = {
"", ".mask"
};
const char *mask = mask_table[_BITS(bits, 3, 1)];
fputs("*CLZ.u32", fp);
fputs(mask, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branchz_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".lt", ".le", ".ge", ".gt", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = cmpf_table[(_BITS(bits, 9, 3) << 0)];
fputs("+BRANCHZ.s32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iabs_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+IABS.s32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_or_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane2_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane2 = lane2_table[_BITS(bits, 9, 2)];
static const char *not1_table[] = {
".not", ""
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*LSHIFT_OR.i32", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_csel_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[(_BITS(bits, 12, 1) << 0)];
fputs("*CSEL.s32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_fma_frexpm_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg0_table[] = {
""
};
const char *neg0 = neg0_table[0];
static const char *log_table[] = {
""
};
const char *log = log_table[0];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 6, 1)];
static const char *sqrt_table[] = {
"", ".sqrt"
};
const char *sqrt = sqrt_table[_BITS(bits, 7, 1)];
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
fputs("*FREXPM.f32", fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(widen0, fp);
fputs(neg0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_frexpe_v2f16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *sqrt_table[] = {
""
};
const char *sqrt = sqrt_table[0];
static const char *log_table[] = {
".log"
};
const char *log = log_table[0];
static const char *neg_table[] = {
""
};
const char *neg = neg_table[0];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
fputs("*FREXPE.v2f16", fp);
fputs(neg, fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_csel_v2u16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[(_BITS(bits, 12, 1) << 0)];
fputs("*CSEL.v2u16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i8_3(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *extend_table[] = {
".sext", ".zext"
};
const char *extend = extend_table[(_BITS(bits, 9, 1) << 0)];
static const char *lane_table[] = {
".d0", ".d0"
};
const char *lane = lane_table[(_BITS(bits, 9, 1) << 0)];
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i8", fp);
fputs(seg, fp);
fputs(lane, fp);
fputs(extend, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v2u16_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".b01", ".reserved", ".b23"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *lanes0_table[] = {
".reserved", "", ".reserved", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v2u16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_st_tile(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 9, 2)];
fputs("+ST_TILE", fp);
fputs(vecsize, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_flog_table_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *mode_table[] = {
".red"
};
const char *mode = mode_table[0];
static const char *precision_table[] = {
""
};
const char *precision = precision_table[0];
static const char *widen0_table[] = {
""
};
const char *widen0 = widen0_table[0];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
static const char *divzero_table[] = {
"", ".divzero"
};
const char *divzero = divzero_table[_BITS(bits, 5, 1)];
fputs("+FLOG_TABLE.f32", fp);
fputs(mode, fp);
fputs(precision, fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v2s16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
"", ".h10", "", ".h10"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 1) << 0) | (_BITS(bits, 10, 1) << 1)];
static const char *lanes0_table[] = {
"", "", ".h10", ".h10"
};
const char *lanes0 = lanes0_table[(_BITS(bits, 9, 1) << 0) | (_BITS(bits, 10, 1) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v2s16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_texs_cube_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *skip_table[] = {
"", ".skip"
};
const char *skip = skip_table[_BITS(bits, 9, 1)];
fputs("+TEXS_CUBE.f32", fp);
fputs(skip, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", sampler_index:%u", _BITS(bits, 10, 2));
fprintf(fp, ", texture_index:%u", _BITS(bits, 12, 2));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_v2f32_to_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *abs1_table[] = {
"", ".abs", "", ".abs"
};
const char *abs1 = abs1_table[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *neg0_table[] = {
"", "", ".neg", ".neg"
};
const char *neg0 = neg0_table[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *neg1_table[] = {
"", "", ".neg", ".neg"
};
const char *neg1 = neg1_table[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *abs0_table[] = {
"", ".abs", "", ".abs"
};
const char *abs0 = abs0_table[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *clamp_table[] = {
"", ".clamp_0_inf", ".clamp_m1_1", ".clamp_0_1"
};
const char *clamp = clamp_table[_BITS(bits, 8, 2)];
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz", ".rtna", ".reserved", ".reserved", ".reserved"
};
const char *round = round_table[_BITS(bits, 10, 3)];
fputs("*V2F32_TO_V2F16", fp);
fputs(clamp, fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(abs1, fp);
fputs(neg1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i16_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *extend_table[] = {
".sext", ".zext"
};
const char *extend = extend_table[(_BITS(bits, 9, 1) << 0)];
static const char *lane_table[] = {
".d0", ".d0"
};
const char *lane = lane_table[(_BITS(bits, 9, 1) << 0)];
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i16", fp);
fputs(seg, fp);
fputs(lane, fp);
fputs(extend, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_v2s8_to_v2s16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".b00", ".b10", ".b20", ".b30", "", ".b11", ".b21", ".b31", ".b02", ".b12", ".b22", ".b32", ".b03", ".b13", ".b23", ".b33"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 4)];
fputs("+V2S8_TO_V2S16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_or_v2i16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b00", ".b11", ".b22", ".b33"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
".not", ""
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*RSHIFT_OR.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i24(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i24", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_imul_v2i16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 9, 2)];
static const char *swz1_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz1 = swz1_table[_BITS(bits, 11, 2)];
fputs("*IMUL.v2i16", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(swz0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(swz1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_f32_to_s32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 4, 2) << 0)];
fputs("+F32_TO_S32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v2s16_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".b01", ".b23"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 1) << 0)];
static const char *lanes0_table[] = {
"", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 9, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v2s16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_var_flat_imm_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".f32", ".u32", ".f16", ".s32"
};
const char *register_format = register_format_table[(_BITS(bits, 10, 1) << 0) | (_BITS(bits, 19, 1) << 1)];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 8, 2)];
static const char *function_table[] = {
".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".and", ".or"
};
const char *function = function_table[_BITS(bits, 0, 3)];
fputs("+LD_VAR_FLAT_IMM", fp);
fputs(vecsize, fp);
fputs(register_format, fp);
fputs(function, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fprintf(fp, ", index:%u", _BITS(bits, 3, 5));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_frexpe_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *sqrt_table[] = {
""
};
const char *sqrt = sqrt_table[0];
static const char *log_table[] = {
".log"
};
const char *log = log_table[0];
static const char *neg_table[] = {
""
};
const char *neg = neg_table[0];
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
fputs("+FREXPE.f32", fp);
fputs(neg, fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_cubeface1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg2_table[] = {
"", ".neg"
};
const char *neg2 = neg2_table[(_BITS(bits, 9, 1) << 0)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[(_BITS(bits, 9, 1) << 0)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[(_BITS(bits, 9, 1) << 0)];
fputs("*CUBEFACE1", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(neg0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(neg1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(neg2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_and_v4i8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
""
};
const char *lanes2 = lanes2_table[0];
static const char *not1_table[] = {
"", ".not"
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
".not", ""
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*RSHIFT_AND.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_lea_attr_imm_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".auto"
};
const char *register_format = register_format_table[0];
fputs("+LEA_ATTR_IMM", fp);
fputs(register_format, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", attribute_index:%u", _BITS(bits, 6, 4));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_s16_to_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 1)];
fputs("*S16_TO_S32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_icmpm_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+ICMPM.i32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_atom_c_return_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *atom_opc_table[] = {
".aaddu", ".aadds", ".aadd", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".asmin", ".asmax", ".aumin", ".aumax", ".aand", ".aor", ".axor", ".reserved"
};
const char *atom_opc = atom_opc_table[_BITS(bits, 9, 4)];
fputs("*ATOM_C_RETURN.i64", fp);
fputs(atom_opc, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v4s8_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".b0101", ".b2323"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 1) << 0)];
static const char *lanes0_table[] = {
"", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 9, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v4s8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_bitrev_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("*BITREV.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_u32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ""
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.u32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_arshift_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane2_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane2 = lane2_table[_BITS(bits, 9, 2)];
fputs("*ARSHIFT.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0x8 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_frexpe_v2f16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *log_table[] = {
""
};
const char *log = log_table[0];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 6, 1)];
static const char *sqrt_table[] = {
"", ".sqrt"
};
const char *sqrt = sqrt_table[_BITS(bits, 8, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
fputs("*FREXPE.v2f16", fp);
fputs(neg, fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_f16_to_s32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 4, 2) << 0)];
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 7, 1)];
fputs("+F16_TO_S32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_vn_asst2_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 3, 1)];
fputs("+VN_ASST2.v2f16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_mkvec_v2i16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 6, 1)];
static const char *lane1_table[] = {
"", ".h1"
};
const char *lane1 = lane1_table[_BITS(bits, 7, 1)];
fputs("+MKVEC.v2i16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lane1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ldexp_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz", ".rtna", ".reserved", ".inf", ".inf0"
};
const char *round = round_table[_BITS(bits, 6, 3)];
fputs("+LDEXP.v2f16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_texc(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *skip_table[] = {
"", ".skip"
};
const char *skip = skip_table[_BITS(bits, 9, 1)];
fputs("+TEXC", fp);
fputs(skip, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_frexpm_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *sqrt_table[] = {
""
};
const char *sqrt = sqrt_table[0];
static const char *log_table[] = {
".log"
};
const char *log = log_table[0];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 6, 1)];
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
fputs("+FREXPM.f32", fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(abs0, fp);
fputs(widen0, fp);
fputs(neg0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_and_v2i16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".reserved", ".b01", ".b23", ""
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
"", ".not"
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
".not", ""
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*RSHIFT_AND.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_flog_table_f32_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *divzero_table[] = {
"", ""
};
const char *divzero = divzero_table[(_BITS(bits, 5, 1) << 0)];
static const char *mode_table[] = {
".base2", ".natural"
};
const char *mode = mode_table[(_BITS(bits, 5, 1) << 0)];
static const char *precision_table[] = {
"", ""
};
const char *precision = precision_table[(_BITS(bits, 5, 1) << 0)];
static const char *widen0_table[] = {
"", ""
};
const char *widen0 = widen0_table[(_BITS(bits, 5, 1) << 0)];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
fputs("+FLOG_TABLE.f32", fp);
fputs(mode, fp);
fputs(precision, fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frsq_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
"", ".reserved"
};
const char *widen0 = widen0_table[(_BITS(bits, 6, 1) << 0)];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
fputs("+FRSQ.f32", fp);
fputs(neg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_fmul_cslice(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 6, 1)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 7, 1)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 8, 1)];
fputs("*FMUL_CSLICE", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_acmpxchg_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
"", ".wgl"
};
const char *seg = seg_table[_BITS(bits, 9, 1)];
fputs("+ACMPXCHG.i32", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_branch_lowbits_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+BRANCH_LOWBITS.f32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branchz_f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ne", ".ne", ".reserved", ".reserved", ".eq", ".eq", ".reserved", ".reserved", ".ge", ".ge", ".reserved", ".reserved", ".gt", ".gt", ".reserved", ".reserved", ".le", ".le", ".reserved", ".reserved", ".lt", ".lt", ".reserved"
};
const char *cmpf = cmpf_table[(_BITS(bits, 4, 2) << 0) | (_BITS(bits, 3, 1) << 2) | (_BITS(bits, 9, 3) << 3)];
static const char *widen0_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved"
};
const char *widen0 = widen0_table[(_BITS(bits, 4, 2) << 0) | (_BITS(bits, 3, 1) << 2) | (_BITS(bits, 9, 3) << 3)];
fputs("+BRANCHZ.f16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_barrier(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+BARRIER", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs("\n", fp);
}
static void
bi_disasm_fma_atom_c_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *atom_opc_table[] = {
".aaddu", ".aadds", ".aadd", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".asmin", ".asmax", ".aumin", ".aumax", ".aand", ".aor", ".axor", ".reserved"
};
const char *atom_opc = atom_opc_table[_BITS(bits, 9, 4)];
fputs("*ATOM_C.i64", fp);
fputs(atom_opc, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_lea_attr_tex_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".auto"
};
const char *register_format = register_format_table[0];
fputs("+LEA_ATTR_TEX", fp);
fputs(register_format, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_xor_v4i8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b0000", ".b1111", ".b2222", ".b3333"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 13, 1)];
fputs("*RSHIFT_XOR.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branch_no_diverg(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+BRANCH_NO_DIVERG", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_lea_tex_imm(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *format_table[] = {
".u16", ".u32"
};
const char *format = format_table[_BITS(bits, 11, 1)];
fputs("+LEA_TEX_IMM", fp);
fputs(format, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", texture_index:%u", _BITS(bits, 6, 5));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_xor_v2i16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b00", ".b11", ".b22", ".b33"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 13, 1)];
fputs("*RSHIFT_XOR.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frcp_approx_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
".h0", ".h1"
};
const char *widen0 = widen0_table[(_BITS(bits, 7, 1) << 0)];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
static const char *divzero_table[] = {
"", ".divzero"
};
const char *divzero = divzero_table[_BITS(bits, 5, 1)];
fputs("+FRCP_APPROX.f32", fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fpow_sc_det_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *func_table[] = {
".pow", ".powr", ".pown", ".rootn"
};
const char *func = func_table[_BITS(bits, 7, 2)];
fputs("+FPOW_SC_DET.f32", fp);
fputs(func, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_f16_to_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 3, 1)];
fputs("*F16_TO_F32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_texs_2d_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *skip_table[] = {
"", ".skip"
};
const char *skip = skip_table[_BITS(bits, 9, 1)];
static const char *lod_mode_table[] = {
".computed_lod", ""
};
const char *lod_mode = lod_mode_table[_BITS(bits, 13, 1)];
fputs("+TEXS_2D.f32", fp);
fputs(skip, fp);
fputs(lod_mode, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", texture_index:%u", _BITS(bits, 6, 3));
fprintf(fp, ", sampler_index:%u", _BITS(bits, 10, 3));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_shaddxl_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane1_table[] = {
".h0", ".h1", "", ".reserved"
};
const char *lane1 = lane1_table[_BITS(bits, 9, 2)];
fputs("*SHADDXL.u32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(lane1, fp);
fprintf(fp, ", shift:%u", _BITS(bits, 6, 3));
fputs("\n", fp);
}
static void
bi_disasm_add_texs_cube_f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *skip_table[] = {
"", ".skip"
};
const char *skip = skip_table[_BITS(bits, 9, 1)];
fputs("+TEXS_CUBE.f16", fp);
fputs(skip, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", sampler_index:%u", _BITS(bits, 10, 2));
fprintf(fp, ", texture_index:%u", _BITS(bits, 12, 2));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *extend_table[] = {
".sext", ".zext"
};
const char *extend = extend_table[(_BITS(bits, 9, 1) << 0)];
static const char *lane_table[] = {
".d0", ".d0"
};
const char *lane = lane_table[(_BITS(bits, 9, 1) << 0)];
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i32", fp);
fputs(seg, fp);
fputs(lane, fp);
fputs(extend, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_branch_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *widen0_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen0_1[] = {
"", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen0 = ordering ? widen0_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen0_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *cmpf_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *cmpf_1[] = {
".lt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".le", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ge", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".gt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = ordering ? cmpf_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : cmpf_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *widen1_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen1_1[] = {
"", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen1 = ordering ? widen1_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen1_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
fputs("+BRANCH.u32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(widen1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_v2u8_to_v2u16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".b00", ".b10", ".b20", ".b30", "", ".b11", ".b21", ".b31", ".b02", ".b12", ".b22", ".b32", ".b03", ".b13", ".b23", ".b33"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 4)];
fputs("+V2U8_TO_V2U16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_icmp_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[(_BITS(bits, 6, 1) << 0)];
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
fputs("+ICMP.u32", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_or_v4i8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b0000", ".b1111", ".b2222", ".b3333"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
".not", ""
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*RSHIFT_OR.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_var_flat_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".auto"
};
const char *register_format = register_format_table[0];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 8, 2)];
static const char *function_table[] = {
".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".and", ".or"
};
const char *function = function_table[_BITS(bits, 0, 3)];
fputs("+LD_VAR_FLAT", fp);
fputs(vecsize, fp);
fputs(register_format, fp);
fputs(function, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_seg_add(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", ".reserved", ".wgl", ".reserved", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 3, 3)];
static const char *preserve_null_table[] = {
"", ".preserve_null"
};
const char *preserve_null = preserve_null_table[_BITS(bits, 7, 1)];
fputs("+SEG_ADD", fp);
fputs(seg, fp);
fputs(preserve_null, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_frsq_approx_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
""
};
const char *widen0 = widen0_table[0];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
static const char *divzero_table[] = {
"", ".divzero"
};
const char *divzero = divzero_table[_BITS(bits, 5, 1)];
fputs("+FRSQ_APPROX.f32", fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_xor_v4i8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
""
};
const char *lanes2 = lanes2_table[0];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 13, 1)];
fputs("*LSHIFT_XOR.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_cubeface2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+CUBEFACE2", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_tile(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 9, 2)];
fputs("+LD_TILE", fp);
fputs(vecsize, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_shaddxh_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+SHADDXH.i32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_and_v4i8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
""
};
const char *lanes2 = lanes2_table[0];
static const char *not1_table[] = {
"", ".not"
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
".not", ""
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*LSHIFT_AND.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_and_v2i16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".reserved", ".b01", ".b23", ""
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
"", ".not"
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
".not", ""
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*LSHIFT_AND.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v4u8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".b0000", ".reserved", ".b1111", ".reserved", ".b2222", ".reserved", ".b3333"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 2) << 1)];
static const char *lanes0_table[] = {
".reserved", "", ".reserved", "", ".reserved", "", ".reserved", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 2) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v4u8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_var_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".f32", ".f16", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *register_format = register_format_table[(_BITS(bits, 19, 1) << 0) | (_BITS(bits, 10, 4) << 1)];
static const char *sample_table[] = {
".center", ".center", ".centroid", ".centroid", ".sample", ".sample", ".explicit", ".explicit", "", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".center", ".center", ".centroid", ".centroid", ".center", ".center", ".centroid", ".centroid", ".sample", ".sample", ".explicit", ".explicit", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *sample = sample_table[(_BITS(bits, 19, 1) << 0) | (_BITS(bits, 10, 4) << 1)];
static const char *update_table[] = {
".store", ".store", ".store", ".store", ".store", ".store", ".store", ".store", ".retrieve", ".retrieve", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".conditional", ".conditional", ".conditional", ".conditional", ".clobber", ".clobber", ".clobber", ".clobber", ".clobber", ".clobber", ".clobber", ".clobber", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *update = update_table[(_BITS(bits, 19, 1) << 0) | (_BITS(bits, 10, 4) << 1)];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 8, 2)];
fputs("+LD_VAR", fp);
fputs(vecsize, fp);
fputs(update, fp);
fputs(register_format, fp);
fputs(sample, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_v2s8_to_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".b00", ".b10", ".b20", ".b30", "", ".b11", ".b21", ".b31", ".b02", ".b12", ".b22", ".b32", ".b03", ".b13", ".b23", ".b33"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 4)];
fputs("+V2S8_TO_V2F16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_csel_v2s16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[(_BITS(bits, 12, 1) << 0)];
fputs("*CSEL.v2s16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_attr_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".auto"
};
const char *register_format = register_format_table[0];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 11, 2)];
fputs("+LD_ATTR", fp);
fputs(register_format, fp);
fputs(vecsize, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_quiet_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 2)];
fputs("*QUIET.v2f16", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_fadd_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *abs1_0[] = {
"", ""
};
static const char *abs1_1[] = {
"", ".abs"
};
const char *abs1 = ordering ? abs1_1[(_BITS(bits, 6, 1) << 0)] : abs1_0[(_BITS(bits, 6, 1) << 0)];
static const char *abs0_0[] = {
"", ".abs"
};
static const char *abs0_1[] = {
".abs", ".abs"
};
const char *abs0 = ordering ? abs0_1[(_BITS(bits, 6, 1) << 0)] : abs0_0[(_BITS(bits, 6, 1) << 0)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 8, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 9, 2)];
static const char *swz1_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz1 = swz1_table[_BITS(bits, 11, 2)];
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[_BITS(bits, 13, 2)];
static const char *clamp_table[] = {
"", ".clamp_0_inf", ".clamp_m1_1", ".clamp_0_1"
};
const char *clamp = clamp_table[_BITS(bits, 15, 2)];
fputs("*FADD.v2f16", fp);
fputs(round, fp);
fputs(clamp, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(swz0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(abs1, fp);
fputs(neg1, fp);
fputs(swz1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_s8_to_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 2)];
fputs("+S8_TO_S32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_hadd_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtn", ".rtp"
};
const char *round = round_table[_BITS(bits, 12, 1)];
fputs("+HADD.s32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_idp_v4i8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *sign0_table[] = {
".zext", ".sext"
};
const char *sign0 = sign0_table[_BITS(bits, 9, 1)];
static const char *sign1_table[] = {
".zext", ".sext"
};
const char *sign1 = sign1_table[_BITS(bits, 10, 1)];
fputs("*IDP.v4i8", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(sign0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(sign1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_var_flat_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".f32", ".u32", ".f16", ".s32"
};
const char *register_format = register_format_table[(_BITS(bits, 10, 1) << 0) | (_BITS(bits, 19, 1) << 1)];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 8, 2)];
static const char *function_table[] = {
".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".and", ".or"
};
const char *function = function_table[_BITS(bits, 0, 3)];
fputs("+LD_VAR_FLAT", fp);
fputs(vecsize, fp);
fputs(register_format, fp);
fputs(function, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_nop_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+NOP.i32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs("\n", fp);
}
static void
bi_disasm_fma_csel_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".eq", ".gt", ".ge", ".reserved"
};
const char *cmpf = cmpf_table[(_BITS(bits, 12, 2) << 0)];
fputs("*CSEL.v2f16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_fma_nop_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("*NOP.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs("\n", fp);
}
static void
bi_disasm_add_u8_to_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 2)];
fputs("+U8_TO_F32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fatan_table_f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane1_table[] = {
"", ".h1"
};
const char *lane1 = lane1_table[_BITS(bits, 6, 1)];
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 7, 1)];
fputs("+FATAN_TABLE.f16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(lane1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fmax_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *abs1_table[] = {
"", ".abs"
};
const char *abs1 = abs1_table[_BITS(bits, 6, 1)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 8, 1)];
static const char *clamp_table[] = {
"", ".clamp_0_inf", ".clamp_m1_1", ".clamp_0_1"
};
const char *clamp = clamp_table[_BITS(bits, 11, 2)];
static const char *sem_table[] = {
"", ".nan_propagate", ".c", ".inverse_c"
};
const char *sem = sem_table[_BITS(bits, 13, 2)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 15, 1)];
fputs("+FMAX.f32", fp);
fputs(clamp, fp);
fputs(sem, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs(abs0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(abs1, fp);
fputs(neg1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_var_special_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".f32", ".reserved", ".f32", ".f32", ".f16", ".reserved", ".f16", ".f16", ".f32", ".reserved", ".f32", ".f32", ".f16", ".reserved", ".f16", ".f16", ".f32", ".reserved", ".f32", ".f32", ".f16", ".reserved", ".f16", ".f16", ".f32", ".reserved", ".f32", ".reserved", ".f16", ".reserved", ".f16", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *register_format = register_format_table[(_BITS(bits, 3, 2) << 0) | (_BITS(bits, 19, 1) << 2) | (_BITS(bits, 10, 4) << 3)];
static const char *vecsize_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".v2", ".reserved", "", "", ".v2", ".reserved", "", "", ".v2", ".reserved", "", "", ".v2", ".reserved", "", "", ".v2", ".reserved", "", "", ".v2", ".reserved", "", "", ".v2", ".reserved", "", ".reserved", ".v2", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *vecsize = vecsize_table[(_BITS(bits, 3, 2) << 0) | (_BITS(bits, 19, 1) << 2) | (_BITS(bits, 10, 4) << 3)];
static const char *varying_name_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".point", ".reserved", ".frag_w", ".frag_z", ".point", ".reserved", ".frag_w", ".frag_z", ".point", ".reserved", ".frag_w", ".frag_z", ".point", ".reserved", ".frag_w", ".frag_z", ".point", ".reserved", ".frag_w", ".frag_z", ".point", ".reserved", ".frag_w", ".frag_z", ".point", ".reserved", ".frag_w", ".reserved", ".point", ".reserved", ".frag_w", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *varying_name = varying_name_table[(_BITS(bits, 3, 2) << 0) | (_BITS(bits, 19, 1) << 2) | (_BITS(bits, 10, 4) << 3)];
static const char *update_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".clobber", ".reserved", ".clobber", ".clobber", ".clobber", ".reserved", ".clobber", ".clobber", ".clobber", ".reserved", ".clobber", ".clobber", ".clobber", ".reserved", ".clobber", ".clobber", ".clobber", ".reserved", ".clobber", ".clobber", ".clobber", ".reserved", ".clobber", ".clobber", ".clobber", ".reserved", ".clobber", ".reserved", ".clobber", ".reserved", ".clobber", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *update = update_table[(_BITS(bits, 3, 2) << 0) | (_BITS(bits, 19, 1) << 2) | (_BITS(bits, 10, 4) << 3)];
static const char *sample_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".center", ".reserved", ".center", ".center", ".center", ".reserved", ".center", ".center", ".centroid", ".reserved", ".centroid", ".centroid", ".centroid", ".reserved", ".centroid", ".centroid", ".sample", ".reserved", ".sample", ".sample", ".sample", ".reserved", ".sample", ".sample", ".explicit", ".reserved", ".explicit", ".reserved", ".explicit", ".reserved", ".explicit", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *sample = sample_table[(_BITS(bits, 3, 2) << 0) | (_BITS(bits, 19, 1) << 2) | (_BITS(bits, 10, 4) << 3)];
fputs("+LD_VAR_SPECIAL", fp);
fputs(varying_name, fp);
fputs(vecsize, fp);
fputs(update, fp);
fputs(register_format, fp);
fputs(sample, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_imul_i32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen1_table[] = {
""
};
const char *widen1 = widen1_table[0];
static const char *extend1_table[] = {
""
};
const char *extend1 = extend1_table[0];
fputs("*IMUL.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(widen1, fp);
fputs(extend1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_f16_to_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 3, 1)];
fputs("+F16_TO_F32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v2u16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", "", ".reserved", ".h10", ".reserved", "", ".reserved", ".h10"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1) | (_BITS(bits, 10, 1) << 2)];
static const char *lanes0_table[] = {
".reserved", "", ".reserved", "", ".reserved", ".h10", ".reserved", ".h10"
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1) | (_BITS(bits, 10, 1) << 2)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v2u16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_double_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *bytes2_table[] = {
"", ".bytes2"
};
const char *bytes2 = bytes2_table[_BITS(bits, 9, 1)];
static const char *lane2_table[] = {
"", ".b2"
};
const char *lane2 = lane2_table[_BITS(bits, 10, 1)];
static const char *result_word_table[] = {
"", ".w1"
};
const char *result_word = result_word_table[_BITS(bits, 11, 1)];
fputs("*RSHIFT_DOUBLE.i32", fp);
fputs(result_word, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(bytes2, fp);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fcmp_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
"", "", "", ".h0", "", "", "", ".h0"
};
const char *widen0 = widen0_table[(_BITS(bits, 9, 2) << 0) | (_BITS(bits, 13, 1) << 2)];
static const char *neg0_table[] = {
"", "", "", "", ".neg", ".neg", ".neg", ".neg"
};
const char *neg0 = neg0_table[(_BITS(bits, 9, 2) << 0) | (_BITS(bits, 13, 1) << 2)];
static const char *widen1_table[] = {
"", ".h0", ".h1", ".h0", "", ".h0", ".h1", ".h0"
};
const char *widen1 = widen1_table[(_BITS(bits, 9, 2) << 0) | (_BITS(bits, 13, 1) << 2)];
static const char *neg1_table[] = {
"", "", "", "", "", "", "", ""
};
const char *neg1 = neg1_table[(_BITS(bits, 9, 2) << 0) | (_BITS(bits, 13, 1) << 2)];
static const char *cmpf_table[] = {
".eq", ".gt", ".ge", ".ne", ".lt", ".le", ".gtlt", ".total"
};
const char *cmpf = cmpf_table[_BITS(bits, 6, 3)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 11, 1)];
static const char *abs1_table[] = {
"", ".abs"
};
const char *abs1 = abs1_table[_BITS(bits, 12, 1)];
static const char *result_type_table[] = {
"", ".f1", ".m1", ".reserved"
};
const char *result_type = result_type_table[_BITS(bits, 14, 2)];
fputs("+FCMP.f32", fp);
fputs(cmpf, fp);
fputs(result_type, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(neg0, fp);
fputs(abs0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(widen1, fp);
fputs(neg1, fp);
fputs(abs1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_flog_table_f32_4(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg_table[] = {
"", "", "", ""
};
const char *neg = neg_table[(_BITS(bits, 3, 1) << 0) | (_BITS(bits, 4, 1) << 1)];
static const char *widen0_table[] = {
"", "", "", ""
};
const char *widen0 = widen0_table[(_BITS(bits, 3, 1) << 0) | (_BITS(bits, 4, 1) << 1)];
static const char *precision_table[] = {
".high", ".high", ".low", ".low"
};
const char *precision = precision_table[(_BITS(bits, 3, 1) << 0) | (_BITS(bits, 4, 1) << 1)];
static const char *divzero_table[] = {
"", "", "", ""
};
const char *divzero = divzero_table[(_BITS(bits, 3, 1) << 0) | (_BITS(bits, 4, 1) << 1)];
static const char *mode_table[] = {
".natural", ".base2", ".natural", ".base2"
};
const char *mode = mode_table[(_BITS(bits, 3, 1) << 0) | (_BITS(bits, 4, 1) << 1)];
static const char *abs0_table[] = {
"", "", "", ""
};
const char *abs0 = abs0_table[(_BITS(bits, 3, 1) << 0) | (_BITS(bits, 4, 1) << 1)];
fputs("+FLOG_TABLE.f32", fp);
fputs(mode, fp);
fputs(precision, fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_lea_attr_tex_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".f16", ".f32", ".s32", ".u32", ".s16", ".u16", ".f64", ".i64"
};
const char *register_format = register_format_table[(_BITS(bits, 11, 3) << 0)];
fputs("+LEA_ATTR_TEX", fp);
fputs(register_format, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_or_v2i16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".reserved", ".b01", ".b23", ""
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
".not", ""
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*LSHIFT_OR.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_f32_to_u32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
fputs("+F32_TO_U32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *extend_table[] = {
".sext", ".zext", ".sext", ".zext"
};
const char *extend = extend_table[(_BITS(bits, 9, 1) << 0) | (_BITS(bits, 10, 1) << 1)];
static const char *lane_table[] = {
".h0", ".h0", ".h1", ".h1"
};
const char *lane = lane_table[(_BITS(bits, 9, 1) << 0) | (_BITS(bits, 10, 1) << 1)];
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i8", fp);
fputs(seg, fp);
fputs(lane, fp);
fputs(extend, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_branchc_i16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
".reserved", ".h1", "", ".reserved"
};
const char *lane0 = lane0_table[(_BITS(bits, 9, 1) << 0) | (_BITS(bits, 3, 1) << 1)];
static const char *combine_table[] = {
".any", ".all"
};
const char *combine = combine_table[_BITS(bits, 10, 1)];
fputs("+BRANCHC.i16", fp);
fputs(combine, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_popcount_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("*POPCOUNT.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_attr_tex_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".auto"
};
const char *register_format = register_format_table[0];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 11, 2)];
fputs("+LD_ATTR_TEX", fp);
fputs(register_format, fp);
fputs(vecsize, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_fpow_sc_det_f16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *func_table[] = {
".pow", ".pow", ".powr", ".powr"
};
const char *func = func_table[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 8, 1) << 1)];
static const char *lane1_table[] = {
".h0", ".h1", ".h0", ".h1"
};
const char *lane1 = lane1_table[(_BITS(bits, 6, 1) << 0) | (_BITS(bits, 8, 1) << 1)];
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 7, 1)];
fputs("+FPOW_SC_DET.f16", fp);
fputs(func, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(lane1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_and_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane2_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane2 = lane2_table[_BITS(bits, 9, 2)];
static const char *not1_table[] = {
"", ".not"
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
".not", ""
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*LSHIFT_AND.i32", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_quiet_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("*QUIET.f32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_f16_to_u32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 5, 1)];
fputs("+F16_TO_U32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fmin_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *abs1_0[] = {
"", ""
};
static const char *abs1_1[] = {
"", ".abs"
};
const char *abs1 = ordering ? abs1_1[(_BITS(bits, 6, 1) << 0)] : abs1_0[(_BITS(bits, 6, 1) << 0)];
static const char *abs0_0[] = {
"", ".abs"
};
static const char *abs0_1[] = {
".abs", ".abs"
};
const char *abs0 = ordering ? abs0_1[(_BITS(bits, 6, 1) << 0)] : abs0_0[(_BITS(bits, 6, 1) << 0)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 8, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 9, 2)];
static const char *swz1_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz1 = swz1_table[_BITS(bits, 11, 2)];
static const char *sem_table[] = {
"", ".nan_propagate", ".c", ".inverse_c"
};
const char *sem = sem_table[_BITS(bits, 13, 2)];
fputs("+FMIN.v2f16", fp);
fputs(sem, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(swz0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(abs1, fp);
fputs(neg1, fp);
fputs(swz1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_lea_tex(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *format_table[] = {
".u16", ".u32"
};
const char *format = format_table[_BITS(bits, 11, 1)];
fputs("+LEA_TEX", fp);
fputs(format, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_attr_imm_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".auto"
};
const char *register_format = register_format_table[0];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 11, 2)];
fputs("+LD_ATTR_IMM", fp);
fputs(register_format, fp);
fputs(vecsize, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", attribute_index:%u", _BITS(bits, 6, 4));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_branch_i16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *widen0_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h1", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen0_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h1", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen0 = ordering ? widen0_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen0_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *cmpf_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".eq", ".eq", ".ne", ".eq", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *cmpf_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ne", ".ne", ".ne", ".eq", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = ordering ? cmpf_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : cmpf_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *widen1_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h0", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen1_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".h0", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen1 = ordering ? widen1_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen1_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
fputs("+BRANCH.i16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(widen1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_xor_v2i16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".reserved", ".b01", ".b23", ""
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 13, 1)];
fputs("*LSHIFT_XOR.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_mkvec_v2i16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 6, 1)];
static const char *lane1_table[] = {
"", ".h1"
};
const char *lane1 = lane1_table[_BITS(bits, 7, 1)];
fputs("*MKVEC.v2i16", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(lane1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_axchg_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
"", ".wgl"
};
const char *seg = seg_table[_BITS(bits, 9, 1)];
fputs("+AXCHG.i64", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_logb_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
fputs("+LOGB.v2f16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_u32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".h0", ".reserved", ".h1"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.u32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fpclass_f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 3, 1)];
fputs("+FPCLASS.f16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v4u8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".b0000", ".reserved", ".b1111", ".reserved", ".b2222", ".reserved", ".b3333"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 2) << 1)];
static const char *lanes0_table[] = {
".reserved", "", ".reserved", "", ".reserved", "", ".reserved", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 2) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v4u8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fpow_sc_det_f16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *func_table[] = {
".pown", ".rootn"
};
const char *func = func_table[(_BITS(bits, 8, 1) << 0)];
static const char *lane1_table[] = {
"", ""
};
const char *lane1 = lane1_table[(_BITS(bits, 8, 1) << 0)];
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 7, 1)];
fputs("+FPOW_SC_DET.f16", fp);
fputs(func, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(lane1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_lea_attr_imm_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".f16", ".f32", ".s32", ".u32", ".s16", ".u16", ".f64", ".i64"
};
const char *register_format = register_format_table[(_BITS(bits, 11, 3) << 0)];
fputs("+LEA_ATTR_IMM", fp);
fputs(register_format, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", attribute_index:%u", _BITS(bits, 6, 4));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_flogd_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+FLOGD.f32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_attr_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".f16", ".f32", ".s32", ".u32", ".s16", ".u16", ".f64", ".i64"
};
const char *register_format = register_format_table[(_BITS(bits, 13, 3) << 0)];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 11, 2)];
fputs("+LD_ATTR", fp);
fputs(register_format, fp);
fputs(vecsize, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_iabs_v2s16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 2)];
fputs("+IABS.v2s16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v2u16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".h00", ".reserved", ".h11"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *lanes0_table[] = {
".reserved", "", ".reserved", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v2u16", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_axchg_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
"", ".wgl"
};
const char *seg = seg_table[_BITS(bits, 9, 1)];
fputs("+AXCHG.i32", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v4u8_2(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".reserved", ".b0101", ".reserved", ".b2323"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *lanes0_table[] = {
".reserved", "", ".reserved", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 7, 1) << 0) | (_BITS(bits, 9, 1) << 1)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v4u8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_f16_to_u32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 4, 2) << 0)];
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 7, 1)];
fputs("+F16_TO_U32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_flog_table_f32_3(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *divzero_table[] = {
"", "", "", ""
};
const char *divzero = divzero_table[(_BITS(bits, 5, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *mode_table[] = {
".base2", ".natural", ".base2", ".natural"
};
const char *mode = mode_table[(_BITS(bits, 5, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *precision_table[] = {
"", "", "", ""
};
const char *precision = precision_table[(_BITS(bits, 5, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *widen0_table[] = {
".h0", ".h0", ".h1", ".h1"
};
const char *widen0 = widen0_table[(_BITS(bits, 5, 1) << 0) | (_BITS(bits, 7, 1) << 1)];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
fputs("+FLOG_TABLE.f32", fp);
fputs(mode, fp);
fputs(precision, fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_jump_ex(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *test_mode_table[] = {
"", ".nz"
};
const char *test_mode = test_mode_table[_BITS(bits, 9, 1)];
static const char *stack_mode_table[] = {
".return", ".call", "", ".replace"
};
const char *stack_mode = stack_mode_table[_BITS(bits, 10, 2)];
fputs("*JUMP_EX", fp);
fputs(test_mode, fp);
fputs(stack_mode, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_u32_to_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
fputs("+U32_TO_F32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_s32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".h0", ".h1"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 1) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.s32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frcp_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
"", ".reserved"
};
const char *widen0 = widen0_table[(_BITS(bits, 6, 1) << 0)];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
fputs("+FRCP.f32", fp);
fputs(neg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frcbrt_approx_c_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+FRCBRT_APPROX_C.f32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_atom_c_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *atom_opc_table[] = {
".reserved", ".reserved", ".aadd", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".asmin", ".asmax", ".aumin", ".aumax", ".aand", ".aor", ".axor", ".reserved"
};
const char *atom_opc = atom_opc_table[_BITS(bits, 9, 4)];
fputs("*ATOM_C.i32", fp);
fputs(atom_opc, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_ilogb_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
fputs("+ILOGB.v2f16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fmax_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *abs1_0[] = {
"", ""
};
static const char *abs1_1[] = {
"", ".abs"
};
const char *abs1 = ordering ? abs1_1[(_BITS(bits, 6, 1) << 0)] : abs1_0[(_BITS(bits, 6, 1) << 0)];
static const char *abs0_0[] = {
"", ".abs"
};
static const char *abs0_1[] = {
".abs", ".abs"
};
const char *abs0 = ordering ? abs0_1[(_BITS(bits, 6, 1) << 0)] : abs0_0[(_BITS(bits, 6, 1) << 0)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 8, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 9, 2)];
static const char *swz1_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz1 = swz1_table[_BITS(bits, 11, 2)];
static const char *sem_table[] = {
"", ".nan_propagate", ".c", ".inverse_c"
};
const char *sem = sem_table[_BITS(bits, 13, 2)];
fputs("+FMAX.v2f16", fp);
fputs(sem, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(swz0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(abs1, fp);
fputs(neg1, fp);
fputs(swz1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_flshift_double_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *bytes2_table[] = {
"", ".bytes2"
};
const char *bytes2 = bytes2_table[_BITS(bits, 9, 1)];
static const char *lane2_table[] = {
"", ".b2"
};
const char *lane2 = lane2_table[_BITS(bits, 10, 1)];
fputs("*FLSHIFT_DOUBLE.i32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(bytes2, fp);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branchz_s16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".reserved", ".lt", ".lt", ".reserved", ".reserved", ".le", ".le", ".reserved", ".reserved", ".ge", ".ge", ".reserved", ".reserved", ".gt", ".gt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = cmpf_table[(_BITS(bits, 4, 2) << 0) | (_BITS(bits, 9, 3) << 2)];
static const char *widen0_table[] = {
".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen0 = widen0_table[(_BITS(bits, 4, 2) << 0) | (_BITS(bits, 9, 3) << 2)];
fputs("+BRANCHZ.s16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_clz_v2u16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *mask_table[] = {
"", ".mask"
};
const char *mask = mask_table[_BITS(bits, 3, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 2)];
fputs("*CLZ.v2u16", fp);
fputs(mask, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frexpe_v2f16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *log_table[] = {
""
};
const char *log = log_table[0];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 6, 1)];
static const char *sqrt_table[] = {
"", ".sqrt"
};
const char *sqrt = sqrt_table[_BITS(bits, 8, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
fputs("+FREXPE.v2f16", fp);
fputs(neg, fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_flog_table_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *mode_table[] = {
".red", ".red"
};
const char *mode = mode_table[(_BITS(bits, 7, 1) << 0)];
static const char *precision_table[] = {
"", ""
};
const char *precision = precision_table[(_BITS(bits, 7, 1) << 0)];
static const char *widen0_table[] = {
".h0", ".h1"
};
const char *widen0 = widen0_table[(_BITS(bits, 7, 1) << 0)];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
static const char *divzero_table[] = {
"", ".divzero"
};
const char *divzero = divzero_table[_BITS(bits, 5, 1)];
fputs("+FLOG_TABLE.f32", fp);
fputs(mode, fp);
fputs(precision, fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_imul_v4i8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *replicate1_table[] = {
""
};
const char *replicate1 = replicate1_table[0];
static const char *replicate0_table[] = {
""
};
const char *replicate0 = replicate0_table[0];
fputs("*IMUL.v4i8", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(replicate0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(replicate1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_v2f16_to_v2s16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 2)];
fputs("+V2F16_TO_V2S16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fcmp_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[(_BITS(bits, 13, 1) << 0)];
static const char *neg1_table[] = {
"", ""
};
const char *neg1 = neg1_table[(_BITS(bits, 13, 1) << 0)];
static const char *cmpf_table[] = {
".eq", ".gt", ".ge", ".ne", ".lt", ".le", ".gtlt", ".total"
};
const char *cmpf = cmpf_table[_BITS(bits, 6, 3)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 9, 2)];
static const char *swz1_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz1 = swz1_table[_BITS(bits, 11, 2)];
static const char *result_type_table[] = {
"", ".f1", ".m1", ".reserved"
};
const char *result_type = result_type_table[_BITS(bits, 14, 2)];
fputs("+FCMP.v2f16", fp);
fputs(cmpf, fp);
fputs(result_type, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs(swz0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(neg1, fp);
fputs(swz1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_and_v2i16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b00", ".b11", ".b22", ".b33"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
"", ".not"
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
".not", ""
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*LSHIFT_AND.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_fround_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 7, 1)];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 8, 1)];
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
fputs("*FROUND.f32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(widen0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branchz_u16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".reserved", ".lt", ".lt", ".reserved", ".reserved", ".le", ".le", ".reserved", ".reserved", ".ge", ".ge", ".reserved", ".reserved", ".gt", ".gt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = cmpf_table[(_BITS(bits, 4, 2) << 0) | (_BITS(bits, 9, 3) << 2)];
static const char *widen0_table[] = {
".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved", ".reserved", ".h1", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen0 = widen0_table[(_BITS(bits, 4, 2) << 0) | (_BITS(bits, 9, 3) << 2)];
fputs("+BRANCHZ.u16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_hadd_v2u16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtn", ".rtp"
};
const char *round = round_table[_BITS(bits, 12, 1)];
static const char *swap1_table[] = {
"", ".h10"
};
const char *swap1 = swap1_table[_BITS(bits, 9, 1)];
static const char *swap0_table[] = {
"", ".h10"
};
const char *swap0 = swap0_table[_BITS(bits, 10, 1)];
fputs("+HADD.v2u16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swap0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(swap1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_fround_v2f16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 7, 1)];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 8, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
fputs("*FROUND.v2f16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fsincos_offset_u6(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *scale_table[] = {
"", ".scale"
};
const char *scale = scale_table[_BITS(bits, 3, 1)];
fputs("+FSINCOS_OFFSET.u6", fp);
fputs(scale, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_csel_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".reserved", ".reserved", ".reserved", ".eq", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = cmpf_table[(_BITS(bits, 12, 3) << 0)];
fputs("*CSEL.i32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_imov_fma(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *threads_table[] = {
".even", ""
};
const char *threads = threads_table[_BITS(bits, 3, 1)];
fputs("+IMOV_FMA", fp);
fputs(threads, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs("\n", fp);
}
static void
bi_disasm_fma_fma_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg0_table[] = {
"", ""
};
const char *neg0 = neg0_table[(_BITS(bits, 17, 1) << 0)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[(_BITS(bits, 17, 1) << 0)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 9, 2)];
static const char *swz1_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz1 = swz1_table[_BITS(bits, 11, 2)];
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[_BITS(bits, 13, 2)];
static const char *clamp_table[] = {
"", ".clamp_0_inf", ".clamp_m1_1", ".clamp_0_1"
};
const char *clamp = clamp_table[_BITS(bits, 15, 2)];
static const char *neg2_table[] = {
"", ".neg"
};
const char *neg2 = neg2_table[_BITS(bits, 18, 1)];
static const char *swz2_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz2 = swz2_table[_BITS(bits, 19, 2)];
fputs("*FMA.v2f16", fp);
fputs(round, fp);
fputs(clamp, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(neg0, fp);
fputs(swz0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(neg1, fp);
fputs(swz1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(neg2, fp);
fputs(swz2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_wmask(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *subgroup_table[] = {
".subgroup2", ".subgroup4", ".subgroup8", ".reserved"
};
const char *subgroup = subgroup_table[_BITS(bits, 4, 2)];
fputs("+WMASK", fp);
fputs(subgroup, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fprintf(fp, ", fill:%u", _BITS(bits, 3, 1));
fputs("\n", fp);
}
static void
bi_disasm_add_kaboom(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+KABOOM", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_xor_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane2_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane2 = lane2_table[_BITS(bits, 9, 2)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 13, 1)];
fputs("*RSHIFT_XOR.i32", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_fcmp_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
"", "", "", ".h0", ".h0", ".h1", ".h0", ".h1"
};
const char *widen0 = widen0_table[(_BITS(bits, 9, 3) << 0)];
static const char *widen1_table[] = {
"", ".h0", ".h1", ".h0", ".h1", ".h1", "", ""
};
const char *widen1 = widen1_table[(_BITS(bits, 9, 3) << 0)];
static const char *abs1_table[] = {
"", ".abs"
};
const char *abs1 = abs1_table[_BITS(bits, 6, 1)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 8, 1)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 12, 1)];
static const char *cmpf_table[] = {
".eq", ".gt", ".ge", ".ne", ".lt", ".le", ".gtlt", ".total"
};
const char *cmpf = cmpf_table[_BITS(bits, 13, 3)];
static const char *result_type_table[] = {
"", ".f1", ".m1", ".reserved"
};
const char *result_type = result_type_table[_BITS(bits, 16, 2)];
fputs("*FCMP.f32", fp);
fputs(cmpf, fp);
fputs(result_type, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(neg0, fp);
fputs(abs0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(widen1, fp);
fputs(abs1, fp);
fputs(neg1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fsin_table_u6(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *offset_table[] = {
"", ".offset"
};
const char *offset = offset_table[_BITS(bits, 4, 1)];
fputs("+FSIN_TABLE.u6", fp);
fputs(offset, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frcbrt_approx_a_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
""
};
const char *widen0 = widen0_table[0];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
static const char *divzero_table[] = {
"", ".divzero"
};
const char *divzero = divzero_table[_BITS(bits, 5, 1)];
fputs("+FRCBRT_APPROX_A.f32", fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_fmul_slice_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("*FMUL_SLICE.f32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_store_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".reserved", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+STORE.i64", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_s32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
""
};
const char *lanes1 = lanes1_table[0];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.s32", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_atom_c1_return_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *atom_opc_table[] = {
".ainc", ".adec", ".aumax1", ".asmax1", ".aor1", ".reserved", ".reserved", ".reserved"
};
const char *atom_opc = atom_opc_table[_BITS(bits, 6, 3)];
fputs("*ATOM_C1_RETURN.i64", fp);
fputs(atom_opc, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xf3 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_mux_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *mux_table[] = {
".neg", "", ".fp_zero", ".bit"
};
const char *mux = mux_table[_BITS(bits, 9, 2)];
fputs("+MUX.i32", fp);
fputs(mux, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_fadd_rscale_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *clamp_table[] = {
"", ".reserved", ".clamp_0_1", "", "", "", "", ""
};
const char *clamp = clamp_table[(_BITS(bits, 9, 3) << 0)];
static const char *round_table[] = {
"", ".reserved", "", ".rtna", "", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 9, 3) << 0)];
static const char *special_table[] = {
"", ".reserved", "", ".n", ".n", ".n", ".n", ".n"
};
const char *special = special_table[(_BITS(bits, 9, 3) << 0)];
static const char *abs1_table[] = {
"", ".abs"
};
const char *abs1 = abs1_table[_BITS(bits, 12, 1)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 13, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 14, 1)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 16, 1)];
fputs("+FADD_RSCALE.f32", fp);
fputs(clamp, fp);
fputs(special, fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs(abs0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(abs1, fp);
fputs(neg1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i128(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i128", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_shift_double_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+SHIFT_DOUBLE.i32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_hadd_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtn", ".rtp"
};
const char *round = round_table[_BITS(bits, 12, 1)];
fputs("+HADD.u32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_xor_v4i8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b0000", ".b1111", ".b2222", ".b3333"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 13, 1)];
fputs("*LSHIFT_XOR.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_iabs_v4s8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+IABS.v4s8", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_s8_to_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".b1", ".b2", ".b3"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 2)];
fputs("*S8_TO_S32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frcbrt_approx_a_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
".h0", ".h1"
};
const char *widen0 = widen0_table[(_BITS(bits, 7, 1) << 0)];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
static const char *divzero_table[] = {
"", ".divzero"
};
const char *divzero = divzero_table[_BITS(bits, 5, 1)];
fputs("+FRCBRT_APPROX_A.f32", fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_frexpm_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *sqrt_table[] = {
""
};
const char *sqrt = sqrt_table[0];
static const char *log_table[] = {
".log"
};
const char *log = log_table[0];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 6, 1)];
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
fputs("*FREXPM.f32", fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(widen0, fp);
fputs(neg0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_hadd_v4u8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtn", ".rtp"
};
const char *round = round_table[_BITS(bits, 12, 1)];
fputs("+HADD.v4u8", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_fexp_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+FEXP.f32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_cube_ssel(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[(_BITS(bits, 9, 1) << 0)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[(_BITS(bits, 9, 1) << 0)];
fputs("+CUBE_SSEL", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(neg0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(neg1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_v2f16_to_v2u16_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
".rtna"
};
const char *round = round_table[0];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 2)];
fputs("+V2F16_TO_V2U16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_branch_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *widen0_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved"
};
static const char *widen0_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", "", "", ".reserved"
};
const char *widen0 = ordering ? widen0_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen0_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *cmpf_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ne", ".ne", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ge", ".ge", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".le", ".le", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".eq", ".reserved", ".reserved", ".reserved", ".reserved", ".eq", ".eq", ".reserved", ".gt", ".reserved", ".reserved", ".reserved", ".reserved", ".gt", ".gt", ".reserved", ".lt", ".reserved", ".reserved", ".reserved", ".reserved", ".lt", ".lt", ".reserved"
};
static const char *cmpf_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ne", ".ne", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ge", ".ge", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".le", ".le", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ne", ".reserved", ".reserved", ".reserved", ".reserved", ".eq", ".eq", ".reserved", ".ge", ".reserved", ".reserved", ".reserved", ".reserved", ".gt", ".gt", ".reserved", ".le", ".reserved", ".reserved", ".reserved", ".reserved", ".lt", ".lt", ".reserved"
};
const char *cmpf = ordering ? cmpf_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : cmpf_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *widen1_0[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved"
};
static const char *widen1_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", "", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved"
};
const char *widen1 = ordering ? widen1_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen1_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
fputs("+BRANCH.f32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(widen1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_fatan_assist_f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane1_table[] = {
"", ".h1"
};
const char *lane1 = lane1_table[_BITS(bits, 6, 1)];
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 7, 1)];
fputs("+FATAN_ASSIST.f16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(lane0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(lane1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_frexpe_f32_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *sqrt_table[] = {
""
};
const char *sqrt = sqrt_table[0];
static const char *log_table[] = {
".log"
};
const char *log = log_table[0];
static const char *neg_table[] = {
""
};
const char *neg = neg_table[0];
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
fputs("*FREXPE.f32", fp);
fputs(neg, fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_icmp_v4s8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[(_BITS(bits, 6, 1) << 0)];
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
fputs("+ICMP.v4s8", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_iadd_v4s8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
""
};
const char *lanes1 = lanes1_table[0];
static const char *lanes0_table[] = {
""
};
const char *lanes0 = lanes0_table[0];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+IADD.v4s8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_acmpxchg_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
"", ".wgl"
};
const char *seg = seg_table[_BITS(bits, 9, 1)];
fputs("+ACMPXCHG.i64", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_frcp_approx_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *widen0_table[] = {
""
};
const char *widen0 = widen0_table[0];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
static const char *divzero_table[] = {
"", ".divzero"
};
const char *divzero = divzero_table[_BITS(bits, 5, 1)];
fputs("+FRCP_APPROX.f32", fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs(abs0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_u32_to_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 4, 2) << 0)];
fputs("+U32_TO_F32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_fround_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 9, 2) << 0)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 7, 1)];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 8, 1)];
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
fputs("*FROUND.f32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(widen0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i96(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i96", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_branchz_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *cmpf_table[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ne", ".eq", ".ge", ".gt", ".le", ".lt"
};
const char *cmpf = cmpf_table[(_BITS(bits, 3, 1) << 0) | (_BITS(bits, 9, 3) << 1)];
fputs("+BRANCHZ.f32", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_fma_rscale_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg0_table[] = {
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
};
const char *neg0 = neg0_table[(_BITS(bits, 16, 1) << 0) | (_BITS(bits, 12, 3) << 1)];
static const char *neg1_table[] = {
"", ".neg", "", ".neg", "", ".neg", "", ".neg", "", ".neg", "", ".neg", "", ".neg", "", ".neg"
};
const char *neg1 = neg1_table[(_BITS(bits, 16, 1) << 0) | (_BITS(bits, 12, 3) << 1)];
static const char *clamp_table[] = {
"", "", ".clamp_0_inf", ".clamp_0_inf", ".clamp_m1_1", ".clamp_m1_1", ".clamp_0_1", ".clamp_0_1", "", "", "", "", "", "", "", ""
};
const char *clamp = clamp_table[(_BITS(bits, 16, 1) << 0) | (_BITS(bits, 12, 3) << 1)];
static const char *round_table[] = {
"", "", "", "", "", "", "", "", "", "", ".rtz", ".rtz", "", "", "", ""
};
const char *round = round_table[(_BITS(bits, 16, 1) << 0) | (_BITS(bits, 12, 3) << 1)];
static const char *special_table[] = {
"", "", "", "", "", "", "", "", ".n", ".n", ".n", ".n", ".scale16", ".scale16", ".left", ".left"
};
const char *special = special_table[(_BITS(bits, 16, 1) << 0) | (_BITS(bits, 12, 3) << 1)];
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 15, 1)];
static const char *neg2_table[] = {
"", ".neg"
};
const char *neg2 = neg2_table[_BITS(bits, 17, 1)];
fputs("*FMA_RSCALE.f32", fp);
fputs(round, fp);
fputs(clamp, fp);
fputs(special, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(neg0, fp);
fputs(abs0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(neg1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(neg2, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 9, 3), *srcs, consts, true);
fputs("\n", fp);
}
static void
bi_disasm_add_icmp_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
static const char *cmpf_table[] = {
".eq", ".ne"
};
const char *cmpf = cmpf_table[_BITS(bits, 6, 1)];
fputs("+ICMP.i32", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_fround_v2f16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 9, 2) << 0)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 7, 1)];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 8, 1)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 3, 2)];
fputs("*FROUND.v2f16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_clz_v4u8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *mask_table[] = {
"", ".mask"
};
const char *mask = mask_table[_BITS(bits, 3, 1)];
fputs("*CLZ.v4u8", fp);
fputs(mask, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *extend_table[] = {
""
};
const char *extend = extend_table[0];
static const char *lane_table[] = {
""
};
const char *lane = lane_table[0];
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i32", fp);
fputs(seg, fp);
fputs(lane, fp);
fputs(extend, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_branch_s16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
bool ordering = (_BITS(bits, 0, 3) > _BITS(bits, 3, 3));
static const char *cmpf_0[] = {
".reserved", ".lt", ".lt", ".reserved", ".lt", ".reserved", ".reserved", ".reserved", ".reserved", ".le", ".le", ".reserved", ".le", ".reserved", ".reserved", ".reserved", ".reserved", ".ge", ".ge", ".reserved", ".ge", ".reserved", ".reserved", ".reserved", ".reserved", ".gt", ".gt", ".reserved", ".gt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *cmpf_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".lt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".le", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".ge", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".gt", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *cmpf = ordering ? cmpf_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : cmpf_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *widen0_0[] = {
".reserved", ".h0", ".h1", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen0_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h1", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen0 = ordering ? widen0_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen0_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
static const char *widen1_0[] = {
".reserved", ".h0", ".h1", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".h1", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
static const char *widen1_1[] = {
".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".h0", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved", ".reserved"
};
const char *widen1 = ordering ? widen1_1[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)] : widen1_0[(_BITS(bits, 12, 3) << 0) | (_BITS(bits, 9, 3) << 3)];
fputs("+BRANCH.s16", fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(widen0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(widen1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 6, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_add_mux_v2i16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *mux_table[] = {
".neg", "", ".fp_zero", ".bit"
};
const char *mux = mux_table[_BITS(bits, 9, 2)];
static const char *swap2_table[] = {
"", ".h10"
};
const char *swap2 = swap2_table[_BITS(bits, 11, 1)];
static const char *swap1_table[] = {
"", ".h10"
};
const char *swap1 = swap1_table[_BITS(bits, 12, 1)];
static const char *swap0_table[] = {
"", ".h10"
};
const char *swap0 = swap0_table[_BITS(bits, 13, 1)];
fputs("+MUX.v2i16", fp);
fputs(mux, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swap0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(swap1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fputs(swap2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_atom_cx(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+ATOM_CX", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_imuld(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *threads_table[] = {
".even", ""
};
const char *threads = threads_table[_BITS(bits, 6, 1)];
fputs("*IMULD", fp);
fputs(threads, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0x33 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0x33 & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_shaddxl_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("*SHADDXL.i64", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fprintf(fp, ", shift:%u", _BITS(bits, 6, 3));
fputs("\n", fp);
}
static void
bi_disasm_add_acmpstore_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
"", ".wgl"
};
const char *seg = seg_table[_BITS(bits, 9, 1)];
fputs("+ACMPSTORE.i32", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_u16_to_u32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 1)];
fputs("+U16_TO_U32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_s16_to_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 4, 1)];
fputs("+S16_TO_S32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lane0, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_or_v2i16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b00", ".b11", ".b22", ".b33"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
".not", ""
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*LSHIFT_OR.v2i16", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_rshift_and_v4i8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
".b0000", ".b1111", ".b2222", ".b3333"
};
const char *lanes2 = lanes2_table[(_BITS(bits, 9, 2) << 0)];
static const char *not1_table[] = {
"", ".not"
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
".not", ""
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*RSHIFT_AND.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v4s8_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
""
};
const char *lanes1 = lanes1_table[0];
static const char *lanes0_table[] = {
""
};
const char *lanes0 = lanes0_table[0];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v4s8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_frexpe_f32_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *log_table[] = {
""
};
const char *log = log_table[0];
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 6, 1)];
static const char *sqrt_table[] = {
"", ".sqrt"
};
const char *sqrt = sqrt_table[_BITS(bits, 8, 1)];
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
fputs("*FREXPE.f32", fp);
fputs(neg, fp);
fputs(sqrt, fp);
fputs(log, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(widen0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_v2s16_to_v2f16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[(_BITS(bits, 4, 2) << 0)];
static const char *swz0_table[] = {
".h00", ".h10", "", ".h11"
};
const char *swz0 = swz0_table[_BITS(bits, 6, 2)];
fputs("+V2S16_TO_V2F16", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_mov_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
fputs("+MOV.i32", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_fround_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 7, 1)];
static const char *neg0_table[] = {
"", ".neg0"
};
const char *neg0 = neg0_table[_BITS(bits, 8, 1)];
static const char *widen0_table[] = {
".reserved", "", ".h0", ".h1"
};
const char *widen0 = widen0_table[_BITS(bits, 3, 2)];
static const char *round_table[] = {
"", ".rtp", ".rtn", ".rtz"
};
const char *round = round_table[_BITS(bits, 9, 2)];
fputs("+FROUND.f32", fp);
fputs(round, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(widen0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_acmpstore_i64(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *seg_table[] = {
"", ".wgl"
};
const char *seg = seg_table[_BITS(bits, 9, 1)];
fputs("+ACMPSTORE.i64", fp);
fputs(seg, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_v2u8_to_v2f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *swz0_table[] = {
".b00", ".b10", ".b20", ".b30", "", ".b11", ".b21", ".b31", ".b02", ".b12", ".b22", ".b32", ".b03", ".b13", ".b23", ".b33"
};
const char *swz0 = swz0_table[_BITS(bits, 4, 4)];
fputs("+V2U8_TO_V2F16", fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(swz0, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_icmpi_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
static const char *cmpf_table[] = {
".gt", ".ge"
};
const char *cmpf = cmpf_table[_BITS(bits, 6, 1)];
fputs("+ICMPI.s32", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_arshift_double_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *bytes2_table[] = {
"", ".bytes2"
};
const char *bytes2 = bytes2_table[_BITS(bits, 9, 1)];
static const char *lane2_table[] = {
"", ".b2"
};
const char *lane2 = lane2_table[_BITS(bits, 10, 1)];
static const char *result_word_table[] = {
"", ".w1"
};
const char *result_word = result_word_table[_BITS(bits, 11, 1)];
fputs("*ARSHIFT_DOUBLE.i32", fp);
fputs(result_word, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(bytes2, fp);
fputs(lane2, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_icmpi_i32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *result_type_table[] = {
"", ".m1"
};
const char *result_type = result_type_table[_BITS(bits, 10, 1)];
static const char *cmpf_table[] = {
".eq", ".ne"
};
const char *cmpf = cmpf_table[_BITS(bits, 6, 1)];
fputs("+ICMPI.i32", fp);
fputs(result_type, fp);
fputs(cmpf, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_add_ld_attr_imm_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *register_format_table[] = {
".f16", ".f32", ".s32", ".u32", ".s16", ".u16", ".f64", ".i64"
};
const char *register_format = register_format_table[(_BITS(bits, 13, 3) << 0)];
static const char *vecsize_table[] = {
"", ".v2", ".v3", ".v4"
};
const char *vecsize = vecsize_table[_BITS(bits, 11, 2)];
fputs("+LD_ATTR_IMM", fp);
fputs(register_format, fp);
fputs(vecsize, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", attribute_index:%u", _BITS(bits, 6, 4));
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_fma_shaddxl_s32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lane1_table[] = {
".h0", ".h1", "", ".reserved"
};
const char *lane1 = lane1_table[_BITS(bits, 9, 2)];
fputs("*SHADDXL.s32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(lane1, fp);
fprintf(fp, ", shift:%u", _BITS(bits, 6, 3));
fputs("\n", fp);
}
static void
bi_disasm_add_mux_v4i8(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *mux_table[] = {
".neg", ""
};
const char *mux = mux_table[_BITS(bits, 9, 1)];
fputs("+MUX.v4i8", fp);
fputs(mux, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, false);
fputs("\n", fp);
}
static void
bi_disasm_fma_lshift_or_v4i8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes2_table[] = {
""
};
const char *lanes2 = lanes2_table[0];
static const char *not1_table[] = {
".not", ""
};
const char *not1 = not1_table[_BITS(bits, 14, 1)];
static const char *not_result_table[] = {
"", ".not"
};
const char *not_result = not_result_table[_BITS(bits, 15, 1)];
fputs("*LSHIFT_OR.v4i8", fp);
fputs(not_result, fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(not1, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 6, 3), *srcs, consts, true);
fputs(lanes2, fp);
fputs("\n", fp);
}
static void
bi_disasm_fma_fadd_lscale_f32(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *abs0_table[] = {
"", ".abs"
};
const char *abs0 = abs0_table[_BITS(bits, 6, 1)];
static const char *neg0_table[] = {
"", ".neg"
};
const char *neg0 = neg0_table[_BITS(bits, 7, 1)];
static const char *abs1_table[] = {
"", ".abs"
};
const char *abs1 = abs1_table[_BITS(bits, 8, 1)];
static const char *neg1_table[] = {
"", ".neg"
};
const char *neg1 = neg1_table[_BITS(bits, 9, 1)];
fputs("*FADD_LSCALE.f32", fp);
fputs(" ", fp);
bi_disasm_dest_fma(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(neg0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, true);
if (!(0xfb & (1 << _BITS(bits, 3, 3)))) fputs("(INVALID)", fp);
fputs(abs1, fp);
fputs(neg1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_load_i16_0(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *extend_table[] = {
"", ""
};
const char *extend = extend_table[(_BITS(bits, 9, 1) << 0)];
static const char *lane_table[] = {
"", ".h1"
};
const char *lane = lane_table[(_BITS(bits, 9, 1) << 0)];
static const char *seg_table[] = {
".reserved", "", ".wgl", ".stream", ".ubo", ".reserved", ".reserved", ".tl"
};
const char *seg = seg_table[_BITS(bits, 6, 3)];
fputs("+LOAD.i16", fp);
fputs(seg, fp);
fputs(lane, fp);
fputs(extend, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fprintf(fp, ", @r%u", staging_register);
fputs("\n", fp);
}
static void
bi_disasm_add_isub_v4s8_1(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *lanes1_table[] = {
".b0000", ".b1111", ".b2222", ".b3333"
};
const char *lanes1 = lanes1_table[(_BITS(bits, 9, 2) << 0)];
static const char *lanes0_table[] = {
"", "", "", ""
};
const char *lanes0 = lanes0_table[(_BITS(bits, 9, 2) << 0)];
static const char *saturate_table[] = {
"", ".sat"
};
const char *saturate = saturate_table[_BITS(bits, 8, 1)];
fputs("+ISUB.v4s8", fp);
fputs(saturate, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
fputs(lanes0, fp);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 3, 3), *srcs, consts, false);
fputs(lanes1, fp);
fputs("\n", fp);
}
static void
bi_disasm_add_frsq_f16(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
static const char *neg_table[] = {
"", ".neg"
};
const char *neg = neg_table[_BITS(bits, 3, 1)];
static const char *abs0_table[] = {
"", ".abs0"
};
const char *abs0 = abs0_table[_BITS(bits, 4, 1)];
static const char *divzero_table[] = {
"", ".divzero"
};
const char *divzero = divzero_table[_BITS(bits, 5, 1)];
static const char *lane0_table[] = {
"", ".h1"
};
const char *lane0 = lane0_table[_BITS(bits, 8, 1)];
fputs("+FRSQ.f16", fp);
fputs(neg, fp);
fputs(divzero, fp);
fputs(" ", fp);
bi_disasm_dest_add(fp, next_regs, last);
fputs(", ", fp);
dump_src(fp, _BITS(bits, 0, 3), *srcs, consts, false);
if (!(0xf7 & (1 << _BITS(bits, 0, 3)))) fputs("(INVALID)", fp);
fputs(abs0, fp);
fputs(lane0, fp);
fputs("\n", fp);
}
void
bi_disasm_fma(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
if (unlikely(((bits & 0x7fffff) == 0x701963)))
bi_disasm_fma_nop_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffff8) == 0x701968)))
bi_disasm_fma_mov_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffff8) == 0x701fc0)))
bi_disasm_fma_bitrev_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffff8) == 0x73c6d8)))
bi_disasm_fma_popcount_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffff8) == 0x701970)))
bi_disasm_fma_quiet_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffff0) == 0x701fd0)))
bi_disasm_fma_clz_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffff0) == 0x700d10)))
bi_disasm_fma_f16_to_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffff0) == 0x701f90)))
bi_disasm_fma_clz_v4u8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fffe8) == 0x700cc8)))
bi_disasm_fma_u16_to_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fffe8) == 0x700cc0)))
bi_disasm_fma_s16_to_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fffe0) == 0x701e00)))
bi_disasm_fma_frexpe_v2f16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fffe0) == 0x701e20)))
bi_disasm_fma_frexpe_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fffc8) == 0x700b48)))
bi_disasm_fma_u8_to_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fffc8) == 0x701900)))
bi_disasm_fma_quiet_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fffc8) == 0x700b40)))
bi_disasm_fma_s8_to_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fffc0) == 0x73c0c0)))
bi_disasm_fma_imul_i32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fffc0) == 0x701ec0)))
bi_disasm_fma_clz_v2u16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fffc0) == 0x73e0c0)))
bi_disasm_fma_imul_v4i8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fffc0) == 0x70cb40)))
bi_disasm_fma_fmul_slice_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fff80) == 0x70f100)))
bi_disasm_fma_imuld(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fff40) == 0x701500)))
bi_disasm_fma_seg_add(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fff40) == 0x701540)))
bi_disasm_fma_seg_sub(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fff20) == 0x701a00)))
bi_disasm_fma_frexpm_v2f16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fff20) == 0x701b00)))
bi_disasm_fma_frexpm_v2f16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fff20) == 0x701b20)))
bi_disasm_fma_frexpm_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fff20) == 0x701a20)))
bi_disasm_fma_frexpm_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fff00) == 0x70f000)))
bi_disasm_fma_mkvec_v2i16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffea0) == 0x701c00)))
bi_disasm_fma_frexpe_v2f16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffea0) == 0x701c20)))
bi_disasm_fma_frexpe_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe60) == 0x707620)))
bi_disasm_fma_fround_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe60) == 0x707600)))
bi_disasm_fma_fround_v2f16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe38) == 0x335818)))
bi_disasm_fma_arshift_v4i8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe00) == 0x27fe00)))
bi_disasm_fma_isubb_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe00) == 0x70f200)))
bi_disasm_fma_dtsel_imm(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe00) == 0x27fc00)))
bi_disasm_fma_iaddc_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe00) == 0x2f1e00)))
bi_disasm_fma_atom_c1_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe00) == 0x2f7e00)))
bi_disasm_fma_atom_c1_return_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe00) == 0x2f5e00)))
bi_disasm_fma_atom_c1_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe00) == 0x70d000)))
bi_disasm_fma_fmul_cslice(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe00) == 0x2f3e00)))
bi_disasm_fma_atom_c1_return_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffe00) == 0x70e600)))
bi_disasm_fma_shaddxl_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffc00) == 0x6ee400)))
bi_disasm_fma_atom_post_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffc00) == 0x6ee000)))
bi_disasm_fma_atom_post_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffc00) == 0x706800)))
bi_disasm_fma_cubeface1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ffc00) == 0x70f400)))
bi_disasm_fma_fadd_lscale_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff9c0) == 0x7380c0)))
bi_disasm_fma_imul_v4i8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff9c0) == 0x73c8c0)))
bi_disasm_fma_imul_i32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff9c0) == 0x73e8c0)))
bi_disasm_fma_idp_v4i8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff860) == 0x70c020)))
bi_disasm_fma_fround_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff860) == 0x70c000)))
bi_disasm_fma_fround_v2f16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff838) == 0x335818)
&& !(0x1 & (1 << _BITS(bits, 9, 2)))
))
bi_disasm_fma_arshift_v2i16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff838) == 0x334818)))
bi_disasm_fma_arshift_v2i16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff838) == 0x334018)))
bi_disasm_fma_arshift_v4i8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff838) == 0x335018)))
bi_disasm_fma_arshift_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff800) == 0x33f000)))
bi_disasm_fma_frshift_double_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff800) == 0x70e000)))
bi_disasm_fma_shaddxl_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff800) == 0x33f800)))
bi_disasm_fma_flshift_double_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff800) == 0x70e800)))
bi_disasm_fma_shaddxl_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff1c0) == 0x73b0c0)))
bi_disasm_fma_imul_i32_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff000) == 0x33a000)))
bi_disasm_fma_rrot_double_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff000) == 0x33c000)))
bi_disasm_fma_lshift_double_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff000) == 0x6eb000)))
bi_disasm_fma_vn_asst1_f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff000) == 0x33b000)))
bi_disasm_fma_lrot_double_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff000) == 0x33d000)))
bi_disasm_fma_rshift_double_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff000) == 0x2eb000)))
bi_disasm_fma_jump_ex(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7ff000) == 0x33e000)))
bi_disasm_fma_arshift_double_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe1c0) == 0x7240c0)))
bi_disasm_fma_imul_v2i16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe000) == 0x2f6000)))
bi_disasm_fma_atom_c_return_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe000) == 0x6ec000)))
bi_disasm_fma_atom_pre_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe000) == 0x2e6000)))
bi_disasm_fma_csel_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe000) == 0x27c000)))
bi_disasm_fma_vn_asst1_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe000) == 0x2e4000)))
bi_disasm_fma_csel_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe000) == 0x6e6000)))
bi_disasm_fma_csel_v2u16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe000) == 0x6e8000)))
bi_disasm_fma_v2f32_to_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe000) == 0x2f2000)))
bi_disasm_fma_atom_c_return_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe000) == 0x2f0000)))
bi_disasm_fma_atom_c_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe000) == 0x6e4000)))
bi_disasm_fma_csel_v2s16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fe000) == 0x2f4000)))
bi_disasm_fma_atom_c_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fde00) == 0x321800)))
bi_disasm_fma_rshift_xor_v4i8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fde00) == 0x325800)))
bi_disasm_fma_lshift_xor_v4i8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fd800) == 0x324800)))
bi_disasm_fma_lshift_xor_v2i16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fd800) == 0x321800)
&& !(0x1 & (1 << _BITS(bits, 9, 2)))
))
bi_disasm_fma_rshift_xor_v2i16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fd800) == 0x325000)))
bi_disasm_fma_lshift_xor_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fd800) == 0x320000)))
bi_disasm_fma_rshift_xor_v4i8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fd800) == 0x320800)))
bi_disasm_fma_rshift_xor_v2i16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fd800) == 0x325800)
&& !(0x1 & (1 << _BITS(bits, 9, 2)))
))
bi_disasm_fma_lshift_xor_v2i16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fd800) == 0x321000)))
bi_disasm_fma_rshift_xor_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fd800) == 0x324000)))
bi_disasm_fma_lshift_xor_v4i8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fc000) == 0x2e0000)
&& !(0x8 & (1 << _BITS(bits, 12, 2)))
))
bi_disasm_fma_csel_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7fc000) == 0x6e0000)
&& !(0x8 & (1 << _BITS(bits, 12, 2)))
))
bi_disasm_fma_csel_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f8000) == 0x6e0000)
&& !(0xf7 & (1 << _BITS(bits, 12, 3)))
))
bi_disasm_fma_csel_v2i16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f8000) == 0x2e0000)
&& !(0xf7 & (1 << _BITS(bits, 12, 3)))
))
bi_disasm_fma_csel_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3e00) == 0x303800)))
bi_disasm_fma_rshift_or_v4i8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3e00) == 0x301800)))
bi_disasm_fma_rshift_and_v4i8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3e00) == 0x311800)))
bi_disasm_fma_lshift_and_v4i8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3e00) == 0x313800)))
bi_disasm_fma_lshift_or_v4i8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x303000)))
bi_disasm_fma_rshift_or_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x312000)))
bi_disasm_fma_lshift_or_v4i8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x310000)))
bi_disasm_fma_lshift_and_v4i8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x300800)))
bi_disasm_fma_rshift_and_v2i16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x303800)
&& !(0x1 & (1 << _BITS(bits, 9, 2)))
))
bi_disasm_fma_rshift_or_v2i16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x301000)))
bi_disasm_fma_rshift_and_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x313000)))
bi_disasm_fma_lshift_or_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x302800)))
bi_disasm_fma_rshift_or_v2i16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x301800)
&& !(0x1 & (1 << _BITS(bits, 9, 2)))
))
bi_disasm_fma_rshift_and_v2i16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x302000)))
bi_disasm_fma_rshift_or_v4i8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x311800)
&& !(0x1 & (1 << _BITS(bits, 9, 2)))
))
bi_disasm_fma_lshift_and_v2i16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x313800)
&& !(0x1 & (1 << _BITS(bits, 9, 2)))
))
bi_disasm_fma_lshift_or_v2i16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x311000)))
bi_disasm_fma_lshift_and_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x310800)))
bi_disasm_fma_lshift_and_v2i16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x312800)))
bi_disasm_fma_lshift_or_v2i16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f3800) == 0x300000)))
bi_disasm_fma_rshift_and_v4i8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f0000) == 0x710000)))
bi_disasm_fma_mkvec_v4i8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7e0000) == 0x2c0000)))
bi_disasm_fma_fadd_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7e0000) == 0x6c0000)))
bi_disasm_fma_fadd_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7c0000) == 0x680000)
&& !(0x40 & (1 << _BITS(bits, 12, 3)))
))
bi_disasm_fma_fma_rscale_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7c0000) == 0x640000)))
bi_disasm_fma_fcmp_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7c0000) == 0x240000)))
bi_disasm_fma_fcmp_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7c0000) == 0x280000)))
bi_disasm_fma_fma_rscale_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x600000) == 0x0)))
bi_disasm_fma_fma_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x600000) == 0x400000)))
bi_disasm_fma_fma_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else
fprintf(fp, "INSTR_INVALID_ENC fma %X\n", bits);
}
void
bi_disasm_add(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool last)
{
if (unlikely(((bits & 0xfffff) == 0xd7874)))
bi_disasm_add_barrier(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffff) == 0x3d964)))
bi_disasm_add_nop_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0xd7800)))
bi_disasm_add_ld_gclk_u64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x67c50)))
bi_disasm_add_fpclass_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x3d970)))
bi_disasm_add_quiet_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0xd7860)))
bi_disasm_add_doorbell(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0xd7850)))
bi_disasm_add_eureka(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x3cd00)))
bi_disasm_add_s32_to_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x3cca0)))
bi_disasm_add_f32_to_s32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x67ab0)))
bi_disasm_add_frcbrt_approx_b_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x3dea0)))
bi_disasm_add_iabs_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x3de58)))
bi_disasm_add_cubeface2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x3cca8)))
bi_disasm_add_f32_to_u32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x66340)))
bi_disasm_add_flogd_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x3cd08)))
bi_disasm_add_u32_to_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x67ab8)))
bi_disasm_add_frcbrt_approx_c_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0xd7858)))
bi_disasm_add_kaboom(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x3deb0)))
bi_disasm_add_iabs_v4s8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff8) == 0x3d968)))
bi_disasm_add_mov_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff7) == 0xd7820)))
bi_disasm_add_imov_fma(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff0) == 0x3df80)))
bi_disasm_add_vn_asst2_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff0) == 0x3dfa0)))
bi_disasm_add_vn_asst2_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff0) == 0x3cd10)))
bi_disasm_add_f16_to_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff0) == 0x67c40)))
bi_disasm_add_fpclass_f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffff0) == 0x67aa0)))
bi_disasm_add_fsincos_offset_u6(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe8) == 0x3de80)))
bi_disasm_add_vn_asst2_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe8) == 0x3cce8)))
bi_disasm_add_u16_to_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe8) == 0x3cce0)))
bi_disasm_add_s16_to_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe8) == 0x67a88)))
bi_disasm_add_fcos_table_u6(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe8) == 0x67a80)))
bi_disasm_add_fsin_table_u6(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe8) == 0x3ccc8)))
bi_disasm_add_u16_to_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe8) == 0x3ccc0)))
bi_disasm_add_s16_to_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe0) == 0x3de00)))
bi_disasm_add_frexpe_v2f16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe0) == 0x3d9a0)))
bi_disasm_add_logb_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe0) == 0x67ac0)))
bi_disasm_add_fexp_table_u4(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe0) == 0x3d9e0)))
bi_disasm_add_ilogb_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe0) == 0x3de20)))
bi_disasm_add_frexpe_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe0) == 0x67ae0)))
bi_disasm_add_flog_table_f32_4(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe0) == 0x3d980)))
bi_disasm_add_logb_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffe0) == 0x3d9c0)))
bi_disasm_add_ilogb_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffd8) == 0x3cc40)))
bi_disasm_add_f16_to_s32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffd8) == 0x3cc48)))
bi_disasm_add_f16_to_u32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3c988)))
bi_disasm_add_f32_to_u32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3cb48)))
bi_disasm_add_u8_to_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3d900)))
bi_disasm_add_quiet_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3cb80)))
bi_disasm_add_s8_to_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3cb00)))
bi_disasm_add_v2s16_to_v2f16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3cb08)))
bi_disasm_add_v2u16_to_v2f16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3cbc0)))
bi_disasm_add_s32_to_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3d948)))
bi_disasm_add_swz_v2i16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3c980)))
bi_disasm_add_f32_to_s32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3cb40)))
bi_disasm_add_s8_to_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3cb88)))
bi_disasm_add_u8_to_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3de88)))
bi_disasm_add_iabs_v2s16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3ca80)))
bi_disasm_add_v2f16_to_v2s16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3ca88)))
bi_disasm_add_v2f16_to_v2u16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc8) == 0x3cbc8)))
bi_disasm_add_u32_to_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x75200)))
bi_disasm_add_fadd_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x67a00)))
bi_disasm_add_fatan_assist_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x3df40)))
bi_disasm_add_swz_v4i8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x67a40)))
bi_disasm_add_fatan_table_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x75080)))
bi_disasm_add_fpow_sc_apply(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x67300)))
bi_disasm_add_flog_table_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x67b00)))
bi_disasm_add_flog_table_f32_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x67100)))
bi_disasm_add_frsq_approx_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x3f8c0)))
bi_disasm_add_shaddxh_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x3d700)))
bi_disasm_add_wmask(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x67200)))
bi_disasm_add_frcbrt_approx_a_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x66ac0)))
bi_disasm_add_fexp_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffc0) == 0x67000)))
bi_disasm_add_frcp_approx_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffa0) == 0x66100)
&& !(0x2 & (1 << _BITS(bits, 6, 1)))
))
bi_disasm_add_frsq_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfffa0) == 0x66000)
&& !(0x2 & (1 << _BITS(bits, 6, 1)))
))
bi_disasm_add_frcp_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff48) == 0x3c500)))
bi_disasm_add_f16_to_s32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff48) == 0x3c508)))
bi_disasm_add_f16_to_u32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff40) == 0x67140)))
bi_disasm_add_frsq_approx_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff40) == 0x3d540)))
bi_disasm_add_seg_sub(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff40) == 0x67040)))
bi_disasm_add_frcp_approx_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff40) == 0x3d500)))
bi_disasm_add_seg_add(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff40) == 0x67b40)))
bi_disasm_add_flog_table_f32_3(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff40) == 0x67340)))
bi_disasm_add_flog_table_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff40) == 0x67240)))
bi_disasm_add_frcbrt_approx_a_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff20) == 0x3da00)))
bi_disasm_add_frexpm_v2f16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff20) == 0x3db20)))
bi_disasm_add_frexpm_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff20) == 0x3db00)))
bi_disasm_add_frexpm_v2f16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff20) == 0x3da20)))
bi_disasm_add_frexpm_f32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff08) == 0x3c200)))
bi_disasm_add_v2f16_to_v2s16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff08) == 0x3c608)))
bi_disasm_add_v2u16_to_v2f16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff08) == 0x3c208)))
bi_disasm_add_v2f16_to_v2u16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff08) == 0x3c700)))
bi_disasm_add_v2s8_to_v2s16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff08) == 0x3c708)))
bi_disasm_add_v2u8_to_v2u16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff08) == 0x3c800)))
bi_disasm_add_v2s8_to_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff08) == 0x3c600)))
bi_disasm_add_v2s16_to_v2f16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff08) == 0x3c808)))
bi_disasm_add_v2u8_to_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff00) == 0xc8f00)))
bi_disasm_add_atest(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff00) == 0x75300)))
bi_disasm_add_mkvec_v2i16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff00) == 0x67900)))
bi_disasm_add_fatan_table_f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfff00) == 0x67800)))
bi_disasm_add_fatan_assist_f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffec0) == 0x67080)))
bi_disasm_add_frcp_f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffec0) == 0xbc600)))
bi_disasm_add_iadd_s32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffec0) == 0xbd600)))
bi_disasm_add_isub_s32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffec0) == 0xbc400)))
bi_disasm_add_iadd_v4s8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffec0) == 0xbd400)))
bi_disasm_add_isub_v4s8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffec0) == 0x67280)))
bi_disasm_add_frsq_f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffea0) == 0x3dc20)))
bi_disasm_add_frexpe_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffea0) == 0x3dc00)))
bi_disasm_add_frexpe_v2f16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe40) == 0xbc400)))
bi_disasm_add_iadd_v4u8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe40) == 0xbd400)))
bi_disasm_add_isub_v4u8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe40) == 0xbc600)))
bi_disasm_add_iadd_u32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe40) == 0xbd600)))
bi_disasm_add_isub_u32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe40) == 0x67640)))
bi_disasm_add_fpow_sc_det_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe40) == 0x67600)))
bi_disasm_add_fpow_sc_det_f16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe3f) == 0x6f83c)))
bi_disasm_add_branch_diverg(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe3f) == 0x6fe34)))
bi_disasm_add_jump(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe3f) == 0x6fa34)))
bi_disasm_add_branch_no_diverg(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe38) == 0x6fa38)))
bi_disasm_add_branch_lowbits_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe30) == 0x6f800)))
bi_disasm_add_branchz_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x61200)))
bi_disasm_add_store_i128(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x62800)))
bi_disasm_add_store_i16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x65c00)))
bi_disasm_add_store_i96(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x7be00)))
bi_disasm_add_icmpf_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0xca800)))
bi_disasm_add_blend(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x62000)))
bi_disasm_add_store_i8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x65200)))
bi_disasm_add_load_i48(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0xc8400)))
bi_disasm_add_lea_attr_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x65800)))
bi_disasm_add_store_i24(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x65a00)))
bi_disasm_add_store_i48(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x6f800)
&& !(0x9 & (1 << _BITS(bits, 4, 2)))
))
bi_disasm_add_branchz_i16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x60e00)))
bi_disasm_add_load_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x62c00)))
bi_disasm_add_store_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x74c00)))
bi_disasm_add_ldexp_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x65000)))
bi_disasm_add_load_i24(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x7ba00)))
bi_disasm_add_icmpm_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x74e00)))
bi_disasm_add_ldexp_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0xc8600)))
bi_disasm_add_lea_attr_tex_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x67400)))
bi_disasm_add_fpow_sc_det_f16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x62e00)))
bi_disasm_add_store_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x61000)))
bi_disasm_add_load_i128(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0xefe00)))
bi_disasm_add_shift_double_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x65400)))
bi_disasm_add_load_i96(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0x60c00)))
bi_disasm_add_load_i32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffe00) == 0xd7400)))
bi_disasm_add_atom_cx(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffdc0) == 0x644c0)))
bi_disasm_add_acmpxchg_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffdc0) == 0x64100)))
bi_disasm_add_axchg_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffdc0) == 0x640c0)))
bi_disasm_add_axchg_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffdc0) == 0x64500)))
bi_disasm_add_acmpxchg_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffdc0) == 0x648c0)))
bi_disasm_add_acmpstore_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffdc0) == 0x64900)))
bi_disasm_add_acmpstore_i64(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffd00) == 0xca100)
&& !(0xc & (1 << _BITS(bits, 5, 2)))
))
bi_disasm_add_var_tex_f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffd00) == 0xca000)
&& !(0xc & (1 << _BITS(bits, 5, 2)))
))
bi_disasm_add_var_tex_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffcc0) == 0xbe840)))
bi_disasm_add_iadd_v4s8_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffcc0) == 0xbf800)))
bi_disasm_add_isub_v2s16_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffcc0) == 0xbfc40)))
bi_disasm_add_isub_v2s16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffcc0) == 0xbec40)))
bi_disasm_add_iadd_v2s16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffcc0) == 0xbec00)))
bi_disasm_add_iadd_s32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffcc0) == 0xbe800)))
bi_disasm_add_iadd_v2s16_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffcc0) == 0xbf840)))
bi_disasm_add_isub_v4s8_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffcc0) == 0xcf8c0)))
bi_disasm_add_ld_var_flat_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffcc0) == 0xbfc00)))
bi_disasm_add_isub_s32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc40) == 0xbf840)))
bi_disasm_add_isub_v4u8_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc40) == 0xbec40)))
bi_disasm_add_iadd_v2u16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc40) == 0xbfc00)))
bi_disasm_add_isub_u32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc40) == 0xbf800)))
bi_disasm_add_isub_v2u16_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc40) == 0xbe800)))
bi_disasm_add_iadd_v2u16_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc40) == 0xbec00)))
bi_disasm_add_iadd_u32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc40) == 0xbfc40)))
bi_disasm_add_isub_v2u16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc40) == 0xbe840)))
bi_disasm_add_iadd_v4u8_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0x3e400)))
bi_disasm_add_cube_tsel(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0x63000)))
bi_disasm_add_load_i16_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0x63400)))
bi_disasm_add_load_i8_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0xcf800)))
bi_disasm_add_ld_var_flat_imm_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0x61400)))
bi_disasm_add_load_i8_3(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0x61800)))
bi_disasm_add_load_i16_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0xc8000)))
bi_disasm_add_lea_attr_imm_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0xd7000)))
bi_disasm_add_texc(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0x61c00)))
bi_disasm_add_load_i32_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0x3e000)))
bi_disasm_add_cube_ssel(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0x74800)))
bi_disasm_add_mux_v4i8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffc00) == 0x60800)))
bi_disasm_add_load_i16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffb80) == 0x7b100)))
bi_disasm_add_icmp_v4i8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffb80) == 0x7b200)))
bi_disasm_add_icmp_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffb80) == 0x7b080)))
bi_disasm_add_icmp_v4u8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffb80) == 0x7b880)))
bi_disasm_add_icmpi_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffb80) == 0x7b280)))
bi_disasm_add_icmp_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffb80) == 0x7b000)))
bi_disasm_add_icmp_v4s8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffb80) == 0x7b300)))
bi_disasm_add_icmp_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffb80) == 0x7b800)))
bi_disasm_add_icmpi_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffb80) == 0x7b900)))
bi_disasm_add_icmpi_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xffa38) == 0x6f238)))
bi_disasm_add_branchc_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff8c0) == 0xbd800)))
bi_disasm_add_isub_v2s16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff8c0) == 0xbf000)))
bi_disasm_add_isub_s32_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff8c0) == 0xbe000)))
bi_disasm_add_iadd_s32_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff8c0) == 0xbe040)))
bi_disasm_add_iadd_v4s8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff8c0) == 0xbc800)))
bi_disasm_add_iadd_v2s16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff8c0) == 0xbf040)))
bi_disasm_add_isub_v4s8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff860) == 0x3e800)))
bi_disasm_add_fround_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff860) == 0x3e820)))
bi_disasm_add_fround_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff840) == 0xbe000)))
bi_disasm_add_iadd_u32_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff840) == 0xbc800)))
bi_disasm_add_iadd_v2u16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff840) == 0xbf000)))
bi_disasm_add_isub_u32_2(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff840) == 0xbe040)))
bi_disasm_add_iadd_v4u8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff840) == 0xbd800)))
bi_disasm_add_isub_v2u16_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff840) == 0xbf040)))
bi_disasm_add_isub_v4u8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff830) == 0x6f030)))
bi_disasm_add_branchc_i16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff800) == 0x60000)))
bi_disasm_add_load_i8_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff800) == 0xd7800)
&& !(0x1 & (1 << _BITS(bits, 9, 2)))
))
bi_disasm_add_zs_emit(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff800) == 0xc8800)
&& !(0xe0 & (1 << _BITS(bits, 8, 3)))
))
bi_disasm_add_discard_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff800) == 0xc9000)))
bi_disasm_add_ld_cvt(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff800) == 0xc9800)))
bi_disasm_add_st_cvt(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff800) == 0xcb800)))
bi_disasm_add_st_tile(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff800) == 0xcb000)))
bi_disasm_add_ld_tile(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff800) == 0x63800)))
bi_disasm_add_load_i8_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff800) == 0x74000)))
bi_disasm_add_mux_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff600) == 0xd6600)))
bi_disasm_add_lea_tex(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff038) == 0x6f000)
&& !(0xf0 & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branchz_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff038) == 0x6f008)
&& !(0xf0 & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branchz_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff030) == 0x6f000)
&& !(0x1f & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branchz_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff008) == 0x6f008)
&& !(0x9 & (1 << _BITS(bits, 4, 2)))
&& !(0xf0 & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branchz_s16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff008) == 0x6f000)
&& !(0x9 & (1 << _BITS(bits, 4, 2)))
&& !(0xf0 & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branchz_u16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff000) == 0x7a000)))
bi_disasm_add_icmp_v2i16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff000) == 0x6f000)
&& !(0x9 & (1 << _BITS(bits, 4, 2)))
&& !(0x1f & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branchz_f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xff000) == 0xd6000)))
bi_disasm_add_lea_tex_imm(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfefc0) == 0xbc440)))
bi_disasm_add_hadd_v4s8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfefc0) == 0xbc640)))
bi_disasm_add_hadd_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfefc0) == 0xbc6c0)))
bi_disasm_add_hadd_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfefc0) == 0xbc4c0)))
bi_disasm_add_hadd_v4u8(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfe9c0) == 0xbc840)))
bi_disasm_add_hadd_v2s16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfe9c0) == 0xbc8c0)))
bi_disasm_add_hadd_v2u16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfe800) == 0x78000)))
bi_disasm_add_icmp_v2s16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfe800) == 0x78800)))
bi_disasm_add_icmp_v2u16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfe600) == 0xc4400)))
bi_disasm_add_ld_attr_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfe600) == 0xc4600)))
bi_disasm_add_ld_attr_tex_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfe400) == 0xc4000)))
bi_disasm_add_ld_attr_imm_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfe000) == 0x76000)))
bi_disasm_add_v2f32_to_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc600) == 0xc0400)))
bi_disasm_add_lea_attr_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc600) == 0xc0600)))
bi_disasm_add_lea_attr_tex_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc400) == 0xc0000)))
bi_disasm_add_lea_attr_imm_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc3e0) == 0xcc0a0)
&& !(0x2 & (1 << _BITS(bits, 3, 2)))
&& !(0xc0e0 & (1 << _BITS(bits, 10, 4)))
))
bi_disasm_add_ld_var_special_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc0c0) == 0xcc0c0)
&& !(0xc0e0 & (1 << _BITS(bits, 10, 4)))
))
bi_disasm_add_ld_var_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc000) == 0xcc000)
&& !(0xc0e0 & (1 << _BITS(bits, 10, 4)))
))
bi_disasm_add_ld_var_imm_1(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc000) == 0x7c000)))
bi_disasm_add_clper_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc000) == 0xd8000)))
bi_disasm_add_texs_2d_f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc000) == 0x5c000)))
bi_disasm_add_texs_cube_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc000) == 0x58000)))
bi_disasm_add_texs_2d_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc000) == 0xdc000)))
bi_disasm_add_texs_cube_f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xfc000) == 0x70000)))
bi_disasm_add_mux_v2i16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf8000) == 0x68000)
&& !(0xe1 & (1 << _BITS(bits, 12, 3)))
&& !(0xf & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branch_f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf8000) == 0x68000)
&& !(0xfe & (1 << _BITS(bits, 12, 3)))
&& !(0xe0 & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branch_s32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf8000) == 0x68000)
&& !(0xf1 & (1 << _BITS(bits, 12, 3)))
&& !(0xf0 & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branch_u16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf8000) == 0x68000)
&& !(0xfe & (1 << _BITS(bits, 12, 3)))
&& !(0xed & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branch_i32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf8000) == 0x68000)
&& !(0xfe & (1 << _BITS(bits, 12, 3)))
&& !(0xf0 & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branch_u32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf8000) == 0x90000)))
bi_disasm_add_fmin_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf8000) == 0x68000)
&& !(0xe1 & (1 << _BITS(bits, 12, 3)))
&& !(0xed & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branch_i16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf8000) == 0x80000)))
bi_disasm_add_fmax_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf8000) == 0x68000)
&& !(0x9e & (1 << _BITS(bits, 12, 3)))
&& !(0x1 & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branch_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf8000) == 0x68000)
&& !(0xe9 & (1 << _BITS(bits, 12, 3)))
&& !(0xe0 & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_branch_s16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf0600) == 0x10000)))
bi_disasm_add_fmin_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf0600) == 0x40600)))
bi_disasm_add_ld_attr_tex_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf0600) == 0x0)))
bi_disasm_add_fmax_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf0600) == 0x40400)))
bi_disasm_add_ld_attr_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf0400) == 0x40000)))
bi_disasm_add_ld_attr_imm_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf0000) == 0x20000)))
bi_disasm_add_fadd_f32_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf0000) == 0xa0000)))
bi_disasm_add_fadd_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf0000) == 0x30000)))
bi_disasm_add_fcmp_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xf0000) == 0xb0000)))
bi_disasm_add_fcmp_v2f16(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0xe8000) == 0x88000)
&& !(0x2 & (1 << _BITS(bits, 9, 3)))
))
bi_disasm_add_fadd_rscale_f32(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f8c0) == 0x538c0)))
bi_disasm_add_ld_var_flat_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7f800) == 0x53800)))
bi_disasm_add_ld_var_flat_imm_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7c3e0) == 0x500a0)
&& !(0x2 & (1 << _BITS(bits, 3, 2)))
&& !(0xc0e0 & (1 << _BITS(bits, 10, 4)))
))
bi_disasm_add_ld_var_special_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7c0c0) == 0x500c0)
&& !(0xc0e0 & (1 << _BITS(bits, 10, 4)))
))
bi_disasm_add_ld_var_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else if (unlikely(((bits & 0x7c000) == 0x50000)
&& !(0xc0e0 & (1 << _BITS(bits, 10, 4)))
))
bi_disasm_add_ld_var_imm_0(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, last);
else
fprintf(fp, "INSTR_INVALID_ENC add %X\n", bits);
}