[PPC] disasm: BC formatting improvements
This commit is contained in:
parent
af7bc97429
commit
67e3b1f453
|
@ -191,17 +191,147 @@ void PrintDisasm_bclrx(const PPCDecodeData& d, StringBuffer* str) {
|
||||||
str->AppendFormat("%d", d.XL.BI());
|
str->AppendFormat("%d", d.XL.BI());
|
||||||
}
|
}
|
||||||
void PrintDisasm_bcx(const PPCDecodeData& d, StringBuffer* str) {
|
void PrintDisasm_bcx(const PPCDecodeData& d, StringBuffer* str) {
|
||||||
// bc[LK][AA] [BO], [BI], [ADDR]
|
// [bc][LK][AA][+-] [BO], [BI], [ADDR]
|
||||||
size_t str_start = str->length();
|
size_t str_start = str->length();
|
||||||
|
|
||||||
|
const uint32_t bo = d.B.BO();
|
||||||
|
const uint32_t bi = d.B.BI();
|
||||||
|
const uint32_t addr = d.B.ADDR();
|
||||||
|
|
||||||
|
const bool bo0 = bo & 0x10;
|
||||||
|
const bool bo1 = bo & 0x08;
|
||||||
|
const bool bo2 = bo & 0x04;
|
||||||
|
const bool bo3 = bo & 0x02;
|
||||||
|
const bool bo4 = bo & 0x01;
|
||||||
|
int sign_char = 0; // Default no sign
|
||||||
|
|
||||||
|
if (bo0 && !bo1 && !bo2 && bo3 && !bo4) {
|
||||||
|
str->Append("bdz");
|
||||||
|
} else if (bo0 && bo1 && !bo2 && bo3 && !bo4) {
|
||||||
|
str->Append("bdz");
|
||||||
|
sign_char = -1;
|
||||||
|
} else if (bo0 && bo1 && !bo2 && bo3 && bo4) {
|
||||||
|
str->Append("bdz");
|
||||||
|
sign_char = +1;
|
||||||
|
} else if (bo0 && !bo1 && !bo2 && !bo3 && !bo4) {
|
||||||
|
str->Append("bdnz");
|
||||||
|
} else if (bo0 && bo1 && !bo2 && !bo3 && !bo4) {
|
||||||
|
str->Append("bdnz");
|
||||||
|
sign_char = -1;
|
||||||
|
} else if (bo0 && bo1 && !bo2 && !bo3 && bo4) {
|
||||||
|
str->Append("bdnz");
|
||||||
|
sign_char = +1;
|
||||||
|
} else if (!bo0 && !bo1 && bo2 && !bo3 && !bo4) {
|
||||||
|
switch (bi % 4) {
|
||||||
|
case 0x0:
|
||||||
|
str->Append("bge");
|
||||||
|
break;
|
||||||
|
case 0x1:
|
||||||
|
str->Append("ble");
|
||||||
|
break;
|
||||||
|
case 0x2:
|
||||||
|
str->Append("bne");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (!bo0 && !bo1 && bo2 && bo3 && !bo4) {
|
||||||
|
switch (bi % 4) {
|
||||||
|
case 0x0:
|
||||||
|
str->Append("bge");
|
||||||
|
sign_char = -1;
|
||||||
|
break;
|
||||||
|
case 0x1:
|
||||||
|
str->Append("ble");
|
||||||
|
sign_char = -1;
|
||||||
|
break;
|
||||||
|
case 0x2:
|
||||||
|
str->Append("bne");
|
||||||
|
sign_char = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (!bo0 && !bo1 && bo2 && bo3 && bo4) {
|
||||||
|
switch (bi % 4) {
|
||||||
|
case 0x0:
|
||||||
|
str->Append("bge");
|
||||||
|
sign_char = +1;
|
||||||
|
break;
|
||||||
|
case 0x1:
|
||||||
|
str->Append("ble");
|
||||||
|
sign_char = +1;
|
||||||
|
break;
|
||||||
|
case 0x2:
|
||||||
|
str->Append("bne");
|
||||||
|
sign_char = +1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (!bo0 && bo1 && bo2 && !bo3 && !bo4) {
|
||||||
|
switch (bi % 4) {
|
||||||
|
case 0x0:
|
||||||
|
str->Append("blt");
|
||||||
|
break;
|
||||||
|
case 0x1:
|
||||||
|
str->Append("bgt");
|
||||||
|
break;
|
||||||
|
case 0x2:
|
||||||
|
str->Append("beq");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (!bo0 && bo1 && bo2 && bo3 && !bo4) {
|
||||||
|
switch (bi % 4) {
|
||||||
|
case 0x0:
|
||||||
|
str->Append("blt");
|
||||||
|
sign_char = -1;
|
||||||
|
break;
|
||||||
|
case 0x1:
|
||||||
|
str->Append("bgt");
|
||||||
|
sign_char = -1;
|
||||||
|
break;
|
||||||
|
case 0x2:
|
||||||
|
str->Append("beq");
|
||||||
|
sign_char = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (!bo0 && bo1 && bo2 && bo3 && bo4) {
|
||||||
|
switch (bi % 4) {
|
||||||
|
case 0x0:
|
||||||
|
str->Append("blt");
|
||||||
|
sign_char = +1;
|
||||||
|
break;
|
||||||
|
case 0x1:
|
||||||
|
str->Append("bgt");
|
||||||
|
sign_char = +1;
|
||||||
|
break;
|
||||||
|
case 0x2:
|
||||||
|
str->Append("beq");
|
||||||
|
sign_char = +1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str_start == str->length()) {
|
||||||
|
// Default
|
||||||
str->Append("bc");
|
str->Append("bc");
|
||||||
if (d.B.LK()) str->Append('l');
|
if (d.B.LK()) str->Append('l');
|
||||||
if (d.B.AA()) str->Append('a');
|
if (d.B.AA()) str->Append('a');
|
||||||
PadStringBuffer(str, str_start, kNamePad);
|
PadStringBuffer(str, str_start, kNamePad);
|
||||||
str->AppendFormat("%d", d.B.BO());
|
str->AppendFormat("%d", bo);
|
||||||
str->Append(", ");
|
str->Append(", ");
|
||||||
str->AppendFormat("%d", d.B.BI());
|
str->AppendFormat("%d", bi);
|
||||||
|
} else {
|
||||||
|
if (d.B.LK()) str->Append('l');
|
||||||
|
if (d.B.AA()) str->Append('a');
|
||||||
|
|
||||||
|
if (sign_char > 0) {
|
||||||
|
str->Append('+');
|
||||||
|
} else if (sign_char < 0) {
|
||||||
|
str->Append('-');
|
||||||
|
}
|
||||||
|
|
||||||
|
PadStringBuffer(str, str_start, kNamePad);
|
||||||
|
str->AppendFormat("crf%d", bi / 4);
|
||||||
|
}
|
||||||
|
|
||||||
str->Append(", ");
|
str->Append(", ");
|
||||||
str->AppendFormat("0x%X", d.B.ADDR());
|
str->AppendFormat("0x%X", addr);
|
||||||
}
|
}
|
||||||
void PrintDisasm_bx(const PPCDecodeData& d, StringBuffer* str) {
|
void PrintDisasm_bx(const PPCDecodeData& d, StringBuffer* str) {
|
||||||
// b[LK][AA] [ADDR]
|
// b[LK][AA] [ADDR]
|
||||||
|
|
Loading…
Reference in New Issue