summaryrefslogtreecommitdiff
path: root/convert_shader.c
diff options
context:
space:
mode:
authorMatthias Hopf <mhopf@suse.de>2008-12-29 21:07:55 +0100
committerMatthias Hopf <mhopf@suse.de>2008-12-29 21:07:55 +0100
commitb1f4330a57eb45bd1f9659c9a2b170ef18a20233 (patch)
tree1880d4b0458a550ccfb50fb8e5f645561211fc52 /convert_shader.c
Initial public commit.
Diffstat (limited to 'convert_shader.c')
-rw-r--r--convert_shader.c1369
1 files changed, 1369 insertions, 0 deletions
diff --git a/convert_shader.c b/convert_shader.c
new file mode 100644
index 0000000..d9da913
--- /dev/null
+++ b/convert_shader.c
@@ -0,0 +1,1369 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdint.h>
+
+const char *rel[2] = {
+ "ABSOLUTE",
+ "RELATIVE"
+};
+
+const char *im[5] = {
+ "SQ_INDEX_AR_X",
+ "SQ_INDEX_AR_Y",
+ "SQ_INDEX_AR_Z",
+ "SQ_INDEX_AR_W",
+ "SQ_INDEX_LOOP",
+};
+
+const char *ps[4] = {
+ "SQ_PRED_SEL_OFF",
+ "Reserved",
+ "SQ_PRED_SEL_ZERO",
+ "SQ_PRED_SEL_ONE"
+};
+
+const char *elem[4] = {
+ "ELEM_X",
+ "ELEM_Y",
+ "ELEM_Z",
+ "ELEM_W",
+};
+
+const char *omod[4] = {
+ "SQ_ALU_OMOD_OFF",
+ "SQ_ALU_OMOD_M2",
+ "SQ_ALU_OMOD_M4",
+ "SQ_ALU_OMOD_D2",
+};
+
+const char *bs[6] = {
+ "SQ_ALU_VEC_012",
+ "SQ_ALU_VEC_021",
+ "SQ_ALU_VEC_120",
+ "SQ_ALU_VEC_102",
+ "SQ_ALU_VEC_201",
+ "SQ_ALU_VEC_210",
+};
+
+const char *op2[122] = {
+ "SQ_OP2_INST_ADD", //0
+ "SQ_OP2_INST_MUL", //1
+ "SQ_OP2_INST_MUL_IEEE", //2
+ "SQ_OP2_INST_MAX", //3
+ "SQ_OP2_INST_MIN", //4
+ "SQ_OP2_INST_MAX_DX10", //5
+ "SQ_OP2_INST_MIN_DX10", //6
+ "reserved", //7
+ "SQ_OP2_INST_SETE", //8
+ "SQ_OP2_INST_SETGT", //9
+ "SQ_OP2_INST_SETGE", //10
+ "SQ_OP2_INST_SETNE", //11
+ "SQ_OP2_INST_SETE_DX10", //12
+ "SQ_OP2_INST_SETGT_DX10", //13
+ "SQ_OP2_INST_SETGE_DX10", //14
+ "SQ_OP2_INST_SETNE_DX10", //15
+ "SQ_OP2_INST_FRACT", //16
+ "SQ_OP2_INST_TRUNC", //17
+ "SQ_OP2_INST_CEIL", //18
+ "SQ_OP2_INST_RNDNE", //19
+ "SQ_OP2_INST_FLOOR", //20
+ "SQ_OP2_INST_MOVA", //21
+ "SQ_OP2_INST_MOVA_FLOOR", //22
+ "reserved", //23
+ "SQ_OP2_INST_MOVA_INT", //24
+ "SQ_OP2_INST_MOV", //25
+ "SQ_OP2_INST_NOP", //26
+ "reserved", //27
+ "reserved", //28
+ "reserved", //29
+ "SQ_OP2_INST_PRED_SETGT_UINT", //30
+ "SQ_OP2_INST_PRED_SETGE_UINT", //31
+ "SQ_OP2_INST_PRED_SETE", //32
+ "SQ_OP2_INST_PRED_SETGT", //33
+ "SQ_OP2_INST_PRED_SETGE", //34
+ "SQ_OP2_INST_PRED_SETNE", //35
+ "SQ_OP2_INST_PRED_SET_INV", //36
+ "SQ_OP2_INST_PRED_SET_POP", //37
+ "SQ_OP2_INST_PRED_SET_CLR", //38
+ "SQ_OP2_INST_PRED_SET_RESTORE", //39
+ "SQ_OP2_INST_PRED_SETE_PUSH", //40
+ "SQ_OP2_INST_PRED_SETGT_PUSH", //41
+ "SQ_OP2_INST_PRED_SETGE_PUSH", //42
+ "SQ_OP2_INST_PRED_SETNE_PUSH", //43
+ "SQ_OP2_INST_KILLE", //44
+ "SQ_OP2_INST_KILLGT", //45
+ "SQ_OP2_INST_KILLGE", //46
+ "SQ_OP2_INST_KILLNE", //47
+ "SQ_OP2_INST_AND_INT", //48
+ "SQ_OP2_INST_OR_INT", //49
+ "SQ_OP2_INST_XOR_INT", //50
+ "SQ_OP2_INST_NOT_INT", //51
+ "SQ_OP2_INST_ADD_INT", //52
+ "SQ_OP2_INST_SUB_INT", //53
+ "SQ_OP2_INST_MAX_INT", //54
+ "SQ_OP2_INST_MIN_INT", //55
+ "SQ_OP2_INST_MAX_UINT", //56
+ "SQ_OP2_INST_MIN_UINT", //57
+ "SQ_OP2_INST_SETE_INT", //58
+ "SQ_OP2_INST_SETGT_INT", //59
+ "SQ_OP2_INST_SETGE_INT", //60
+ "SQ_OP2_INST_SETNE_INT", //61
+ "SQ_OP2_INST_SETGT_UINT", //62
+ "SQ_OP2_INST_SETGE_UINT", //63
+ "SQ_OP2_INST_KILLGT_UINT", //64
+ "SQ_OP2_INST_KILLGE_UINT", //65
+ "SQ_OP2_INST_PRED_SETE_INT", //66
+ "SQ_OP2_INST_PRED_SETGT_INT", //67
+ "SQ_OP2_INST_PRED_SETGE_INT", //68
+ "SQ_OP2_INST_PRED_SETNE_INT", //69
+ "SQ_OP2_INST_PRED_SETLT_INT", //70
+ "SQ_OP2_INST_PRED_SETLE_INT", //71
+ "SQ_OP2_INST_KILLGE_INT", //72
+ "SQ_OP2_INST_KILLNE_INT", //73
+ "SQ_OP2_INST_PRED_SETE_PUSH_INT", //74
+ "SQ_OP2_INST_PRED_SETGT_PUSH_INT", //75
+ "SQ_OP2_INST_PRED_SETGE_PUSH_INT", //76
+ "SQ_OP2_INST_PRED_SETNE_PUSH_INT", //77
+ "SQ_OP2_INST_PRED_SETLT_PUSH_INT", //78
+ "SQ_OP2_INST_PRED_SETLE_PUSH_INT", //79
+ "SQ_OP2_INST_DOT4", //80
+ "SQ_OP2_INST_DOT4_IEEE", //81
+ "SQ_OP2_INST_CUBE", //82
+ "SQ_OP2_INST_MAX4", //83
+ "invalid", //84
+ "invalid", //85
+ "invalid", //86
+ "invalid", //87
+ "invalid", //88
+ "invalid", //89
+ "invalid", //90
+ "invalid", //91
+ "invalid", //92
+ "invalid", //93
+ "invalid", //94
+ "invalid", //95
+ "SQ_OP2_INST_MOVA_GPR_INT", //96
+ "SQ_OP2_INST_EXP_IEEE", //97
+ "SQ_OP2_INST_LOG_CLAMPED", //98
+ "SQ_OP2_INST_LOG_IEEE", //99
+ "SQ_OP2_INST_RECIP_CLAMPED", //100
+ "SQ_OP2_INST_RECIP_FF", //101
+ "SQ_OP2_INST_RECIP_IEEE", //102
+ "SQ_OP2_INST_RECIPSQRT_CLAMPED", //103
+ "SQ_OP2_INST_RECIPSQRT_FF", //104
+ "SQ_OP2_INST_RECIPSQRT_IEEE", //105
+ "SQ_OP2_INST_SQRT_IEEE", //106
+ "SQ_OP2_INST_FLT_TO_INT", //107
+ "SQ_OP2_INST_INT_TO_FLT", //108
+ "SQ_OP2_INST_UINT_TO_FLT", //109
+ "SQ_OP2_INST_SIN", //110
+ "SQ_OP2_INST_COS", //111
+ "SQ_OP2_INST_ASHR_INT", //112
+ "SQ_OP2_INST_LSHR_INT", //113
+ "SQ_OP2_INST_LSHL_INT", //114
+ "SQ_OP2_INST_MULLO_INT", //115
+ "SQ_OP2_INST_MULHI_INT", //116
+ "SQ_OP2_INST_MULLO_UINT", //117
+ "SQ_OP2_INST_MULHI_UINT", //118
+ "SQ_OP2_INST_RECIP_INT", //119
+ "SQ_OP2_INST_RECIP_UINT", //120
+ "SQ_OP2_INST_FLT_TO_UINT", //121
+};
+
+const char *op3[32] = {
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "reserved",
+ "reserved",
+ "reserved",
+ "reserved",
+ "SQ_OP3_INST_MUL_LIT",
+ "SQ_OP3_INST_MUL_LIT_M2",
+ "SQ_OP3_INST_MUL_LIT_M4",
+ "SQ_OP3_INST_MUL_LIT_D2",
+ "SQ_OP3_INST_MULADD",
+ "SQ_OP3_INST_MULADD_M2",
+ "SQ_OP3_INST_MULADD_M4",
+ "SQ_OP3_INST_MULADD_D2",
+ "SQ_OP3_INST_MULADD_IEEE",
+ "SQ_OP3_INST_MULADD_IEEE_M2",
+ "SQ_OP3_INST_MULADD_IEEE_M4",
+ "SQ_OP3_INST_MULADD_IEEE_D2",
+ "SQ_OP3_INST_CNDE",
+ "SQ_OP3_INST_CNDGT",
+ "SQ_OP3_INST_CNDGE",
+ "reserved",
+ "SQ_OP3_INST_CNDE_INT",
+ "SQ_OP3_INST_CNDGT_INT",
+ "SQ_OP3_INST_CNDGE_INT",
+ "reserved",
+};
+
+const char *cond[4] = {
+ "SQ_CF_COND_ACTIVE",
+ "SQ_CF_COND_FALSE",
+ "SQ_CF_COND_BOOL",
+ "SQ_CF_COND_NOT_BOOL",
+};
+
+const char *cf_op[25] = {
+ "SQ_CF_INST_NOP",
+ "SQ_CF_INST_TEX",
+ "SQ_CF_INST_VTX",
+ "SQ_CF_INST_VTX_TC",
+ "SQ_CF_INST_LOOP_START",
+ "SQ_CF_INST_LOOP_END",
+ "SQ_CF_INST_START_DX10",
+ "SQ_CF_INST_START_NO_AL",
+ "SQ_CF_INST_LOOP_CONTINUE",
+ "SQ_CF_INST_LOOP_BREAK",
+ "SQ_CF_INST_JUMP",
+ "SQ_CF_INST_PUSH",
+ "SQ_CF_INST_PUSH_ELSE",
+ "SQ_CF_INST_ELSE",
+ "SQ_CF_INST_POP",
+ "SQ_CF_INST_POP_JUMP",
+ "SQ_CF_INST_POP_PUSH",
+ "SQ_CF_INST_POP_PUSH_ELSE",
+ "SQ_CF_INST_CALL",
+ "SQ_CF_CALL_FS",
+ "SQ_CF_INST_RETURN",
+ "SQ_CF_INST_EMIT_VERTEX",
+ "SQ_CF_INST_EMIT_CUT_VERTEX",
+ "SQ_CF_INST_CUT_VERTEX",
+ "SQ_CF_INST_KILL",
+};
+
+
+const char *cf_alu_op[16] = {
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "SQ_CF_INST_ALU",
+ "SQ_CF_INST_ALU_PUSH_BEFORE",
+ "SQ_CF_INST_ALU_POP_AFTER",
+ "SQ_CF_INST_ALU_POP2_AFTER",
+ "reserved",
+ "SQ_CF_INST_ALU_CONTINUE",
+ "SQ_CF_INST_ALU_BREAK",
+ "SQ_CF_INST_ALU_ELSE_AFTER",
+};
+
+const char *cf_exp_op[41] = {
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "SQ_CF_INST_MEM_STREAM0",
+ "SQ_CF_INST_MEM_STREAM1",
+ "SQ_CF_INST_MEM_STREAM2",
+ "SQ_CF_INST_MEM_STREAM3",
+ "SQ_CF_INST_MEM_SCRATCH",
+ "SQ_CF_INST_MEM_REDUCTION",
+ "SQ_CF_INST_MEM_RING",
+ "SQ_CF_INST_EXPORT",
+ "SQ_CF_INST_EXPORT_DONE",
+};
+
+const char *km[4] = {
+ "SQ_CF_KCACHE_NOP",
+ "SQ_CF_KCACHE_LOCK_1",
+ "SQ_CF_KCACHE_LOCK_2",
+ "SQ_CF_KCACHE_LOCK_LOOP_INDEX",
+};
+
+const char *sel[8] = {
+ "SQ_SEL_X",
+ "SQ_SEL_Y",
+ "SQ_SEL_Z",
+ "SQ_SEL_W",
+ "SQ_SEL_0",
+ "SQ_SEL_1",
+ "reserved",
+ "SQ_SEL_MASK",
+};
+
+const char *cf_exp_type[8] = {
+ "SQ_EXPORT_PIXEL",
+ "SQ_EXPORT_POS",
+ "SQ_EXPORT_PARAM",
+ "unused",
+};
+
+const char *cf_mem_type[8] = {
+ "SQ_EXPORT_WRITE",
+ "SQ_EXPORT_WRITE_IND",
+ "SQ_IMPORT_READ",
+ "SQ_IMPORT_READ_IND",
+};
+
+const char *ab_pixel[62] = {
+ "CF_PIXEL_MRT0",
+ "CF_PIXEL_MRT1",
+ "CF_PIXEL_MRT2",
+ "CF_PIXEL_MRT3",
+ "CF_PIXEL_MRT4",
+ "CF_PIXEL_MRT5",
+ "CF_PIXEL_MRT6",
+ "CF_PIXEL_MRT7",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "CF_PIXEL_MRT0_FOG",
+ "CF_PIXEL_MRT1_FOG",
+ "CF_PIXEL_MRT2_FOG",
+ "CF_PIXEL_MRT3_FOG",
+ "CF_PIXEL_MRT4_FOG",
+ "CF_PIXEL_MRT5_FOG",
+ "CF_PIXEL_MRT6_FOG",
+ "CF_PIXEL_MRT7_FOG",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "CF_PIXEL_Z",
+};
+
+const char *ab_pos[64] = {
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "invalid",
+ "CF_POS0",
+ "CF_POS1",
+ "CF_POS2",
+ "CF_POS3",
+};
+
+const char *tex_op[32] = {
+ "SQ_TEX_INST_VTX_FETCH",
+ "SQ_TEX_INST_VTX_SEMANTIC",
+ "reserved",
+ "SQ_TEX_INST_LD",
+ "SQ_TEX_INST_GET_TEXTURE_RESINFO",
+ "SQ_TEX_INST_GET_NUMBER_OF_SAMPLES",
+ "SQ_TEX_INST_GET_LOD",
+ "SQ_TEX_INST_GET_GRADIENTS_H",
+ "SQ_TEX_INST_GET_GRADIENTS_V",
+ "SQ_TEX_INST_GET_LERP",
+ "reserved",
+ "SQ_TEX_INST_SET_GRADIENTS_H",
+ "SQ_TEX_INST_SET_GRADIENTS_V",
+ "SQ_TEX_INST_PASS",
+ "Z set index for array of cubemaps",
+ "reserved",
+ "SQ_TEX_INST_SAMPLE",
+ "SQ_TEX_INST_SAMPLE_L",
+ "SQ_TEX_INST_SAMPLE_LB",
+ "SQ_TEX_INST_SAMPLE_LZ",
+ "SQ_TEX_INST_SAMPLE_G",
+ "SQ_TEX_INST_SAMPLE_G_L",
+ "SQ_TEX_INST_SAMPLE_G_LB",
+ "SQ_TEX_INST_SAMPLE_G_LZ",
+ "SQ_TEX_INST_SAMPLE_C",
+ "SQ_TEX_INST_SAMPLE_C_L",
+ "SQ_TEX_INST_SAMPLE_C_LB",
+ "SQ_TEX_INST_SAMPLE_C_LZ",
+ "SQ_TEX_INST_SAMPLE_C_G",
+ "SQ_TEX_INST_SAMPLE_C_G_L",
+ "SQ_TEX_INST_SAMPLE_C_G_LB",
+ "SQ_TEX_INST_SAMPLE_C_G_LZ",
+};
+
+const char *coord_type[2] = {
+ "TEX_UNNORMALIZED",
+ "TEX_NORMALIZED",
+};
+
+const char *vtx_op[2] = {
+ "SQ_VTX_INST_FETCH",
+ "SQ_VTX_INST_SEMANTIC",
+};
+
+const char *fetch_type[3] = {
+ "SQ_VTX_FETCH_VERTEX_DATA",
+ "SQ_VTX_FETCH_INSTANCE_DATA",
+ "SQ_VTX_FETCH_NO_INDEX_OFFSET",
+};
+
+const char *num_format_all[3] = {
+ "SQ_NUM_FORMAT_NORM",
+ "SQ_NUM_FORMAT_INT",
+ "SQ_NUM_FORMAT_SCALED",
+};
+
+const char *format_comp_all[2] = {
+ "SQ_FORMAT_COMP_UNSIGNED",
+ "SQ_FORMAT_COMP_SIGNED",
+};
+
+const char *srf_mode_all[2] = {
+ "SRF_MODE_ZERO_CLAMP_MINUS_ONE",
+ "SRF_MODE_NO_ZERO",
+};
+
+const char *endian_swap[3] = {
+ "SQ_ENDIAN_NONE",
+ "SQ_ENDIAN_8IN16",
+ "SQ_ENDIAN_8IN32",
+};
+
+void alu_dword1_op3(uint32_t dword1, int is_r700)
+{
+ int src2_sel, src2_rel;
+ int src2_elem, src2_neg;
+ int alu_inst;
+ int bank_swizzle, dst_gpr, dst_rel;
+ int dst_elem, clamp;
+
+ src2_sel = (dword1 >> 0) & 0x1ff;
+ src2_rel = (dword1 >> 9) & 0x1;
+ src2_elem = (dword1 >> 10) & 0x3;
+ src2_neg = (dword1 >> 12) & 0x1;
+
+ printf("ALU_DWORD1_OP3(");
+ if (is_r700) {
+ if (src2_sel == 248)
+ printf("SRC2_SEL(SQ_ALU_SRC_0),\n");
+ else if (src2_sel == 249)
+ printf("SRC2_SEL(SQ_ALU_SRC_1),\n");
+ else if (src2_sel == 250)
+ printf("SRC2_SEL(SQ_ALU_SRC_I_INT),\n");
+ else if (src2_sel == 251)
+ printf("SRC2_SEL(SQ_ALU_SRC_M_1_INT),\n");
+ else if (src2_sel == 252)
+ printf("SRC2_SEL(SQ_ALU_SRC_0_5),\n");
+ else if (src2_sel == 253)
+ printf("SRC2_SEL(SQ_ALU_SRC_LITERAL),\n");
+ else if (src2_sel == 254)
+ printf("SRC2_SEL(SQ_ALU_SRC_PV),\n");
+ else if (src2_sel == 255)
+ printf("SRC2_SEL(SQ_ALU_SRC_PS),\n");
+ else
+ printf("SRC2_SEL(%d),\n", src2_sel);
+ } else {
+ if (src2_sel == 248)
+ printf("SRC2_SEL(ALU_SRC_0),\n");
+ else if (src2_sel == 249)
+ printf("SRC2_SEL(ALU_SRC_1),\n");
+ else if (src2_sel == 250)
+ printf("SRC2_SEL(ALU_SRC_I_INT),\n");
+ else if (src2_sel == 251)
+ printf("SRC2_SEL(ALU_SRC_M_1_INT),\n");
+ else if (src2_sel == 252)
+ printf("SRC2_SEL(ALU_SRC_0_5),\n");
+ else if (src2_sel == 253)
+ printf("SRC2_SEL(ALU_SRC_LITERAL),\n");
+ else if (src2_sel == 254)
+ printf("SRC2_SEL(ALU_SRC_PV),\n");
+ else if (src2_sel == 255)
+ printf("SRC2_SEL(ALU_SRC_PS),\n");
+ else
+ printf("SRC2_SEL(%d),\n", src2_sel);
+ }
+ printf("\tSRC2_REL(%s),\n", rel[src2_rel]);
+ printf("\tSRC2_ELEM(%s),\n", elem[src2_elem]);
+ printf("\tSRC2_NEG(%d),\n", src2_neg);
+
+ alu_inst = (dword1 >> 13) & 0x1f;
+ printf("\tALU_INST(%s),\n", op3[alu_inst]);
+ bank_swizzle = (dword1 >> 18) & 0x7;
+ printf("\tBANK_SWIZZLE(%s),\n", bs[bank_swizzle]);
+ dst_gpr = (dword1 >> 21) & 0x7f;
+ printf("\tDST_GPR(%d),\n", dst_gpr);
+ dst_rel = (dword1 >> 28) & 0x1;
+ printf("\tDST_REL(%s),\n", rel[dst_rel]);
+ dst_elem = (dword1 >> 29) & 0x3;
+ printf("\tDST_ELEM(%s),\n", elem[dst_elem]);
+ clamp = (dword1 >> 31) & 0x1;
+ printf("\tCLAMP(%d)", clamp);
+ printf("),\n");
+}
+
+void alu_dword1_op2(uint32_t dword1, int is_r700)
+{
+ int src0_abs, src1_abs;
+ int update_execute_mask, update_pred;
+ int write_mask, fog_merge;
+ int outmod, alu_inst;
+ int bank_swizzle, dst_gpr, dst_rel;
+ int dst_elem, clamp;
+
+ printf("ALU_DWORD1_OP2(");
+ printf("adapt->chipset,\n");
+ src0_abs = (dword1 >> 0) & 0x1;
+ printf("\tSRC0_ABS(%d),\n", src0_abs);
+ src1_abs = (dword1 >> 1) & 0x1;
+ printf("\tSRC1_ABS(%d),\n", src1_abs);
+ update_execute_mask = (dword1 >> 2) & 0x1;
+ printf("\tUPDATE_EXECUTE_MASK(%d),\n", update_execute_mask);
+ update_pred = (dword1 >> 3) & 0x1;
+ printf("\tUPDATE_PRED(%d),\n", update_pred);
+ write_mask = (dword1 >> 4) & 0x1;
+ printf("\tWRITE_MASK(%d),\n", write_mask);
+ if (is_r700) {
+ printf("\tFOG_MERGE(0),\n");
+ outmod = (dword1 >> 5) & 0x3;
+ printf("\tOMOD(%s),\n", omod[outmod]);
+ alu_inst = (dword1 >> 7) & 0x7ff;
+ printf("\tALU_INST(%s),\n", op2[alu_inst]);
+ } else {
+ fog_merge = (dword1 >> 5) & 0x1;
+ printf("\tFOG_MERGE(%d),\n", fog_merge);
+ outmod = (dword1 >> 6) & 0x3;
+ printf("\tOMOD(%s),\n", omod[outmod]);
+ alu_inst = (dword1 >> 8) & 0x3ff;
+ printf("\tALU_INST(%s),\n", op2[alu_inst]);
+ }
+ bank_swizzle = (dword1 >> 18) & 0x7;
+ printf("\tBANK_SWIZZLE(%s),\n", bs[bank_swizzle]);
+ dst_gpr = (dword1 >> 21) & 0x7f;
+ printf("\tDST_GPR(%d),\n", dst_gpr);
+ dst_rel = (dword1 >> 28) & 0x1;
+ printf("\tDST_REL(%s),\n", rel[dst_rel]);
+ dst_elem = (dword1 >> 29) & 0x3;
+ printf("\tDST_ELEM(%s),\n", elem[dst_elem]);
+ clamp = (dword1 >> 31) & 0x1;
+ printf("\tCLAMP(%d)", clamp);
+ printf("),\n");
+}
+
+void alu_dword0(uint32_t dword0, int is_r700)
+{
+ int src0_sel, src1_sel;
+ int src0_rel, src1_rel;
+ int src0_elem, src1_elem;
+ int src0_neg, src1_neg;
+ int index_mode, pred_sel, last;
+
+ src0_sel = (dword0 >> 0) & 0x1ff;
+ src1_sel = (dword0 >> 13) & 0x1ff;
+
+ src0_rel = (dword0 >> 9) & 0x1;
+ src1_rel = (dword0 >> 22) & 0x1;
+
+ src0_elem = (dword0 >> 10) & 0x3;
+ src1_elem = (dword0 >> 23) & 0x3;
+
+ src0_neg = (dword0 >> 12) & 0x1;
+ src1_neg = (dword0 >> 25) & 0x1;
+
+ index_mode = (dword0 >> 26) & 0x7;
+ pred_sel = (dword0 >> 29) & 0x3;
+ last = (dword0 >> 31) & 0x1;
+
+ printf("ALU_DWORD0(");
+ if (is_r700) {
+ if (src0_sel == 248)
+ printf("SRC0_SEL(SQ_ALU_SRC_0),\n");
+ else if (src0_sel == 249)
+ printf("SRC0_SEL(SQ_ALU_SRC_1),\n");
+ else if (src0_sel == 250)
+ printf("SRC0_SEL(SQ_ALU_SRC_I_INT),\n");
+ else if (src0_sel == 251)
+ printf("SRC0_SEL(SQ_ALU_SRC_M_1_INT),\n");
+ else if (src0_sel == 252)
+ printf("SRC0_SEL(SQ_ALU_SRC_0_5),\n");
+ else if (src0_sel == 253)
+ printf("SRC0_SEL(SQ_ALU_SRC_LITERAL),\n");
+ else if (src0_sel == 254)
+ printf("SRC0_SEL(SQ_ALU_SRC_PV),\n");
+ else if (src0_sel == 255)
+ printf("SRC0_SEL(SQ_ALU_SRC_PS),\n");
+ else
+ printf("SRC0_SEL(%d),\n", src0_sel);
+ } else {
+ if (src0_sel == 248)
+ printf("SRC0_SEL(SQ_ALU_SRC_0),\n");
+ else if (src0_sel == 249)
+ printf("SRC0_SEL(SQ_ALU_SRC_1),\n");
+ else if (src0_sel == 250)
+ printf("SRC0_SEL(SQ_ALU_SRC_I_INT),\n");
+ else if (src0_sel == 251)
+ printf("SRC0_SEL(SQ_ALU_SRC_M_1_INT),\n");
+ else if (src0_sel == 252)
+ printf("SRC0_SEL(SQ_ALU_SRC_0_5),\n");
+ else if (src0_sel == 253)
+ printf("SRC0_SEL(SQ_ALU_SRC_LITERAL),\n");
+ else if (src0_sel == 254)
+ printf("SRC0_SEL(SQ_ALU_SRC_PV),\n");
+ else if (src0_sel == 255)
+ printf("SRC0_SEL(SQ_ALU_SRC_PS),\n");
+ else
+ printf("SRC0_SEL(%d),\n", src0_sel);
+ }
+ printf("\tSRC0_REL(%s),\n", rel[src0_rel]);
+ printf("\tSRC0_ELEM(%s),\n", elem[src0_elem]);
+ printf("\tSRC0_NEG(%d),\n", src0_neg);
+
+ if (is_r700) {
+ if (src1_sel == 248)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_0),\n");
+ else if (src1_sel == 249)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_1),\n");
+ else if (src1_sel == 250)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_I_INT),\n");
+ else if (src1_sel == 251)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_M_1_INT),\n");
+ else if (src1_sel == 252)
+ printf("\tSRC0_SEL(SQ_ALU_SRC_0_5),\n");
+ else if (src1_sel == 253)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_LITERAL),\n");
+ else if (src1_sel == 254)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_PV),\n");
+ else if (src1_sel == 255)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_PS),\n");
+ else
+ printf("\tSRC1_SEL(%d),\n", src1_sel);
+ } else {
+ if (src1_sel == 248)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_0),\n");
+ else if (src1_sel == 249)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_1),\n");
+ else if (src1_sel == 250)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_I_INT),\n");
+ else if (src1_sel == 251)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_M_1_INT),\n");
+ else if (src1_sel == 252)
+ printf("\tSRC0_SEL(SQ_ALU_SRC_0_5),\n");
+ else if (src1_sel == 253)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_LITERAL),\n");
+ else if (src1_sel == 254)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_PV),\n");
+ else if (src1_sel == 255)
+ printf("\tSRC1_SEL(SQ_ALU_SRC_PS),\n");
+ else
+ printf("\tSRC1_SEL(%d),\n", src1_sel);
+ }
+
+ printf("\tSRC1_REL(%s),\n", rel[src1_rel]);
+ printf("\tSRC1_ELEM(%s),\n", elem[src1_elem]);
+ printf("\tSRC1_NEG(%d),\n", src1_neg);
+ printf("\tINDEX_MODE(%s),\n", im[index_mode]);
+ printf("\tPRED_SEL(%s),\n", ps[pred_sel]);
+ printf("\tLAST(%d)", last);
+ printf("),\n");
+}
+
+void tex_dword0(uint32_t dword0, int is_r700)
+{
+ int inst, bfm, fwq;
+ int resource_id, src_gpr;
+ int sr, ac;
+
+ printf("TEX_DWORD0(");
+ inst = (dword0 >> 0) & 0x1f;
+ printf("TEX_INST(%s),\n", tex_op[inst]);
+ bfm = (dword0 >> 5) & 0x1;
+ printf("\tBC_FRAC_MODE(%d),\n", bfm);
+ fwq = (dword0 >> 7) & 0x1;
+ printf("\tFETCH_WHOLE_QUAD(%d),\n", fwq);
+ resource_id = (dword0 >> 8) & 0xff;
+ printf("\tRESOURCE_ID(%d),\n", resource_id);
+ src_gpr = (dword0 >> 16) & 0x7f;
+ printf("\tSRC_GPR(%d),\n", src_gpr);
+ sr = (dword0 >> 23) & 0x1;
+ printf("\tSRC_REL(%s),\n", rel[sr]);
+ if (is_r700) {
+ ac = (dword0 >> 24) & 0x1;
+ printf("\tR7xx_ALT_CONST(%d)", ac);
+ } else {
+ printf("\tR7xx_ALT_CONST(0)");
+ }
+ printf("),\n");
+}
+
+void tex_dword1(uint32_t dword1, int is_r700)
+{
+ int dst_gpr, dr;
+ int dsx, dsy, dsz, dsw;
+ int lod_bias;
+ int ctx, cty, ctz, ctw;
+
+ printf("TEX_DWORD1(");
+ dst_gpr = (dword1 >> 0) & 0x7f;
+ printf("DST_GPR(%d),\n", dst_gpr);
+ dr = (dword1 >> 7) & 0x1;
+ printf("\tDST_REL(%s),\n", rel[dr]);
+ dsx = (dword1 >> 9) & 0x7;
+ printf("\tDST_SEL_X(%s),\n", sel[dsx]);
+ dsy = (dword1 >> 12) & 0x7;
+ printf("\tDST_SEL_Y(%s),\n", sel[dsy]);
+ dsz = (dword1 >> 15) & 0x7;
+ printf("\tDST_SEL_Z(%s),\n", sel[dsz]);
+ dsw = (dword1 >> 18) & 0x7;
+ printf("\tDST_SEL_W(%s),\n", sel[dsw]);
+ lod_bias = (dword1 >> 21) & 0x7f;
+ printf("\tLOD_BIAS(%d),\n", lod_bias);
+ ctx = (dword1 >> 28) & 0x1;
+ printf("\tCOORD_TYPE_X(%s),\n", coord_type[ctx]);
+ cty = (dword1 >> 29) & 0x1;
+ printf("\tCOORD_TYPE_Y(%s),\n", coord_type[cty]);
+ ctz = (dword1 >> 30) & 0x1;
+ printf("\tCOORD_TYPE_Z(%s),\n", coord_type[ctz]);
+ ctw = (dword1 >> 31) & 0x1;
+ printf("\tCOORD_TYPE_W(%s)", coord_type[ctw]);
+ printf("),\n");
+}
+
+void tex_dword2(uint32_t dword2, int is_r700)
+{
+ int ox, oy, oz;
+ int sampler_id;
+ int ssx, ssy, ssz, ssw;
+
+ printf("TEX_DWORD2(");
+ ox = (dword2 >> 0) & 0x1f;
+ printf("OFFSET_X(%d),\n", ox);
+ oy = (dword2 >> 5) & 0x1f;
+ printf("\tOFFSET_Y(%d),\n", oy);
+ oz = (dword2 >> 10) & 0x1f;
+ printf("\tOFFSET_Z(%d),\n", oz);
+ sampler_id = (dword2 >> 15) & 0x1f;
+ printf("\tSAMPLER_ID(%d),\n", sampler_id);
+ ssx = (dword2 >> 20) & 0x7;
+ printf("\tSRC_SEL_X(%s),\n", sel[ssx]);
+ ssy = (dword2 >> 23) & 0x7;
+ printf("\tSRC_SEL_Y(%s),\n", sel[ssy]);
+ ssz = (dword2 >> 26) & 0x7;
+ printf("\tSRC_SEL_Z(%s),\n", sel[ssz]);
+ ssw = (dword2 >> 29) & 0x7;
+ printf("\tSRC_SEL_W(%s)", sel[ssw]);
+ printf("),\n");
+}
+
+void tex_dword_pad()
+{
+ printf("TEX_DWORD_PAD,\n");
+}
+
+void vtx_dword0(uint32_t dword0, int is_r700)
+{
+ int inst, ft, fwq;
+ int buffer_id, src_gpr;
+ int sr, ssx, mfc;
+
+ printf("VTX_DWORD0(");
+ inst = (dword0 >> 0) & 0x1f;
+ printf("VTX_INST(%s),\n", vtx_op[inst]);
+ ft = (dword0 >> 5) & 0x3;
+ printf("\tFETCH_TYPE(%s),\n", fetch_type[ft]);
+ fwq = (dword0 >> 7) & 0x1;
+ printf("\tFETCH_WHOLE_QUAD(%d),\n", fwq);
+ buffer_id = (dword0 >> 8) & 0xff;
+ printf("\tBUFFER_ID(%d),\n", buffer_id);
+ src_gpr = (dword0 >> 16) & 0x7f;
+ printf("\tSRC_GPR(%d),\n", src_gpr);
+ sr = (dword0 >> 23) & 0x1;
+ printf("\tSRC_REL(%s),\n", rel[sr]);
+ ssx = (dword0 >> 24) & 0x3;
+ printf("\tSRC_SEL_X(%s),\n", sel[ssx]);
+ mfc = (dword0 >> 26) & 0x3f;
+ mfc++;
+ printf("\tMEGA_FETCH_COUNT(%d)", mfc);
+ printf("),\n");
+}
+
+void vtx_dword1_sem(uint32_t dword1, int is_r700)
+{
+ int semantic_id;
+ int dsx, dsy, dsz, dsw;
+ int ucf, df, nfa, fca, sma;
+
+ printf("VTX_DWORD1_SEM(");
+ semantic_id = (dword1 >> 0) & 0xff;
+ printf("SEMANTIC_ID(%d),\n", semantic_id);
+ dsx = (dword1 >> 9) & 0x7;
+ printf("\tDST_SEL_X(%s),\n", sel[dsx]);
+ dsy = (dword1 >> 12) & 0x7;
+ printf("\tDST_SEL_Y(%s),\n", sel[dsy]);
+ dsz = (dword1 >> 15) & 0x7;
+ printf("\tDST_SEL_Z(%s),\n", sel[dsz]);
+ dsw = (dword1 >> 18) & 0x7;
+ printf("\tDST_SEL_W(%s),\n", sel[dsw]);
+ ucf = (dword1 >> 21) & 0x1;
+ printf("\tUSE_CONST_FIELDS(%d),\n", ucf);
+ df = (dword1 >> 22) & 0x3f;
+ printf("\tDATA_FORMAT(%d),\n", df);
+ nfa = (dword1 >> 28) & 0x3;
+ printf("\tNUM_FORMAT_ALL(%s),\n", num_format_all[nfa]);
+ fca = (dword1 >> 30) & 0x1;
+ printf("\tFORMAT_COMP_ALL(%s),\n", format_comp_all[fca]);
+ sma = (dword1 >> 31) & 0x1;
+ printf("\tSRF_MODE_ALL(%s)", srf_mode_all[sma]);
+ printf("),\n");
+}
+
+void vtx_dword1_gpr(uint32_t dword1, int is_r700)
+{
+ int dst_gpr, dr;
+ int dsx, dsy, dsz, dsw;
+ int ucf, df, nfa, fca, sma;
+
+ printf("VTX_DWORD1_GPR(");
+ dst_gpr = (dword1 >> 0) & 0x7f;
+ printf("DST_GPR(%d),\n", dst_gpr);
+ dr = (dword1 >> 7) & 0x1;
+ printf("\tDST_REL(%s),\n", rel[dr]);
+ dsx = (dword1 >> 9) & 0x7;
+ printf("\tDST_SEL_X(%s),\n", sel[dsx]);
+ dsy = (dword1 >> 12) & 0x7;
+ printf("\tDST_SEL_Y(%s),\n", sel[dsy]);
+ dsz = (dword1 >> 15) & 0x7;
+ printf("\tDST_SEL_Z(%s),\n", sel[dsz]);
+ dsw = (dword1 >> 18) & 0x7;
+ printf("\tDST_SEL_W(%s),\n", sel[dsw]);
+ ucf = (dword1 >> 21) & 0x1;
+ printf("\tUSE_CONST_FIELDS(%d),\n", ucf);
+ df = (dword1 >> 22) & 0x3f;
+ printf("\tDATA_FORMAT(%d),\n", df);
+ nfa = (dword1 >> 28) & 0x3;
+ printf("\tNUM_FORMAT_ALL(%s),\n", num_format_all[nfa]);
+ fca = (dword1 >> 30) & 0x1;
+ printf("\tFORMAT_COMP_ALL(%s),\n", format_comp_all[fca]);
+ sma = (dword1 >> 31) & 0x1;
+ printf("\tSRF_MODE_ALL(%s)", srf_mode_all[sma]);
+ printf("),\n");
+}
+
+void vtx_dword2(uint32_t dword2, int is_r700)
+{
+ int offset, es;
+ int cbns, mf;
+
+ printf("VTX_DWORD2(");
+ offset = (dword2 >> 0) & 0xffff;
+ printf("OFFSET(%d),\n", offset);
+ es = (dword2 >> 16) & 0x3;
+ printf("\tENDIAN_SWAP(%s),\n", endian_swap[es]);
+ cbns = (dword2 >> 18) & 0x1;
+ printf("\tCONST_BUF_NO_STRIDE(%d),\n", cbns);
+ mf = (dword2 >> 19) & 0x1;
+ printf("\tMEGA_FETCH(%d),\n", mf);
+ printf("),\n");
+}
+
+void vtx_dword_pad()
+{
+ printf("VTX_DWORD_PAD,\n");
+}
+
+void cf_dword0(uint32_t dword0, int is_r700)
+{
+ printf("CF_DWORD0(");
+ printf("ADDR(%d)", dword0);
+ printf("),\n");
+}
+
+void cf_dword1(uint32_t dword1, int is_r700)
+{
+ int pop_count, cf_const;
+ int cf_cond, count, call_count;
+ int eop, vpm, cf_inst, wqm;
+ int barrier;
+
+ printf("CF_DWORD1(");
+ pop_count = (dword1 >> 0) & 0x7;
+ printf("POP_COUNT(%d),\n", pop_count);
+ cf_const = (dword1 >> 3) & 0x1f;
+ printf("\tCF_CONST(%d),\n", cf_const);
+ cf_cond = (dword1 >> 8) & 0x3;
+ printf("\tCOND(%s),\n", cond[cf_cond]);
+ count = (dword1 >> 10) & 0x7;
+ count++;
+ printf("\tCOUNT(%d),\n", count);
+ call_count = (dword1 >> 13) & 0x3f;
+ printf("\tCALL_COUNT(%d),\n", call_count);
+ eop = (dword1 >> 21) & 0x1;
+ printf("\tEND_OF_PROGRAM(%d),\n", eop);
+ vpm = (dword1 >> 22) & 0x1;
+ printf("\tVALID_PIXEL_MODE(%d),\n", vpm);
+ cf_inst = (dword1 >> 23) & 0x7f;
+ printf("\tCF_INST(%s),\n", cf_op[cf_inst]);
+ wqm = (dword1 >> 30) & 0x1;
+ printf("\tWHOLE_QUAD_MODE(%d),\n", wqm);
+ barrier = (dword1 >> 31) & 0x1;
+ printf("\tBARRIER(%d)", barrier);
+ printf("),\n");
+}
+
+void cf_alu_dword0(uint32_t dword0, int is_r700)
+{
+ int kb0, kb1, km0;
+
+ kb0 = (dword0 >> 22) & 0xf;
+ kb1 = (dword0 >> 26) & 0xf;
+ km0 = (dword0 >> 30) & 0x3;
+
+ printf("CF_ALU_DWORD0(");
+ printf("ADDR(%d),\n", dword0 & 0x3fffff);
+ printf("\tKCACHE_BANK0(%d),\n", kb0);
+ printf("\tKCACHE_BANK1(%d),\n", kb1);
+ printf("\tKCACHE_MODE0(%s)", km[km0]);
+ printf("),\n");
+}
+
+void cf_alu_dword1(uint32_t dword1, int is_r700)
+{
+ int km1, ka0, ka1, count, uw;
+ int cf_inst, wqm, barrier;
+
+ printf("CF_ALU_DWORD1(");
+ km1 = (dword1 >> 0) & 0x3;
+ printf("KCACHE_MODE1(%s),\n", km[km1]);
+ ka0 = (dword1 >> 2) & 0xff;
+ printf("\tKCACHE_ADDR0(%d),\n", ka0);
+ ka1 = (dword1 >> 10) & 0xff;
+ printf("\tKCACHE_ADDR1(%d),\n", ka1);
+ count = (dword1 >> 18) & 0x7f;
+ count++;
+ printf("\tCOUNT(%d),\n", count);
+ uw = (dword1 >> 25) & 0x1;
+ printf("\tUSES_WATERFALL(%d),\n", uw);
+ cf_inst = (dword1 >> 26) & 0xf;
+ printf("\tCF_INST(%s),\n", cf_alu_op[cf_inst]);
+ wqm = (dword1 >> 30) & 0x1;
+ printf("\tWHOLE_QUAD_MODE(%d),\n", wqm);
+ barrier = (dword1 >> 31) & 0x1;
+ printf("\tBARRIER(%d)", barrier);
+ printf("),\n");
+}
+
+void cf_alloc_imp_exp_dword0(uint32_t dword0, int is_mem, int is_r700)
+{
+ int array_base, type, rw_gpr;
+ int rw_rel, index_gpr, elem_size;
+
+ printf("CF_ALLOC_IMP_EXP_DWORD0(");
+ array_base = (dword0 >> 0) & 0x1fff;
+ type = (dword0 >> 13) & 0x3;
+ if (is_mem) {
+ printf("ARRAY_BASE(%d),\n", array_base);
+ printf("\tTYPE(%s),\n", cf_mem_type[type]);
+ } else {
+ if (type == 0)
+ printf("ARRAY_BASE(%s),\n", ab_pixel[array_base]);
+ else if (type == 1)
+ printf("ARRAY_BASE(%s),\n", ab_pos[array_base]);
+ else
+ printf("ARRAY_BASE(%d),\n", array_base);
+ printf("\tTYPE(%s),\n", cf_exp_type[type]);
+ }
+ rw_gpr = (dword0 >> 15) & 0x7f;
+ printf("\tRW_GPR(%d),\n", rw_gpr);
+ rw_rel = (dword0 >> 22) & 0x1;
+ printf("\tRW_REL(%s),\n", rel[rw_rel]);
+ index_gpr = (dword0 >> 23) & 0x7f;
+ printf("\tINDEX_GPR(%d),\n", index_gpr);
+ elem_size = (dword0 >> 30) & 0x3;
+ printf("\tELEM_SIZE(%d)", elem_size);
+ printf("),\n");
+}
+
+void cf_alloc_imp_exp_dword1_buf(uint32_t dword1, int is_r700)
+{
+ int array_size, comp_mask, elem_loop;
+ int bc, eop, vpm, cf_inst, wqm, barrier;
+
+ printf("CF_ALLOC_IMP_EXP_DWORD1_BUF(");
+ array_size = (dword1 >> 0) & 0xfff;
+ printf("ARRAY_SIZE(%d),\n", array_size);
+ comp_mask = (dword1 >> 12) & 0xf;
+ printf("\tCOMP_MASK(%d),\n", comp_mask);
+ if (is_r700) {
+ printf("\tR6xx_ELEM_LOOP(0),\n");
+ } else {
+ elem_loop = (dword1 >> 16) & 0x1;
+ printf("\tR6xx_ELEM_LOOP(%d),\n", elem_loop);
+ }
+ bc = (dword1 >> 17) & 0xf;
+ printf("\tBURST_COUNT(%d),\n", bc);
+ eop = (dword1 >> 21) & 0x1;
+ printf("\tEND_OF_PROGRAM(%d),\n", eop);
+ vpm = (dword1 >> 22) & 0x1;
+ printf("\tVALID_PIXEL_MODE(%d),\n", vpm);
+ cf_inst = (dword1 >> 23) & 0x7f;
+ printf("\tCF_INST(%s),\n", cf_exp_op[cf_inst]);
+ wqm = (dword1 >> 30) & 0x1;
+ printf("\tWHOLE_QUAD_MODE(%d),\n", wqm);
+ barrier = (dword1 >> 31) & 0x1;
+ printf("\tBARRIER(%d)", barrier);
+ printf("),\n");
+
+}
+
+void cf_alloc_imp_exp_dword1_swiz(uint32_t dword1, int is_r700)
+{
+ int sel_x, sel_y, sel_z, sel_w, elem_loop;
+ int bc, eop, vpm, cf_inst, wqm, barrier;
+
+ printf("CF_ALLOC_IMP_EXP_DWORD1_SWIZ(");
+ sel_x = (dword1 >> 0) & 0x7;
+ printf("SRC_SEL_X(%s),\n", sel[sel_x]);
+ sel_y = (dword1 >> 3) & 0x7;
+ printf("\tSRC_SEL_Y(%s),\n", sel[sel_y]);
+ sel_z = (dword1 >> 6) & 0x7;
+ printf("\tSRC_SEL_Z(%s),\n", sel[sel_z]);
+ sel_w = (dword1 >> 9) & 0x7;
+ printf("\tSRC_SEL_W(%s),\n", sel[sel_w]);
+ elem_loop = (dword1 >> 16) & 0x1;
+ printf("\tELEM_LOOP(%d),\n", elem_loop);
+ bc = (dword1 >> 17) & 0xf;
+ printf("\tBURST_COUNT(%d),\n", bc);
+ eop = (dword1 >> 21) & 0x1;
+ printf("\tEND_OF_PROGRAM(%d),\n", eop);
+ vpm = (dword1 >> 22) & 0x1;
+ printf("\tVALID_PIXEL_MODE(%d),\n", vpm);
+ cf_inst = (dword1 >> 23) & 0x7f;
+ printf("\tCF_INST(%s),\n", cf_exp_op[cf_inst]);
+ wqm = (dword1 >> 30) & 0x1;
+ printf("\tWHOLE_QUAD_MODE(%d),\n", wqm);
+ barrier = (dword1 >> 31) & 0x1;
+ printf("\tBARRIER(%d)", barrier);
+ printf("),\n");
+
+}
+
+void do_alu_clause(uint32_t *inst, int offset, int count, int is_r700)
+{
+ uint32_t dword0, dword1;
+ int op3;
+ int src0, src1, src2;
+ int elem0, elem1, elem2;
+ int inline_const_count = 0;
+
+ while (count) {
+ dword0 = inst[offset];
+ dword1 = inst[offset + 1];
+ if (inline_const_count) {
+ printf("0x%08x,\n",dword0);
+ printf("0x%08x,\n",dword1);
+ inline_const_count--;
+ } else {
+ src0 = (dword0 >> 0) & 0x1ff;
+ src1 = (dword0 >> 13) & 0x1ff;
+ elem0 = (dword0 >> 10) & 0x3;
+ elem1 = (dword0 >> 23) & 0x3;
+ alu_dword0(dword0, is_r700);
+ // if high 3 bits of inst are 000b, OP2, else OP3
+ op3 = (dword1 >> 15) & 0x7;
+ if (op3) {
+ alu_dword1_op3(dword1, is_r700);
+ src2 = (dword1 >> 0) & 0x1ff;
+ elem2 = (dword1 >> 10) & 0x3;
+ } else {
+ alu_dword1_op2(dword1, is_r700);
+ src2 = 0;
+ elem2 = 0;
+ }
+
+ // inline constants
+ if ((src0 == 253) || (src1 == 253) || (src2 == 253)) {
+ if ((elem0 > 1) || (elem1 > 1) || (elem2 > 1))
+ inline_const_count = 2; // 3-4 constants
+ else
+ inline_const_count = 1; // 1-2 constants
+ }
+ }
+ count--;
+ offset += 2;
+ }
+}
+
+void do_tex_clause(uint32_t *inst, int offset, int count, int is_r700)
+{
+ uint32_t dword0, dword1, dword2;
+
+ while (count) {
+ dword0 = inst[offset];
+ dword1 = inst[offset + 1];
+ dword2 = inst[offset + 2];
+ tex_dword0(dword0, is_r700);
+ tex_dword1(dword1, is_r700);
+ tex_dword2(dword2, is_r700);
+ tex_dword_pad();
+
+ count--;
+ offset += 4;
+ }
+}
+
+void do_vtx_clause(uint32_t *inst, int offset, int count, int is_r700)
+{
+ uint32_t dword0, dword1, dword2;
+ int op;
+
+ while (count) {
+ dword0 = inst[offset];
+ dword1 = inst[offset + 1];
+ dword2 = inst[offset + 2];
+ vtx_dword0(dword0, is_r700);
+ // if op = 1, sem, else gpr
+ op = (dword0 >> 0) & 0x1f;
+ if (op == 1)
+ vtx_dword1_sem(dword1, is_r700);
+ else
+ vtx_dword1_gpr(dword1, is_r700);
+ vtx_dword2(dword2, is_r700);
+ vtx_dword_pad();
+
+ count--;
+ offset += 4;
+ }
+}
+
+static int do_cf_inst(uint32_t *inst, uint32_t offset, int is_r700)
+{
+ uint32_t dword0, dword1;
+ int encoding, addr, count, op;
+ int eop = 0;
+
+ dword0 = inst[offset];
+ dword1 = inst[offset + 1];
+
+ // if high 2 bits of inst are 10b or 11b, ALU,
+ // else if 01b, imp/exp
+ // else if 00b, cf
+ encoding = (dword1 >> 28) & 0x3;
+ if (encoding >= 2) {
+ cf_alu_dword0(dword0, is_r700);
+ cf_alu_dword1(dword1, is_r700);
+ addr = (dword0 >> 0) & 0x3fffff;
+ addr *= 2;
+ count = (dword1 >> 18) & 0x7f;
+ count++;
+ do_alu_clause(inst, addr, count, is_r700);
+ } else if (encoding == 1) {
+ op = (dword1 >> 23) & 0x7f;
+ if ((op == 39) || (op == 40)) {
+ // export inst
+ cf_alloc_imp_exp_dword0(dword0, 0, is_r700);
+ cf_alloc_imp_exp_dword1_swiz(dword1, is_r700);
+ } else {
+ // mem inst
+ cf_alloc_imp_exp_dword0(dword0, 1, is_r700);
+ cf_alloc_imp_exp_dword1_buf(dword1, is_r700);
+ }
+ eop = (dword1 >> 21) & 0x1;
+ } else {
+ op = (dword1 >> 23) & 0x7f;
+ addr = dword0;
+ addr *= 2;
+ count = (dword1 >> 10) & 0x7;
+ if (is_r700)
+ count += (dword1 >> 19) & 0x1;
+ count++;
+ cf_dword0(dword0, is_r700);
+ cf_dword1(dword1, is_r700);
+ if (op == 1)
+ do_tex_clause(inst, addr, count, is_r700);
+ else if ((op == 2) || (op == 3))
+ do_vtx_clause(inst, addr, count, is_r700);
+ eop = (dword1 >> 21) & 0x1;
+ }
+ return eop;
+}
+
+int main () {
+ uint32_t sp[] = {
+ 0x00000014,
+ 0x00800400,
+ 0x00000003,
+ 0xA03C0000,
+ 0xC0018000,
+ 0x94200688,
+ 0x10200001,
+ 0x004C2810,
+ 0x10A00401,
+ 0x204C2800,
+ 0x11200801,
+ 0x404C2800,
+ 0x91A00C01,
+ 0x60442800,
+ 0x10202001,
+ 0x004C2800,
+ 0x10A02401,
+ 0x204C2810,
+ 0x11202801,
+ 0x404C2800,
+ 0x91A02C01,
+ 0x60442800,
+ 0x10204001,
+ 0x004C2800,
+ 0x10A04401,
+ 0x204C2800,
+ 0x11204801,
+ 0x404C2810,
+ 0x91A04C01,
+ 0x60442800,
+ 0x10000002,
+ 0x00740C90,
+ 0x10000402,
+ 0x20740C90,
+ 0x10000802,
+ 0x40740C90,
+ 0x90000C02,
+ 0x60600C90,
+ 0x00000000,
+ 0x00000000,
+ 0x00000010,
+ 0xF00FF001,
+ 0x68800000,
+ 0xDEADDEAD,
+ 0x00000110,
+ 0xF01D1E01,
+ 0x68808000,
+ 0xDEADDEAD,
+ };
+ int is_r700 = 1; //1
+ uint32_t dword0 = sp[0];
+ uint32_t dword1 = sp[1];
+ uint32_t offset = 0;
+ int eop = 0;
+
+ while (offset < (sizeof(sp) / 8)) {
+ eop = do_cf_inst(sp, offset, is_r700);
+
+ if (eop)
+ break;
+ offset += 2;
+ }
+
+ return 0;
+}