+ int o = 0;
+ if (rel && index_mode >= 5 && sel < 128)
+ o += fprintf(stderr, "G");
+ if (rel || need_brackets) {
+ o += fprintf(stderr, "[");
+ }
+ o += fprintf(stderr, "%d", sel);
+ if (rel) {
+ if (index_mode == 0 || index_mode == 6)
+ o += fprintf(stderr, "+AR");
+ else if (index_mode == 4)
+ o += fprintf(stderr, "+AL");
+ }
+ if (rel || need_brackets) {
+ o += fprintf(stderr, "]");
+ }
+ return o;
+}
+
+static int print_dst(struct r600_bytecode_alu *alu)
+{
+ int o = 0;
+ unsigned sel = alu->dst.sel;
+ char reg_char = 'R';
+ if (sel > 128 - 4) { /* clause temporary gpr */
+ sel -= 128 - 4;
+ reg_char = 'T';
+ }
+
+ if (alu_writes(alu)) {
+ o += fprintf(stderr, "%c", reg_char);
+ o += print_sel(alu->dst.sel, alu->dst.rel, alu->index_mode, 0);
+ } else {
+ o += fprintf(stderr, "__");
+ }
+ o += fprintf(stderr, ".");
+ o += print_swizzle(alu->dst.chan);
+ return o;
+}
+
+static int print_src(struct r600_bytecode_alu *alu, unsigned idx)
+{
+ int o = 0;
+ struct r600_bytecode_alu_src *src = &alu->src[idx];
+ unsigned sel = src->sel, need_sel = 1, need_chan = 1, need_brackets = 0;
+
+ if (src->neg)
+ o += fprintf(stderr,"-");
+ if (src->abs)
+ o += fprintf(stderr,"|");
+
+ if (sel < 128 - 4) {
+ o += fprintf(stderr, "R");
+ } else if (sel < 128) {
+ o += fprintf(stderr, "T");
+ sel -= 128 - 4;
+ } else if (sel < 160) {
+ o += fprintf(stderr, "KC0");
+ need_brackets = 1;
+ sel -= 128;
+ } else if (sel < 192) {
+ o += fprintf(stderr, "KC1");
+ need_brackets = 1;
+ sel -= 160;
+ } else if (sel >= 512) {
+ o += fprintf(stderr, "C%d", src->kc_bank);
+ need_brackets = 1;
+ sel -= 512;
+ } else if (sel >= 448) {
+ o += fprintf(stderr, "Param");
+ sel -= 448;
+ need_chan = 0;
+ } else if (sel >= 288) {
+ o += fprintf(stderr, "KC3");
+ need_brackets = 1;
+ sel -= 288;
+ } else if (sel >= 256) {
+ o += fprintf(stderr, "KC2");
+ need_brackets = 1;
+ sel -= 256;
+ } else {
+ need_sel = 0;
+ need_chan = 0;
+ switch (sel) {
+ case EG_V_SQ_ALU_SRC_LDS_DIRECT_A:
+ o += fprintf(stderr, "LDS_A[0x%08X]", src->value);
+ break;
+ case EG_V_SQ_ALU_SRC_LDS_DIRECT_B:
+ o += fprintf(stderr, "LDS_B[0x%08X]", src->value);
+ break;
+ case EG_V_SQ_ALU_SRC_LDS_OQ_A:
+ o += fprintf(stderr, "LDS_OQ_A");
+ need_chan = 1;
+ break;
+ case EG_V_SQ_ALU_SRC_LDS_OQ_B:
+ o += fprintf(stderr, "LDS_OQ_B");
+ need_chan = 1;
+ break;
+ case EG_V_SQ_ALU_SRC_LDS_OQ_A_POP:
+ o += fprintf(stderr, "LDS_OQ_A_POP");
+ need_chan = 1;
+ break;
+ case EG_V_SQ_ALU_SRC_LDS_OQ_B_POP:
+ o += fprintf(stderr, "LDS_OQ_B_POP");
+ need_chan = 1;
+ break;
+ case V_SQ_ALU_SRC_PS:
+ o += fprintf(stderr, "PS");
+ break;
+ case V_SQ_ALU_SRC_PV:
+ o += fprintf(stderr, "PV");
+ need_chan = 1;
+ break;
+ case V_SQ_ALU_SRC_LITERAL:
+ o += fprintf(stderr, "[0x%08X %f]", src->value, u_bitcast_u2f(src->value));
+ break;
+ case V_SQ_ALU_SRC_0_5:
+ o += fprintf(stderr, "0.5");
+ break;
+ case V_SQ_ALU_SRC_M_1_INT:
+ o += fprintf(stderr, "-1");
+ break;
+ case V_SQ_ALU_SRC_1_INT:
+ o += fprintf(stderr, "1");
+ break;
+ case V_SQ_ALU_SRC_1:
+ o += fprintf(stderr, "1.0");
+ break;
+ case V_SQ_ALU_SRC_0:
+ o += fprintf(stderr, "0");
+ break;
+ default:
+ o += fprintf(stderr, "??IMM_%d", sel);
+ break;
+ }
+ }
+
+ if (need_sel)
+ o += print_sel(sel, src->rel, alu->index_mode, need_brackets);
+
+ if (need_chan) {
+ o += fprintf(stderr, ".");
+ o += print_swizzle(src->chan);
+ }
+
+ if (src->abs)
+ o += fprintf(stderr,"|");
+
+ return o;
+}
+
+static int print_indent(int p, int c)
+{
+ int o = 0;
+ while (p++ < c)
+ o += fprintf(stderr, " ");
+ return o;
+}
+
+void r600_bytecode_disasm(struct r600_bytecode *bc)
+{
+ const char *index_mode[] = {"CF_INDEX_NONE", "CF_INDEX_0", "CF_INDEX_1"};
+ static int index = 0;