Skip to content
Snippets Groups Projects
Commit 1a3d77c9 authored by Geo Ster's avatar Geo Ster
Browse files

Minor branch optimization

* On reads/writes it is important to check the address alignment before
proceeding with the operation. However unalignment errors almost
never happen in real world games, so let the compiler know that these
branches are unlikely to happen to speed them up a bit.
parent 1d16fdad
No related branches found
No related tags found
No related merge requests found
...@@ -258,7 +258,7 @@ namespace ee ...@@ -258,7 +258,7 @@ namespace ee
uint32_t data = gpr[rt].word[0]; uint32_t data = gpr[rt].word[0];
log("SW: Writing GPR[{:d}] ({:#x}) to address {:#x} = GPR[{:d}] ({:#x}) + {:d}\n", rt, data, vaddr, base, gpr[base].word[0], offset); log("SW: Writing GPR[{:d}] ({:#x}) to address {:#x} = GPR[{:d}] ({:#x}) + {:d}\n", rt, data, vaddr, base, gpr[base].word[0], offset);
if (vaddr & 0x3) if (vaddr & 0x3) [[unlikely]]
{ {
log("[ERROR] SW: Address {:#x} is not aligned\n", vaddr); log("[ERROR] SW: Address {:#x} is not aligned\n", vaddr);
exception(Exception::AddrErrorStore); exception(Exception::AddrErrorStore);
...@@ -388,7 +388,7 @@ namespace ee ...@@ -388,7 +388,7 @@ namespace ee
uint32_t data = fpr[ft].word[0]; uint32_t data = fpr[ft].word[0];
log("SWC1: Writing FPR[{:d}] ({:#x}) to address {:#x} = GPR[{:d}] ({:#x}) + {:d}\n", ft, data, vaddr, base, gpr[base].word[0], offset); log("SWC1: Writing FPR[{:d}] ({:#x}) to address {:#x} = GPR[{:d}] ({:#x}) + {:d}\n", ft, data, vaddr, base, gpr[base].word[0], offset);
if ((vaddr & 0b11) != 0) if ((vaddr & 0b11) != 0) [[unlikely]]
{ {
log("[ERROR] SW: Address {:#x} is not aligned\n", vaddr); log("[ERROR] SW: Address {:#x} is not aligned\n", vaddr);
std::exit(1); /* NOTE: SignalException (AddressError) */ std::exit(1); /* NOTE: SignalException (AddressError) */
...@@ -418,7 +418,7 @@ namespace ee ...@@ -418,7 +418,7 @@ namespace ee
uint32_t vaddr = offset + gpr[base].word[0]; uint32_t vaddr = offset + gpr[base].word[0];
log("LD: GPR[{:d}] = {:#x} from address {:#x} = GPR[{:d}] ({:#x}) + {:#x}\n", rt, gpr[rt].dword[0], vaddr, base, gpr[base].word[0], offset); log("LD: GPR[{:d}] = {:#x} from address {:#x} = GPR[{:d}] ({:#x}) + {:#x}\n", rt, gpr[rt].dword[0], vaddr, base, gpr[base].word[0], offset);
if (vaddr & 0x7) if (vaddr & 0x7) [[unlikely]]
{ {
log("[ERROR] LD: Address {:#x} is not aligned\n", vaddr); log("[ERROR] LD: Address {:#x} is not aligned\n", vaddr);
exception(Exception::AddrErrorLoad); exception(Exception::AddrErrorLoad);
...@@ -465,7 +465,7 @@ namespace ee ...@@ -465,7 +465,7 @@ namespace ee
log("DIV: LO0 = GPR[{:d}] ({:#x}) / GPR[{:d}] ({:#x})\n", rs, gpr[rs].word[0], rt, gpr[rt].word[0]); log("DIV: LO0 = GPR[{:d}] ({:#x}) / GPR[{:d}] ({:#x})\n", rs, gpr[rs].word[0], rt, gpr[rt].word[0]);
} }
else else [[unlikely]]
{ {
log("[ERROR] DIV: Division by zero!\n"); log("[ERROR] DIV: Division by zero!\n");
std::abort(); std::abort();
...@@ -612,7 +612,7 @@ namespace ee ...@@ -612,7 +612,7 @@ namespace ee
uint16_t data = gpr[rt].word[0] & 0xFFFF; uint16_t data = gpr[rt].word[0] & 0xFFFF;
log("SH: Writing GPR[{:d}] ({:#x}) to address {:#x} = GPR[{:d}] ({:#x}) + {:d}\n", rt, data, vaddr, base, gpr[base].word[0], offset); log("SH: Writing GPR[{:d}] ({:#x}) to address {:#x} = GPR[{:d}] ({:#x}) + {:d}\n", rt, data, vaddr, base, gpr[base].word[0], offset);
if (vaddr & 0x1) if (vaddr & 0x1) [[unlikely]]
{ {
log("[ERROR] SH: Address {:#x} is not aligned\n", vaddr); log("[ERROR] SH: Address {:#x} is not aligned\n", vaddr);
exception(Exception::AddrErrorStore); exception(Exception::AddrErrorStore);
...@@ -650,7 +650,7 @@ namespace ee ...@@ -650,7 +650,7 @@ namespace ee
log("DIVU1: GPR[{:d}] ({:#x}) / GPR[{:d}] ({:#x}) OUTPUT LO1 = {:#x} and HI1 = {:#x}\n", rs, gpr[rs].word[0], rt, gpr[rt].word[0], lo1, hi1); log("DIVU1: GPR[{:d}] ({:#x}) / GPR[{:d}] ({:#x}) OUTPUT LO1 = {:#x} and HI1 = {:#x}\n", rs, gpr[rs].word[0], rt, gpr[rt].word[0], lo1, hi1);
} }
else else [[unlikely]]
{ {
log("[ERROR] DIVU1: Division by zero!\n"); log("[ERROR] DIVU1: Division by zero!\n");
std::abort(); std::abort();
...@@ -774,7 +774,7 @@ namespace ee ...@@ -774,7 +774,7 @@ namespace ee
uint32_t vaddr = offset + gpr[base].word[0]; uint32_t vaddr = offset + gpr[base].word[0];
log("LHU: GPR[{:d}] = {:#x} from address {:#x} = GPR[{:d}] ({:#x}) + {:#x}\n", rt, gpr[rt].dword[0], vaddr, base, gpr[base].word[0], offset); log("LHU: GPR[{:d}] = {:#x} from address {:#x} = GPR[{:d}] ({:#x}) + {:#x}\n", rt, gpr[rt].dword[0], vaddr, base, gpr[base].word[0], offset);
if (vaddr & 0x1) if (vaddr & 0x1) [[unlikely]]
{ {
log("[ERROR] LHU: Address {:#x} is not aligned\n", vaddr); log("[ERROR] LHU: Address {:#x} is not aligned\n", vaddr);
exception(Exception::AddrErrorLoad); exception(Exception::AddrErrorLoad);
...@@ -814,7 +814,7 @@ namespace ee ...@@ -814,7 +814,7 @@ namespace ee
uint32_t vaddr = offset + gpr[base].word[0]; uint32_t vaddr = offset + gpr[base].word[0];
log("LW: GPR[{:d}] = {:#x} from address {:#x} = GPR[{:d}] ({:#x}) + {:#x}\n", rt, gpr[rt].dword[0], vaddr, base, gpr[base].word[0], offset); log("LW: GPR[{:d}] = {:#x} from address {:#x} = GPR[{:d}] ({:#x}) + {:#x}\n", rt, gpr[rt].dword[0], vaddr, base, gpr[base].word[0], offset);
if (vaddr & 0x3) if (vaddr & 0x3) [[unlikely]]
{ {
log("[ERROR] LW: Address {:#x} is not aligned\n", vaddr); log("[ERROR] LW: Address {:#x} is not aligned\n", vaddr);
exception(Exception::AddrErrorLoad); exception(Exception::AddrErrorLoad);
...@@ -903,7 +903,7 @@ namespace ee ...@@ -903,7 +903,7 @@ namespace ee
uint64_t data = gpr[rt].dword[0]; uint64_t data = gpr[rt].dword[0];
log("SD: Writing GPR[{:d}] ({:#x}) to address {:#x} = GPR[{:d}] ({:#x}) + {:#x}\n", rt, data, vaddr, base, gpr[base].word[0], offset); log("SD: Writing GPR[{:d}] ({:#x}) to address {:#x} = GPR[{:d}] ({:#x}) + {:#x}\n", rt, data, vaddr, base, gpr[base].word[0], offset);
if (vaddr & 0x7) if (vaddr & 0x7) [[unlikely]]
{ {
log("[ERROR] SD: Address {:#x} is not aligned\n", vaddr); log("[ERROR] SD: Address {:#x} is not aligned\n", vaddr);
exception(Exception::AddrErrorStore); exception(Exception::AddrErrorStore);
...@@ -1037,7 +1037,7 @@ namespace ee ...@@ -1037,7 +1037,7 @@ namespace ee
log("DIVU: GPR[{:d}] ({:#x}) / GPR[{:d}] ({:#x}) OUTPUT LO0 = {:#x} and HI0 = {:#x}\n", rs, gpr[rs].word[0], rt, gpr[rt].word[0], lo0, hi0); log("DIVU: GPR[{:d}] ({:#x}) / GPR[{:d}] ({:#x}) OUTPUT LO0 = {:#x} and HI0 = {:#x}\n", rs, gpr[rs].word[0], rt, gpr[rt].word[0], lo0, hi0);
} }
else else [[unlikely]]
{ {
log("[ERROR] DIVU: Division by zero!\n"); log("[ERROR] DIVU: Division by zero!\n");
std::abort(); std::abort();
......
...@@ -139,7 +139,7 @@ namespace iop ...@@ -139,7 +139,7 @@ namespace iop
instr = next_instr; instr = next_instr;
/* Check aligment errors. */ /* Check aligment errors. */
if (pc & 0x3) if (pc & 0x3) [[unlikely]]
{ {
cop0.BadA = pc; cop0.BadA = pc;
exception(Exception::ReadError); exception(Exception::ReadError);
...@@ -482,7 +482,7 @@ namespace iop ...@@ -482,7 +482,7 @@ namespace iop
uint32_t vaddr = gpr[base] + offset; uint32_t vaddr = gpr[base] + offset;
if (!cop0.sr.IsC) if (!cop0.sr.IsC)
{ {
if (vaddr & 0x1) if (vaddr & 0x1) [[unlikely]]
{ {
cop0.BadA = vaddr; cop0.BadA = vaddr;
exception(Exception::ReadError); exception(Exception::ReadError);
...@@ -518,7 +518,7 @@ namespace iop ...@@ -518,7 +518,7 @@ namespace iop
uint32_t vaddr = gpr[base] + offset; uint32_t vaddr = gpr[base] + offset;
if (!cop0.sr.IsC) if (!cop0.sr.IsC)
{ {
if (vaddr & 0x1) if (vaddr & 0x1) [[unlikely]]
{ {
cop0.BadA = vaddr; cop0.BadA = vaddr;
exception(Exception::ReadError, 0); exception(Exception::ReadError, 0);
...@@ -596,7 +596,7 @@ namespace iop ...@@ -596,7 +596,7 @@ namespace iop
uint32_t dividend = gpr[rs]; uint32_t dividend = gpr[rs];
uint32_t divisor = gpr[rt]; uint32_t divisor = gpr[rt];
if (divisor == 0) if (divisor == 0) [[unlikely]]
{ {
hi = dividend; hi = dividend;
lo = 0xFFFFFFFF; lo = 0xFFFFFFFF;
...@@ -648,12 +648,12 @@ namespace iop ...@@ -648,12 +648,12 @@ namespace iop
int32_t dividend = (int32_t)gpr[rs]; int32_t dividend = (int32_t)gpr[rs];
int32_t divisor = (int32_t)gpr[rt]; int32_t divisor = (int32_t)gpr[rt];
if (divisor == 0) if (divisor == 0) [[unlikely]]
{ {
hi = gpr[rs]; hi = gpr[rs];
lo = (dividend >= 0 ? 0xFFFFFFFF : 1); lo = (dividend >= 0 ? 0xFFFFFFFF : 1);
} }
else if (gpr[rs] == 0x80000000 && divisor == -1) else if (gpr[rs] == 0x80000000 && divisor == -1) [[unlikely]]
{ {
hi = 0; hi = 0;
lo = 0x80000000; lo = 0x80000000;
...@@ -879,7 +879,7 @@ namespace iop ...@@ -879,7 +879,7 @@ namespace iop
uint32_t vaddr = gpr[base] + offset; uint32_t vaddr = gpr[base] + offset;
if (!cop0.sr.IsC) if (!cop0.sr.IsC)
{ {
if (vaddr & 0x1) if (vaddr & 0x1) [[unlikely]]
{ {
cop0.BadA = vaddr; cop0.BadA = vaddr;
exception(Exception::WriteError, 0); exception(Exception::WriteError, 0);
...@@ -925,7 +925,7 @@ namespace iop ...@@ -925,7 +925,7 @@ namespace iop
uint32_t vaddr = gpr[base] + offset; uint32_t vaddr = gpr[base] + offset;
if (!cop0.sr.IsC) if (!cop0.sr.IsC)
{ {
if (vaddr & 0x3) if (vaddr & 0x3) [[unlikely]]
{ {
cop0.BadA = vaddr; cop0.BadA = vaddr;
exception(Exception::ReadError, 0); exception(Exception::ReadError, 0);
...@@ -1029,7 +1029,7 @@ namespace iop ...@@ -1029,7 +1029,7 @@ namespace iop
uint32_t vaddr = gpr[base] + offset; uint32_t vaddr = gpr[base] + offset;
if (!cop0.sr.IsC) if (!cop0.sr.IsC)
{ {
if (vaddr & 0x3) if (vaddr & 0x3) [[unlikely]]
{ {
cop0.BadA = vaddr; cop0.BadA = vaddr;
exception(Exception::WriteError, 0); exception(Exception::WriteError, 0);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment