mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-21 21:38:52 +00:00
.
This commit is contained in:
parent
98cd7da12f
commit
fc902e5a68
9 changed files with 22 additions and 22 deletions
|
|
@ -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
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue