Fixing CF decode.
This commit is contained in:
parent
7b97d475c2
commit
14bf4912d1
|
@ -699,30 +699,7 @@ static void print_cf(instr_cf_t *cf, int level)
|
||||||
* which refers to ALU/FETCH instructions that follow it by address.
|
* which refers to ALU/FETCH instructions that follow it by address.
|
||||||
* 2) ALU and FETCH instructions
|
* 2) ALU and FETCH instructions
|
||||||
*/
|
*/
|
||||||
|
void disasm_exec(uint32_t *dwords, int sizedwords, int level, enum shader_t type, instr_cf_t* cf) {
|
||||||
int disasm_a2xx(uint32_t *dwords, int sizedwords, int level, enum shader_t type)
|
|
||||||
{
|
|
||||||
instr_cf_t *cfs = (instr_cf_t *)dwords;
|
|
||||||
int idx, max_idx;
|
|
||||||
|
|
||||||
for (idx = 0; ; idx++) {
|
|
||||||
if (idx > sizedwords) {
|
|
||||||
// Failed to find a control instruction.
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
instr_cf_t *cf = &cfs[idx];
|
|
||||||
if (cf_exec(cf)) {
|
|
||||||
max_idx = 2 * cf->exec.address;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (idx = 0; idx < max_idx; idx++) {
|
|
||||||
instr_cf_t *cf = &cfs[idx];
|
|
||||||
|
|
||||||
print_cf(cf, level);
|
|
||||||
|
|
||||||
if (cf_exec(cf)) {
|
|
||||||
uint32_t sequence = cf->exec.serialize;
|
uint32_t sequence = cf->exec.serialize;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
for (i = 0; i < cf->exec.count; i++) {
|
for (i = 0; i < cf->exec.count; i++) {
|
||||||
|
@ -735,6 +712,29 @@ int disasm_a2xx(uint32_t *dwords, int sizedwords, int level, enum shader_t type)
|
||||||
sequence >>= 2;
|
sequence >>= 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int disasm_a2xx(uint32_t *dwords, int sizedwords, int level, enum shader_t type)
|
||||||
|
{
|
||||||
|
instr_cf_t cfa;
|
||||||
|
instr_cf_t cfb;
|
||||||
|
for (int idx = 0; idx < sizedwords; idx += 3) {
|
||||||
|
uint32_t dword_0 = dwords[idx + 0];
|
||||||
|
uint32_t dword_1 = dwords[idx + 1];
|
||||||
|
uint32_t dword_2 = dwords[idx + 2];
|
||||||
|
cfa.dword_0 = dword_0;
|
||||||
|
cfa.dword_1 = dword_1 & 0xFFFF;
|
||||||
|
cfb.dword_0 = (dword_1 >> 16) | (dword_2 << 16);
|
||||||
|
cfb.dword_1 = dword_2 >> 16;
|
||||||
|
print_cf(&cfa, level);
|
||||||
|
if (cf_exec(&cfa)) {
|
||||||
|
disasm_exec(dwords, sizedwords, level, type, &cfa);
|
||||||
|
}
|
||||||
|
print_cf(&cfb, level);
|
||||||
|
if (cf_exec(&cfb)) {
|
||||||
|
disasm_exec(dwords, sizedwords, level, type, &cfb);
|
||||||
|
}
|
||||||
|
if (cfa.opc == EXEC_END || cfb.opc == EXEC_END) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -359,6 +359,10 @@ XEPACKEDUNION(instr_cf_t, {
|
||||||
uint32_t : 12;
|
uint32_t : 12;
|
||||||
uint32_t opc : 4; // instr_cf_opc_t
|
uint32_t opc : 4; // instr_cf_opc_t
|
||||||
});
|
});
|
||||||
|
XEPACKEDSTRUCTANONYMOUS({
|
||||||
|
uint32_t dword_0;
|
||||||
|
uint32_t dword_1;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue