Actions
Emulator Issues #11860
closedInterpreter: bcx bug
Status:
Working as intended
Priority:
Normal
Assignee:
-
% Done:
0%
Operating system:
N/A
Issue type:
Bug
Milestone:
Regression:
No
Relates to usability:
No
Relates to performance:
No
Easy:
No
Relates to maintainability:
No
Regression start:
Fixed in:
Description
https://github.com/dolphin-emu/dolphin/blob/master/Source/Core/Core/PowerPC/Interpreter/Interpreter_Branch.cpp#L39 should be ^!
, not ==
, according to the manual.
Here's my implementation, using that formula. Seems to work fine on my end.
https://pastebin.com/kEht05sg
Files
Updated by AdmiralCurtiss over 5 years ago
For posterity, since I don't trust pastebin to actually keep stuff around forever, that link contains:
#define inst_BO_0 (inst.BO & (1 << 4)) //if set, ignore BO_TRUE
#define inst_BO_1 (inst.BO & (1 << 3)) //if set, check if condition is TRUE
#define inst_BO_2 (inst.BO & (1 << 2)) //if set, ignore CTR
#define inst_BO_3 (inst.BO & (1 << 1)) //if set, branch if CTR is 0 (else != 0)
#define inst_BO_4 (inst.BO & (1 << 0)) //branch predictor hint ("+")
bool CR::getbit(u8 index) {
return (this->hex >> (31 - index)) & 1;
}
void bcx(gekko::instruction& inst, std::unique_ptr<gekko::cpu>& cpu) { //opcode 16
if (!inst_BO_2) cpu->ctr--; //not ignoring ctr, decrement
ctr_ok = inst_BO_2 || ((cpu->ctr != 0) ^ inst_BO_3);
cond_ok = inst_BO_0 || (cpu->CR.getbit(inst.BI) ^ !inst_BO_1);
if (ctr_ok && cond_ok) {
if (inst.LK) //linking, update link register
cpu->lr = cpu->pc + 4;
if (inst.AA) //absolute address
cpu->pc = EXTS(inst.BD << 2);
else //relative, add (will go backwards if negative)
cpu->pc += EXTS(inst.BD << 2);
}
else {
cpu->pc += 4;
}
}
Updated by flacs about 5 years ago
- Status changed from New to Working as intended
There is no difference between x ^ !y and x == y (other than readability :P).
Updated by nwplayer123 about 5 years ago
It mattered when I was testing in my code, but now that I think about it, that seems logical, must be some compiler/typecasting issue on my end
Actions