mirror of
https://github.com/danbulant/Cosmos
synced 2026-06-06 08:12:14 +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:
|
case 4:
|
||||||
if (TypeIsFloat(xSource))
|
if (TypeIsFloat(xSource))
|
||||||
{
|
{
|
||||||
XS.ConvertSS2SD(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
|
XS.SSE.ConvertSS2SD(XSRegisters.XMM0, XSRegisters.ESP, sourceIsIndirect: true);
|
||||||
}
|
}
|
||||||
else
|
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
|
// expand stack, that moved data is valid stack
|
||||||
XS.Sub(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
|
XS.Sub(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ namespace Cosmos.IL2CPU.X86.IL
|
||||||
}
|
}
|
||||||
else if (xSourceSize == 8)
|
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);
|
XS.SSE2.ConvertSD2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
|
||||||
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
|
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)
|
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);
|
XS.SSE2.ConvertSD2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
|
||||||
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
|
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ namespace Cosmos.IL2CPU.X86.IL
|
||||||
case 4:
|
case 4:
|
||||||
if (TypeIsFloat(xSource))
|
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);
|
XS.SSE.ConvertSS2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
|
||||||
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
|
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
|
||||||
}
|
}
|
||||||
|
|
@ -38,7 +38,7 @@ namespace Cosmos.IL2CPU.X86.IL
|
||||||
case 8:
|
case 8:
|
||||||
if (TypeIsFloat(xSource))
|
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);
|
XS.SSE2.ConvertSD2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
|
||||||
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
|
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
|
||||||
XS.Pop(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));
|
XS.Pop(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ namespace Cosmos.IL2CPU.X86.IL
|
||||||
|
|
||||||
// divisor
|
// divisor
|
||||||
//low
|
//low
|
||||||
XS.Mov(XSRegisters.ESI, XSRegisters.ESP, sourceIsIndirect: true);
|
XS.Set(XSRegisters.ESI, XSRegisters.ESP, sourceIsIndirect: true);
|
||||||
//high
|
//high
|
||||||
XS.Set(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDI), XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), sourceDisplacement: 4);
|
XS.Set(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDI), XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), sourceDisplacement: 4);
|
||||||
|
|
||||||
|
|
@ -56,7 +56,7 @@ namespace Cosmos.IL2CPU.X86.IL
|
||||||
|
|
||||||
//dividend
|
//dividend
|
||||||
// low
|
// low
|
||||||
XS.Mov(XSRegisters.EAX, XSRegisters.ESP, sourceIsIndirect: true);
|
XS.Set(XSRegisters.EAX, XSRegisters.ESP, sourceIsIndirect: true);
|
||||||
//high
|
//high
|
||||||
XS.Set(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDX), XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), sourceDisplacement: 4);
|
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))
|
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.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);
|
XS.SSE.DivSS(XSRegisters.XMM0, XSRegisters.XMM1);
|
||||||
new MoveSS { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceReg = CPUx86.RegistersEnum.XMM1 };
|
new MoveSS { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceReg = CPUx86.RegistersEnum.XMM1 };
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ namespace Cosmos.IL2CPU.X86.IL
|
||||||
|
|
||||||
// divisor
|
// divisor
|
||||||
//low
|
//low
|
||||||
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESI, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
|
XS.Set(XSRegisters.ESI, XSRegisters.ESP, sourceIsIndirect: true);
|
||||||
//high
|
//high
|
||||||
XS.Set(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDI), XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), sourceDisplacement: 4);
|
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))
|
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);
|
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);
|
XS.SSE.MulSS(XSRegisters.XMM0, XSRegisters.XMM1);
|
||||||
new MoveSS { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceReg = CPUx86.RegistersEnum.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
|
// pop the array
|
||||||
XS.Pop(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDX));
|
XS.Pop(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDX));
|
||||||
// convert to real memory address
|
// 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));
|
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
|
// pop the array now
|
||||||
XS.Pop(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDX));
|
XS.Pop(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EDX));
|
||||||
// translate it to actual memory
|
// 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)
|
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));
|
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))
|
if ((!aTypeOnStack.IsPointer) && (aDeclaringType.IsClass))
|
||||||
{
|
{
|
||||||
// convert to real memory address
|
// 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));
|
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ECX), (uint)(xOffset));
|
||||||
|
|
||||||
if (xFieldInfo.IsExternalValue && aDerefExternalField)
|
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++)
|
for (int i = 1; i <= (xSize / 4); i++)
|
||||||
|
|
@ -151,17 +151,17 @@ namespace Cosmos.IL2CPU.X86.IL
|
||||||
switch (xSize % 4)
|
switch (xSize % 4)
|
||||||
{
|
{
|
||||||
case 1:
|
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));
|
XS.Push(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
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));
|
XS.Push(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3: //For Release
|
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.ShiftRight(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX), 8);
|
||||||
XS.Push(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));
|
XS.Push(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.EAX));
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue