fix crazy codegen bug and unban R12 from register allocators
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2295 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
73a6ae2592
commit
41ce35deb3
|
@ -186,7 +186,7 @@ enum NormalSSEOps
|
||||||
else if (scale >= 1)
|
else if (scale >= 1)
|
||||||
{
|
{
|
||||||
//Ah good, no scaling.
|
//Ah good, no scaling.
|
||||||
if (scale == SCALE_ATREG && !((_offsetOrBaseReg&7) == 4 || (_offsetOrBaseReg&7) == 5))
|
if (scale == SCALE_ATREG && !((_offsetOrBaseReg & 7) == 4 || (_offsetOrBaseReg & 7) == 5))
|
||||||
{
|
{
|
||||||
//Okay, we're good. No SIB necessary.
|
//Okay, we're good. No SIB necessary.
|
||||||
int ioff = (int)offset;
|
int ioff = (int)offset;
|
||||||
|
@ -216,10 +216,10 @@ enum NormalSSEOps
|
||||||
SIB = true;
|
SIB = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scale == SCALE_ATREG && _offsetOrBaseReg == 4)
|
if (scale == SCALE_ATREG && ((_offsetOrBaseReg & 7) == 4))
|
||||||
{
|
{
|
||||||
SIB = true;
|
SIB = true;
|
||||||
ireg = 4;
|
ireg = _offsetOrBaseReg;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Okay, we're fine. Just disp encoding.
|
//Okay, we're fine. Just disp encoding.
|
||||||
|
|
|
@ -114,8 +114,6 @@ struct OpArg
|
||||||
operandReg = 0;
|
operandReg = 0;
|
||||||
scale = (u8)_scale;
|
scale = (u8)_scale;
|
||||||
offsetOrBaseReg = (u8)rmReg;
|
offsetOrBaseReg = (u8)rmReg;
|
||||||
if (rmReg == R12)
|
|
||||||
PanicAlert("Codegen for R12 known buggy");
|
|
||||||
indexReg = (u8)scaledReg;
|
indexReg = (u8)scaledReg;
|
||||||
//if scale == 0 never mind offseting
|
//if scale == 0 never mind offseting
|
||||||
offset = _offset;
|
offset = _offset;
|
||||||
|
|
|
@ -205,9 +205,9 @@ const int *GPRRegCache::GetAllocationOrder(int &count)
|
||||||
// R12, when used as base register, for example in a LEA, can generate bad code! Need to look into this.
|
// R12, when used as base register, for example in a LEA, can generate bad code! Need to look into this.
|
||||||
#ifdef _M_X64
|
#ifdef _M_X64
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
RSI, RDI, R13, R14, R8, R9, R10, R11 //, RCX
|
RSI, RDI, R13, R14, R8, R9, R10, R11, R12, //, RCX
|
||||||
#else
|
#else
|
||||||
RBP, R13, R14, R8, R9, R10, R11, //, RCX
|
RBP, R13, R14, R8, R9, R10, R11, R12, //, RCX
|
||||||
#endif
|
#endif
|
||||||
#elif _M_IX86
|
#elif _M_IX86
|
||||||
ESI, EDI, EBX, EBP, EDX, ECX,
|
ESI, EDI, EBX, EBP, EDX, ECX,
|
||||||
|
@ -222,7 +222,7 @@ const int *FPURegCache::GetAllocationOrder(int &count)
|
||||||
static const int allocationOrder[] =
|
static const int allocationOrder[] =
|
||||||
{
|
{
|
||||||
#ifdef _M_X64
|
#ifdef _M_X64
|
||||||
XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM13, XMM14, XMM15, XMM2, XMM3, XMM4, XMM5
|
XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, XMM2, XMM3, XMM4, XMM5
|
||||||
#elif _M_IX86
|
#elif _M_IX86
|
||||||
XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
|
XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -804,9 +804,9 @@ static void fregSpill(RegInfo& RI, X64Reg reg) {
|
||||||
|
|
||||||
// 64-bit - calling conventions differ between linux & windows, so...
|
// 64-bit - calling conventions differ between linux & windows, so...
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static const X64Reg RegAllocOrder[] = {RSI, RDI, R13, R14, R8, R9, R10, R11};
|
static const X64Reg RegAllocOrder[] = {RSI, RDI, R12, R13, R14, R8, R9, R10, R11};
|
||||||
#else
|
#else
|
||||||
static const X64Reg RegAllocOrder[] = {RBP, R13, R14, R8, R9, R10, R11};
|
static const X64Reg RegAllocOrder[] = {RBP, R12, R13, R14, R8, R9, R10, R11};
|
||||||
#endif
|
#endif
|
||||||
static const int RegAllocSize = sizeof(RegAllocOrder) / sizeof(X64Reg);
|
static const int RegAllocSize = sizeof(RegAllocOrder) / sizeof(X64Reg);
|
||||||
static const X64Reg FRegAllocOrder[] = {XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, XMM2, XMM3, XMM4, XMM5};
|
static const X64Reg FRegAllocOrder[] = {XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, XMM2, XMM3, XMM4, XMM5};
|
||||||
|
@ -1353,7 +1353,7 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile) {
|
||||||
case StoreLink:
|
case StoreLink:
|
||||||
case StoreCTR:
|
case StoreCTR:
|
||||||
case StoreMSR:
|
case StoreMSR:
|
||||||
case StoreGQR:
|
case StoreGQR:
|
||||||
case StoreSRR:
|
case StoreSRR:
|
||||||
case StoreFReg:
|
case StoreFReg:
|
||||||
if (!isImm(*getOp1(I)))
|
if (!isImm(*getOp1(I)))
|
||||||
|
@ -1540,10 +1540,10 @@ static void DoWriteCode(IRBuilder* ibuild, Jit64* Jit, bool UseProfile) {
|
||||||
regStoreInstToConstLoc(RI, 32, getOp1(I), &GQR(gqr));
|
regStoreInstToConstLoc(RI, 32, getOp1(I), &GQR(gqr));
|
||||||
regNormalRegClear(RI, I);
|
regNormalRegClear(RI, I);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case StoreSRR: {
|
case StoreSRR: {
|
||||||
unsigned srr = *I >> 16;
|
unsigned srr = *I >> 16;
|
||||||
regStoreInstToConstLoc(RI, 32, getOp1(I),
|
regStoreInstToConstLoc(RI, 32, getOp1(I),
|
||||||
&PowerPC::ppcState.spr[SPR_SRR0+srr]);
|
&PowerPC::ppcState.spr[SPR_SRR0+srr]);
|
||||||
regNormalRegClear(RI, I);
|
regNormalRegClear(RI, I);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue