This commit is contained in:
Matthijs ter Woord 2016-06-15 16:38:45 -04:00
parent 98cd7da12f
commit fc902e5a68
9 changed files with 22 additions and 22 deletions

View file

@ -21,11 +21,11 @@ namespace Cosmos.IL2CPU.X86.IL
case 4:
if (TypeIsFloat(xSource))
{
XS.ConvertSS2SD(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE.ConvertSS2SD(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
}
else
{
XS.ConvertSI2SD(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE.ConvertSI2SD(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
}
// expand stack, that moved data is valid stack
XS.Sub(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
@ -46,4 +46,4 @@ namespace Cosmos.IL2CPU.X86.IL
}
}
}
}
}

View file

@ -31,7 +31,7 @@ namespace Cosmos.IL2CPU.X86.IL
}
else if (xSourceSize == 8)
{
XS.MoveDoubleAndDupplicate(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE3.MoveDoubleAndDuplicate(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE2.ConvertSD2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}

View file

@ -30,7 +30,7 @@ namespace Cosmos.IL2CPU.X86.IL
}
else if (xSourceSize == 8)
{
XS.MoveDoubleAndDupplicate(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE3.MoveDoubleAndDuplicate(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE2.ConvertSD2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}

View file

@ -30,7 +30,7 @@ namespace Cosmos.IL2CPU.X86.IL
case 4:
if (TypeIsFloat(xSource))
{
XS.MoveSS(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE.MoveSS(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE.ConvertSS2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}
@ -38,7 +38,7 @@ namespace Cosmos.IL2CPU.X86.IL
case 8:
if (TypeIsFloat(xSource))
{
XS.MoveDoubleAndDupplicate(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE3.MoveDoubleAndDuplicate(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE2.ConvertSD2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
XS.Pop(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));

View file

@ -47,7 +47,7 @@ namespace Cosmos.IL2CPU.X86.IL
// divisor
//low
XS.Mov(XSRegisters.ESI, XSRegisters.ESP, sourceIsIndirect: true);
XS.Set(XSRegisters.ESI, XSRegisters.ESP, sourceIsIndirect: true);
//high
XS.Set(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDI), XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), sourceDisplacement: 4);
@ -56,7 +56,7 @@ namespace Cosmos.IL2CPU.X86.IL
//dividend
// low
XS.Mov(XSRegisters.EAX, XSRegisters.ESP, sourceIsIndirect: true);
XS.Set(XSRegisters.EAX, XSRegisters.ESP, sourceIsIndirect: true);
//high
XS.Set(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDX), XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), sourceDisplacement: 4);
@ -127,9 +127,9 @@ namespace Cosmos.IL2CPU.X86.IL
{
if (TypeIsFloat(xStackItem))
{
XS.MoveSS(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE.MoveSS(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
XS.MoveSS(XSRegisters.XMM1, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE.MoveSS(XSRegisters.XMM1, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE.DivSS(XSRegisters.XMM0, XSRegisters.XMM1);
new MoveSS { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceReg = CPUx86.RegistersEnum.XMM1 };
}

View file

@ -48,7 +48,7 @@ namespace Cosmos.IL2CPU.X86.IL
// divisor
//low
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESI, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.Set(XSRegisters.ESI, XSRegisters.ESP, sourceIsIndirect: true);
//high
XS.Set(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDI), XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), sourceDisplacement: 4);
@ -124,9 +124,9 @@ namespace Cosmos.IL2CPU.X86.IL
{
if (TypeIsFloat(xStackItem))
{
new MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.SSE.MoveSS(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM1, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.SSE.MoveSS(XSRegisters.XMM1, XSRegisters.ESP, sourceIsIndirect: true);
XS.SSE.MulSS(XSRegisters.XMM0, XSRegisters.XMM1);
new MoveSS { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceReg = CPUx86.RegistersEnum.XMM1 };
}

View file

@ -37,7 +37,7 @@ namespace Cosmos.IL2CPU.X86.IL
// pop the array
XS.Pop(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDX));
// convert to real memory address
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.EDX, SourceReg = CPUx86.RegistersEnum.EDX, SourceIsIndirect = true };
XS.Set(XSRegisters.EDX, XSRegisters.EDX, sourceIsIndirect: true);
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDX), XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));

View file

@ -31,11 +31,11 @@ namespace Cosmos.IL2CPU.X86.IL
// pop the array now
XS.Pop(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDX));
// translate it to actual memory
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.EDX, SourceReg = CPUx86.RegistersEnum.EDX, SourceIsIndirect = true };
XS.Set(XSRegisters.EDX, XSRegisters.EDX, sourceIsIndirect: true);
if (aOpType.StackPopTypes.Last().GetElementType().IsClass)
{
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.EDX, SourceReg = CPUx86.RegistersEnum.EDX, SourceIsIndirect = true };
XS.Set(XSRegisters.EDX, XSRegisters.EDX, sourceIsIndirect: true);
}
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDX), XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));

View file

@ -131,13 +131,13 @@ namespace Cosmos.IL2CPU.X86.IL
if ((!aTypeOnStack.IsPointer) && (aDeclaringType.IsClass))
{
// convert to real memory address
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ECX, SourceReg = CPUx86.RegistersEnum.ECX, SourceIsIndirect = true };
XS.Set(XSRegisters.ECX, XSRegisters.ECX, sourceIsIndirect: true);
}
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ECX), (uint)(xOffset));
if (xFieldInfo.IsExternalValue && aDerefExternalField)
{
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ECX, SourceReg = CPUx86.RegistersEnum.ECX, SourceIsIndirect = true };
XS.Set(XSRegisters.ECX, XSRegisters.ECX, sourceIsIndirect: true);
}
for (int i = 1; i <= (xSize / 4); i++)
@ -151,17 +151,17 @@ namespace Cosmos.IL2CPU.X86.IL
switch (xSize % 4)
{
case 1:
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.AL, SourceReg = CPUx86.RegistersEnum.ECX, SourceIsIndirect = true };
XS.Set(XSRegisters.AL, XSRegisters.ECX, sourceIsIndirect: true);
XS.Push(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));
break;
case 2:
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.AX, SourceReg = CPUx86.RegistersEnum.ECX, SourceIsIndirect = true };
XS.Set(XSRegisters.AX, XSRegisters.ECX, sourceIsIndirect: true);
XS.Push(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));
break;
case 3: //For Release
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.EAX, SourceReg = CPUx86.RegistersEnum.ECX, SourceIsIndirect = true };
XS.Set(XSRegisters.EAX, XSRegisters.ECX, sourceIsIndirect: true);
XS.ShiftRight(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX), 8);
XS.Push(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));
break;