iop: Use count_leading_sign_bits for err, counting sign bits

Replaces the inline assembly and generic version with the unified
implementation.
This commit is contained in:
Jonathan Li 2016-05-19 21:47:06 +01:00
parent eaa4abea45
commit bde5960581
1 changed files with 3 additions and 55 deletions

View File

@ -20,6 +20,7 @@
#include "IopGte.h" #include "IopGte.h"
//#include "R3000A.h" //#include "R3000A.h"
#include "IopCommon.h" #include "IopCommon.h"
#include "Utilities/MathUtils.h"
#ifdef GTE_DUMP #ifdef GTE_DUMP
#define G_OP(name,delay) fprintf(gteLog, "* : %08X : %02d : %s\n", psxRegs.code, delay, name); #define G_OP(name,delay) fprintf(gteLog, "* : %08X : %02d : %s\n", psxRegs.code, delay, name);
#define G_SD(reg) fprintf(gteLog, "+D%02d : %08X\n", reg, psxRegs.CP2D.r[reg]); #define G_SD(reg) fprintf(gteLog, "+D%02d : %08X\n", reg, psxRegs.CP2D.r[reg]);
@ -175,8 +176,6 @@ __inline unsigned long MFC2(int reg) {
} }
__inline void MTC2(unsigned long value, int reg) { __inline void MTC2(unsigned long value, int reg) {
int a;
switch (reg) { switch (reg) {
case 8: case 9: case 10: case 11: case 8: case 9: case 10: case 11:
psxRegs.CP2D.r[reg] = (short)value; psxRegs.CP2D.r[reg] = (short)value;
@ -208,58 +207,7 @@ __inline void MTC2(unsigned long value, int reg) {
case 30: case 30:
psxRegs.CP2D.r[30] = value; psxRegs.CP2D.r[30] = value;
psxRegs.CP2D.r[31] = count_leading_sign_bits(value);
a = psxRegs.CP2D.r[30];
#if defined(_MSC_VER_)
if (a > 0) {
__asm {
mov eax, a;
bsr eax, eax;
mov a, eax;
}
psxRegs.CP2D.r[31] = 31 - a;
}
else if (a < 0) {
__asm {
mov eax, a;
xor eax, 0xffffffff;
bsr eax, eax;
mov a, eax;
}
psxRegs.CP2D.r[31] = 31 - a;
}
else {
psxRegs.CP2D.r[31] = 32;
}
#elif defined(__linux__) || defined(__MINGW32__)
if (a > 0) {
__asm__("bsrl %1, %0\n" : "=r"(a) : "r"(a));
psxRegs.CP2D.r[31] = 31 - a;
}
else if (a < 0) {
a ^= 0xffffffff;
__asm__("bsrl %1, %0\n" : "=r"(a) : "r"(a));
psxRegs.CP2D.r[31] = 31 - a;
}
else {
psxRegs.CP2D.r[31] = 32;
}
#else
if (a > 0) {
int i;
for (i = 31; (a & (1 << i)) == 0 && i >= 0; i--);
psxRegs.CP2D.r[31] = 31 - i;
}
else if (a < 0) {
int i;
a ^= 0xffffffff;
for (i = 31; (a & (1 << i)) == 0 && i >= 0; i--);
psxRegs.CP2D.r[31] = 31 - i;
}
else {
psxRegs.CP2D.r[31] = 32;
}
#endif
break; break;
default: default:
@ -3158,4 +3106,4 @@ void gteCDP() { //test opcode
G_GC(31); G_GC(31);
} }
#endif #endif
} }