trying to simplify branches
This commit is contained in:
+20
-10
@@ -28,23 +28,27 @@ ircolib::u32 broadway::fetch(mem &mem) {
|
||||
return val;
|
||||
}
|
||||
|
||||
void broadway::decode_special(ircolib::u32 instr, mem &mem) {
|
||||
switch (utils::secondary(instr)) {
|
||||
case 0x153:
|
||||
mfspr(instr);
|
||||
void broadway::decode_special2(ircolib::u32 instr, mem &mem) {
|
||||
auto secondary = utils::secondary(instr);
|
||||
switch (secondary) {
|
||||
case 0x0D2: // mtsr
|
||||
ircolib::warn("broadway TODO mtsr (pc 0x{:08X})", pc - 4);
|
||||
break;
|
||||
case 0x153:
|
||||
case 0x1D3:
|
||||
mtspr(instr);
|
||||
mftspr(ircolib::is_bit_set<ircolib::u32, 7>(secondary), instr);
|
||||
break;
|
||||
case 0x10A:
|
||||
add(instr);
|
||||
break;
|
||||
case 0x256: // sync
|
||||
break;
|
||||
default:
|
||||
ircolib::panic("broadway unknown special 0x{:04X} (pc 0x{:08X})", utils::secondary(instr), pc - 4);
|
||||
ircolib::panic("broadway unknown special2 {} (0x{:04X}) (pc 0x{:08X})", secondary, secondary, pc - 4);
|
||||
}
|
||||
}
|
||||
|
||||
void broadway::decode_branch(ircolib::u32 instr, mem &mem) {
|
||||
void broadway::decode_special1(ircolib::u32 instr, mem &mem) {
|
||||
switch (utils::secondary(instr)) {
|
||||
case 0x10:
|
||||
bclrx(instr);
|
||||
@@ -52,8 +56,11 @@ void broadway::decode_branch(ircolib::u32 instr, mem &mem) {
|
||||
case 0x32:
|
||||
rfi(instr);
|
||||
break;
|
||||
case 0x96: // isync
|
||||
break;
|
||||
default:
|
||||
ircolib::panic("broadway unknown branch 0x{:04X} (pc 0x{:08X})", utils::secondary(instr), pc - 4);
|
||||
ircolib::panic("broadway unknown special1 {} (0x{:04X}) (pc 0x{:08X})", utils::secondary(instr),
|
||||
utils::secondary(instr), pc - 4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +82,7 @@ void broadway::execute(ircolib::u32 instr, mem &mem) {
|
||||
bx(instr);
|
||||
break;
|
||||
case 19:
|
||||
decode_branch(instr, mem);
|
||||
decode_special1(instr, mem);
|
||||
break;
|
||||
case 21:
|
||||
rlwinm(instr);
|
||||
@@ -86,8 +93,11 @@ void broadway::execute(ircolib::u32 instr, mem &mem) {
|
||||
case 25:
|
||||
oris(instr);
|
||||
break;
|
||||
case 28:
|
||||
andi(instr);
|
||||
break;
|
||||
case 31:
|
||||
decode_special(instr, mem);
|
||||
decode_special2(instr, mem);
|
||||
break;
|
||||
case 32: // lwz rd, d(ra)
|
||||
lwz(instr, mem);
|
||||
|
||||
Reference in New Issue
Block a user