Merge remote-tracking branch 'refs/remotes/CosmosOS/master'

This commit is contained in:
MichaelTheShifter 2016-06-15 10:05:21 -04:00
commit 359c4569bf
29 changed files with 444 additions and 57 deletions

View file

@ -4,4 +4,4 @@
public class ConvertSS2SIAndTruncate : InstructionWithDestinationAndSource
{
}
}
}

View file

@ -91,12 +91,12 @@ namespace Cosmos.IL2CPU
};
XS.Comment("Set data segments");
XS.Set(XSRegisters.OldToNewRegister(RegistersEnum.EAX), mGdData);
XS.Set(XSRegisters.OldToNewRegister(RegistersEnum.DS), XSRegisters.OldToNewRegister(RegistersEnum.EAX));
XS.Set(XSRegisters.OldToNewRegister(RegistersEnum.ES), XSRegisters.OldToNewRegister(RegistersEnum.EAX));
XS.Set(XSRegisters.OldToNewRegister(RegistersEnum.FS), XSRegisters.OldToNewRegister(RegistersEnum.EAX));
XS.Set(XSRegisters.OldToNewRegister(RegistersEnum.GS), XSRegisters.OldToNewRegister(RegistersEnum.EAX));
XS.Set(XSRegisters.OldToNewRegister(RegistersEnum.SS), XSRegisters.OldToNewRegister(RegistersEnum.EAX));
XS.Set(XSRegisters.EAX, mGdData);
XS.Set(XSRegisters.DS, XSRegisters.AX);
XS.Set(XSRegisters.ES, XSRegisters.AX);
XS.Set(XSRegisters.FS, XSRegisters.AX);
XS.Set(XSRegisters.GS, XSRegisters.AX);
XS.Set(XSRegisters.SS, XSRegisters.AX);
XS.Comment("Force reload of code segment");
new JumpToSegment

View file

@ -55,7 +55,7 @@ namespace Cosmos.IL2CPU.X86.IL
new MoveSS { DestinationReg = RegistersEnum.XMM0, SourceReg = RegistersEnum.ESP, SourceIsIndirect = true };
XS.Add(XSRegisters.OldToNewRegister(RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.ESP, SourceIsIndirect = true };
new AddSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.XMM0 };
XS.SSE.AddSS(XSRegisters.XMM0, XSRegisters.XMM1);
new MoveSS { DestinationReg = RegistersEnum.ESP, DestinationIsIndirect = true, SourceReg = RegistersEnum.XMM1 };
}
else //integer

View file

@ -56,7 +56,7 @@ namespace Cosmos.IL2CPU.X86.IL
new MoveSS { DestinationReg = RegistersEnum.XMM0, SourceReg = RegistersEnum.ESP, SourceIsIndirect = true };
XS.Add(XSRegisters.OldToNewRegister(RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.ESP, SourceIsIndirect = true };
new AddSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.XMM0 };
XS.SSE.AddSS(XSRegisters.XMM0, XSRegisters.XMM1);
new MoveSS { DestinationReg = RegistersEnum.ESP, DestinationIsIndirect = true, SourceReg = RegistersEnum.XMM1 };
}
else //integer

View file

@ -56,7 +56,7 @@ namespace Cosmos.IL2CPU.X86.IL
new MoveSS { DestinationReg = RegistersEnum.XMM0, SourceReg = RegistersEnum.ESP, SourceIsIndirect = true };
XS.Add(XSRegisters.OldToNewRegister(RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.ESP, SourceIsIndirect = true };
new AddSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.XMM0 };
XS.SSE.AddSS(XSRegisters.XMM0, XSRegisters.XMM1);
new MoveSS { DestinationReg = RegistersEnum.ESP, DestinationIsIndirect = true, SourceReg = RegistersEnum.XMM1 };
}
else //integer

View file

@ -38,7 +38,7 @@ namespace Cosmos.IL2CPU.X86.IL {
XS.Add(XSRegisters.OldToNewRegister(RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.ESP, SourceIsIndirect = true };
new CompareSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.XMM0, pseudoOpcode = (byte)ComparePseudoOpcodes.Equal };
new MoveD { DestinationReg = RegistersEnum.EBX, SourceReg = RegistersEnum.XMM1 };
XS.SSE2.MoveD(XSRegisters.XMM1, XSRegisters.EBX);
XS.And(XSRegisters.OldToNewRegister(RegistersEnum.EBX), 1);
new Mov { SourceReg = RegistersEnum.EBX, DestinationReg = RegistersEnum.ESP, DestinationIsIndirect = true };
}

View file

@ -84,7 +84,7 @@ namespace Cosmos.IL2CPU.X86.IL
XS.Add(XSRegisters.OldToNewRegister(RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.ESP, SourceIsIndirect = true };
new CompareSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.XMM0, pseudoOpcode = (byte)ComparePseudoOpcodes.NotLessThanOrEqualTo };
new MoveD { DestinationReg = RegistersEnum.EBX, SourceReg = RegistersEnum.XMM1 };
XS.SSE2.MoveD(XSRegisters.XMM1, XSRegisters.EBX);
XS.And(XSRegisters.OldToNewRegister(RegistersEnum.EBX), 1);
new Mov { SourceReg = RegistersEnum.EBX, DestinationReg = RegistersEnum.ESP, DestinationIsIndirect = true };
}

View file

@ -86,7 +86,7 @@ namespace Cosmos.IL2CPU.X86.IL
XS.Add(XSRegisters.OldToNewRegister(RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.ESP, SourceIsIndirect = true };
new CompareSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.XMM0, pseudoOpcode = (byte)ComparePseudoOpcodes.NotLessThanOrEqualTo };
new MoveD { DestinationReg = RegistersEnum.EBX, SourceReg = RegistersEnum.XMM1 };
XS.SSE2.MoveD(XSRegisters.XMM1, XSRegisters.EBX);
XS.And(XSRegisters.OldToNewRegister(RegistersEnum.EBX), 1);
new Mov { SourceReg = RegistersEnum.EBX, DestinationReg = RegistersEnum.ESP, DestinationIsIndirect = true };
}

View file

@ -79,7 +79,7 @@ namespace Cosmos.IL2CPU.X86.IL
XS.Add(XSRegisters.OldToNewRegister(RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.ESP, SourceIsIndirect = true };
new CompareSS { DestinationReg = RegistersEnum.XMM1, SourceReg = RegistersEnum.XMM0, pseudoOpcode = (byte)ComparePseudoOpcodes.LessThan };
new MoveD { DestinationReg = RegistersEnum.EBX, SourceReg = RegistersEnum.XMM1 };
XS.SSE2.MoveD(XSRegisters.XMM1, XSRegisters.EBX);
XS.And(XSRegisters.OldToNewRegister(RegistersEnum.EBX), 1);
new Mov { SourceReg = RegistersEnum.EBX, DestinationReg = RegistersEnum.ESP, DestinationIsIndirect = true };
}

View file

@ -1,4 +1,5 @@
using System;
using Cosmos.Assembler.x86.SSE;
using XSharp.Compiler;
using CPUx86 = Cosmos.Assembler.x86;
@ -25,13 +26,13 @@ namespace Cosmos.IL2CPU.X86.IL
if (xSourceSize == 4)
{
new CPUx86.SSE.MoveSS { SourceReg = CPUx86.RegistersEnum.ESP, DestinationReg = CPUx86.RegistersEnum.XMM0, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSS2SIAndTruncate { SourceReg = CPUx86.RegistersEnum.XMM0, DestinationReg = CPUx86.RegistersEnum.EAX };
XS.SSE.ConvertSS2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}
else if (xSourceSize == 8)
{
new CPUx86.SSE.MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSD2SIAndTruncate { DestinationReg = CPUx86.RegistersEnum.EAX, SourceReg = CPUx86.RegistersEnum.XMM0, };
new MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.SSE2.ConvertSD2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}
else

View file

@ -1,4 +1,5 @@
using System;
using Cosmos.Assembler.x86.SSE;
using XSharp.Compiler;
using CPUx86 = Cosmos.Assembler.x86;
@ -25,13 +26,13 @@ namespace Cosmos.IL2CPU.X86.IL
if (xSourceSize == 4)
{
new CPUx86.SSE.MoveSS { SourceReg = CPUx86.RegistersEnum.ESP, DestinationReg = CPUx86.RegistersEnum.XMM0, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSS2SIAndTruncate { SourceReg = CPUx86.RegistersEnum.XMM0, DestinationReg = CPUx86.RegistersEnum.EAX };
XS.SSE.ConvertSS2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}
else if (xSourceSize == 8)
{
new CPUx86.SSE.MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSD2SIAndTruncate { DestinationReg = CPUx86.RegistersEnum.EAX, SourceReg = CPUx86.RegistersEnum.XMM0, };
new MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.SSE2.ConvertSD2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}
else

View file

@ -1,4 +1,5 @@
using System;
using Cosmos.Assembler.x86.SSE;
using XSharp.Compiler;
using CPUx86 = Cosmos.Assembler.x86;
@ -32,7 +33,7 @@ namespace Cosmos.IL2CPU.X86.IL
if (xSourceIsFloat)
{
new CPUx86.SSE.MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSS2SIAndTruncate { DestinationReg = CPUx86.RegistersEnum.EAX, SourceReg = CPUx86.RegistersEnum.XMM0 };
XS.SSE.ConvertSS2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}
break;
@ -41,8 +42,8 @@ namespace Cosmos.IL2CPU.X86.IL
{
if (xSourceIsFloat)
{
new CPUx86.SSE.MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSD2SIAndTruncate { DestinationReg = CPUx86.RegistersEnum.EAX, SourceReg = CPUx86.RegistersEnum.XMM0 };
new MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.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

@ -1,4 +1,5 @@
using System;
using XSharp.Compiler;
using CPUx86 = Cosmos.Assembler.x86;
namespace Cosmos.IL2CPU.X86.IL
@ -33,7 +34,7 @@ namespace Cosmos.IL2CPU.X86.IL
case 2:
case 4:
new CPUx86.Mov { SourceReg = CPUx86.RegistersEnum.ESP, DestinationReg = CPUx86.RegistersEnum.EAX, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSI2SS { SourceReg = CPUx86.RegistersEnum.EAX, DestinationReg = CPUx86.RegistersEnum.XMM0 };
XS.SSE.ConvertSI2SS(XSRegisters.XMM0, XSRegisters.EAX);
new CPUx86.SSE.MoveSS { SourceReg = CPUx86.RegistersEnum.XMM0, DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true };
break;
case 8:
@ -50,4 +51,4 @@ namespace Cosmos.IL2CPU.X86.IL
}
}
}
}
}

View file

@ -1,4 +1,5 @@
using System;
using Cosmos.Assembler.x86.SSE;
using XSharp.Compiler;
using CPUx86 = Cosmos.Assembler.x86;
@ -25,13 +26,13 @@ namespace Cosmos.IL2CPU.X86.IL
if (xSourceSize == 4)
{
new CPUx86.SSE.MoveSS { SourceReg = CPUx86.RegistersEnum.ESP, DestinationReg = CPUx86.RegistersEnum.XMM0, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSS2SIAndTruncate { SourceReg = CPUx86.RegistersEnum.XMM0, DestinationReg = CPUx86.RegistersEnum.EAX };
XS.SSE.ConvertSS2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}
else if (xSourceSize == 8)
{
new CPUx86.SSE.MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSD2SIAndTruncate { DestinationReg = CPUx86.RegistersEnum.EAX, SourceReg = CPUx86.RegistersEnum.XMM0, };
new MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.SSE2.ConvertSD2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}
else

View file

@ -1,4 +1,5 @@
using System;
using Cosmos.Assembler.x86.SSE;
using XSharp.Compiler;
using CPUx86 = Cosmos.Assembler.x86;
@ -24,13 +25,13 @@ namespace Cosmos.IL2CPU.X86.IL
if (xSourceSize == 4)
{
new CPUx86.SSE.MoveSS { SourceReg = CPUx86.RegistersEnum.ESP, DestinationReg = CPUx86.RegistersEnum.XMM0, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSS2SIAndTruncate { SourceReg = CPUx86.RegistersEnum.XMM0, DestinationReg = CPUx86.RegistersEnum.EAX };
XS.SSE.ConvertSS2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}
else if (xSourceSize == 8)
{
new CPUx86.SSE.MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSD2SIAndTruncate { DestinationReg = CPUx86.RegistersEnum.EAX, SourceReg = CPUx86.RegistersEnum.XMM0, };
new MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.SSE2.ConvertSD2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}
else

View file

@ -1,4 +1,5 @@
using System;
using Cosmos.Assembler.x86.SSE;
using XSharp.Compiler;
using CPUx86 = Cosmos.Assembler.x86;
@ -30,15 +31,15 @@ namespace Cosmos.IL2CPU.X86.IL
if (TypeIsFloat(xSource))
{
new CPUx86.SSE.MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSS2SIAndTruncate { DestinationReg = CPUx86.RegistersEnum.EAX, SourceReg = CPUx86.RegistersEnum.XMM0, };
XS.SSE.ConvertSS2SIAndTruncate(XSRegisters.EAX, XSRegisters.XMM0);
new CPUx86.Mov { DestinationReg = CPUx86.RegistersEnum.ESP, SourceReg = CPUx86.RegistersEnum.EAX, DestinationIsIndirect = true };
}
break;
case 8:
if (TypeIsFloat(xSource))
{
new CPUx86.SSE.MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new CPUx86.SSE.ConvertSD2SIAndTruncate { DestinationReg = CPUx86.RegistersEnum.EAX, SourceReg = CPUx86.RegistersEnum.XMM0, };
new MoveDoubleAndDupplicate { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.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));
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);

View file

@ -130,7 +130,7 @@ namespace Cosmos.IL2CPU.X86.IL
new MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM1, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new DivSS { DestinationReg = CPUx86.RegistersEnum.XMM1, SourceReg = CPUx86.RegistersEnum.XMM0 };
XS.SSE.DivSS(XSRegisters.XMM0, XSRegisters.XMM1);
new MoveSS { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceReg = CPUx86.RegistersEnum.XMM1 };
}
else

View file

@ -127,7 +127,7 @@ namespace Cosmos.IL2CPU.X86.IL
new MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM1, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new MulSS { DestinationReg = CPUx86.RegistersEnum.XMM1, SourceReg = CPUx86.RegistersEnum.XMM0 };
XS.SSE.MulSS(XSRegisters.XMM0, XSRegisters.XMM1);
new MoveSS { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceReg = CPUx86.RegistersEnum.XMM1 };
}
else

View file

@ -168,11 +168,7 @@ namespace Cosmos.IL2CPU.X86.IL
SourceReg = CPUx86.RegistersEnum.ESP,
SourceIsIndirect = true
};
new MulSS
{
DestinationReg = CPUx86.RegistersEnum.XMM1,
SourceReg = CPUx86.RegistersEnum.XMM0
};
XS.SSE.MulSS(XSRegisters.XMM0, XSRegisters.XMM1);
new MoveSS
{
DestinationReg = CPUx86.RegistersEnum.ESP,

View file

@ -25,8 +25,8 @@ namespace Cosmos.IL2CPU.X86.IL
new CPUx86.SSE.MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 8);
new MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM1, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new XorPS { DestinationReg = CPUx86.RegistersEnum.XMM2, SourceReg = CPUx86.RegistersEnum.XMM2 };
new DivPS { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.XMM1 };
XS.SSE.XorPS(XSRegisters.XMM2, XSRegisters.XMM2);
XS.SSE.DivPS(XSRegisters.XMM1, XSRegisters.XMM0);
new MoveSS { SourceReg = CPUx86.RegistersEnum.XMM2, DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true };
}
else
@ -116,8 +116,8 @@ namespace Cosmos.IL2CPU.X86.IL
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM1, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
new XorPS { DestinationReg = CPUx86.RegistersEnum.XMM2, SourceReg = CPUx86.RegistersEnum.XMM2 };
new DivSS { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.XMM1 };
XS.SSE.XorPS(XSRegisters.XMM2, XSRegisters.XMM2);
XS.SSE.DivSS(XSRegisters.XMM1, XSRegisters.XMM0);
XS.Sub(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
new MoveSS { SourceReg = CPUx86.RegistersEnum.XMM2, DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true };
}

View file

@ -29,8 +29,8 @@ namespace Cosmos.IL2CPU.X86.IL
new CPUx86.SSE.MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 8);
new MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM1, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
new XorPS { DestinationReg = CPUx86.RegistersEnum.XMM2, SourceReg = CPUx86.RegistersEnum.XMM2 };
new DivPS { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.XMM1 };
XS.SSE.XorPS(XSRegisters.XMM2, XSRegisters.XMM2);
XS.SSE.DivPS(XSRegisters.XMM1, XSRegisters.XMM0);
new MoveSS { SourceReg = CPUx86.RegistersEnum.XMM2, DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true };
}
else
@ -121,8 +121,8 @@ namespace Cosmos.IL2CPU.X86.IL
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
new MoveSS { DestinationReg = CPUx86.RegistersEnum.XMM1, SourceReg = CPUx86.RegistersEnum.ESP, SourceIsIndirect = true };
XS.Add(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
new XorPS { DestinationReg = CPUx86.RegistersEnum.XMM2, SourceReg = CPUx86.RegistersEnum.XMM2 };
new DivPS { DestinationReg = CPUx86.RegistersEnum.XMM0, SourceReg = CPUx86.RegistersEnum.XMM1 };
XS.SSE.XorPS(XSRegisters.XMM2, XSRegisters.XMM2);
XS.SSE.DivPS(XSRegisters.XMM1, XSRegisters.XMM0);
XS.Sub(XSRegisters.OldToNewRegister(CPUx86.RegistersEnum.ESP), 4);
new MoveSS { SourceReg = CPUx86.RegistersEnum.XMM2, DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true };
}

View file

@ -47,11 +47,7 @@ namespace Cosmos.IL2CPU.X86.IL
SourceReg = CPUx86.RegistersEnum.ESP,
SourceIsIndirect = true
};
new CPUx86.SSE.SubSS
{
DestinationReg = CPUx86.RegistersEnum.XMM1,
SourceReg = CPUx86.RegistersEnum.XMM0
};
XS.SSE.SubSS(XSRegisters.XMM0, XSRegisters.XMM1);
new CPUx86.SSE.MoveSS
{
DestinationReg = CPUx86.RegistersEnum.ESP,

View file

@ -1,4 +1,5 @@
using Cosmos.Assembler.x86.x87;
using Cosmos.Assembler.x86.SSE;
using Cosmos.Assembler.x86.x87;
using static XSharp.Compiler.XSRegisters;
namespace XSharp.Compiler

View file

@ -0,0 +1,67 @@
using Cosmos.Assembler.x86.SSE;
using static XSharp.Compiler.XSRegisters;
namespace XSharp.Compiler
{
partial class XS
{
public static class SSE
{
public static void AddSS(RegisterXMM destination, RegisterXMM source)
{
DoDestinationSource<AddSS>(destination, source);
}
public static void MulSS(RegisterXMM destination, RegisterXMM source)
{
DoDestinationSource<MulSS>(destination, source);
}
public static void SubSS(RegisterXMM destination, RegisterXMM source)
{
DoDestinationSource<SubSS>(destination, source);
}
public static void XorPS(RegisterXMM destination, RegisterXMM source)
{
DoDestinationSource<XorPS>(destination, source);
}
public static void ConvertSI2SS(RegisterXMM destination, Register32 source)
{
new ConvertSI2SS()
{
DestinationReg = destination,
SourceReg = source
};
}
public static void ConvertSS2SIAndTruncate(Register32 destination, RegisterXMM source)
{
new ConvertSS2SIAndTruncate
{
DestinationReg = destination,
SourceReg = source
};
}
public static void DivPS(RegisterXMM destination, RegisterXMM source)
{
new DivPS
{
DestinationReg = destination,
SourceReg = source
};
}
public static void DivSS(RegisterXMM destination, RegisterXMM source)
{
new DivPS
{
DestinationReg = destination,
SourceReg = source
};
}
}
}
}

View file

@ -0,0 +1,53 @@
using System;
using Cosmos.Assembler.x86;
using Cosmos.Assembler.x86.SSE;
using static XSharp.Compiler.XSRegisters;
namespace XSharp.Compiler
{
partial class XS
{
public static class SSE2
{
public static void ConvertSD2SIAndTruncate(Register32 destination, RegisterXMM source)
{
new ConvertSD2SIAndTruncate
{
DestinationReg = destination,
SourceReg = source
};
}
public static void MoveD(string destination, Register source, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<MoveD>(destination, source, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}
public static void MoveD(string destination, UInt32 value, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<MoveD>(destination, value, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}
public static void MoveD(string destination, string source, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<MoveD>(destination, source, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}
public static void MoveD(Register destination, string sourceLabel, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<MoveD>(destination, sourceLabel, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}
public static void MoveD(Register destination, uint value, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<MoveD>(destination, value, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}
public static void MoveD(Register destination, Register source, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<MoveD>(destination, source, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}
}
}
}

View file

@ -351,6 +351,218 @@ namespace XSharp.Compiler
#endregion InstructionWithDestinationAndSize
#region InstructionWithDestinationAndSource
private static void DoDestinationSource<T>(string destination, Register source, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
where T : InstructionWithDestinationAndSource, new()
{
if (destinationDisplacement != null)
{
destinationIsIndirect = true;
if (destinationDisplacement == 0)
{
destinationDisplacement = null;
}
}
if (sourceDisplacement != null)
{
sourceIsIndirect = true;
if (sourceDisplacement == 0)
{
sourceDisplacement = null;
}
}
if (destinationIsIndirect && sourceIsIndirect)
{
throw new Exception("Both destination and source cannot be indirect!");
}
new T
{
DestinationRef = ElementReference.New(destination),
DestinationIsIndirect = destinationIsIndirect,
DestinationDisplacement = destinationDisplacement,
SourceReg = source.RegEnum,
SourceIsIndirect = sourceIsIndirect,
SourceDisplacement = sourceDisplacement
};
}
private static void DoDestinationSource<T>(string destination, UInt32 value, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
where T : InstructionWithDestinationAndSource, new()
{
if (destinationDisplacement != null)
{
destinationIsIndirect = true;
if (destinationDisplacement == 0)
{
destinationDisplacement = null;
}
}
if (sourceDisplacement != null)
{
sourceIsIndirect = true;
if (sourceDisplacement == 0)
{
sourceDisplacement = null;
}
}
if (destinationIsIndirect && sourceIsIndirect)
{
throw new Exception("Both destination and source cannot be indirect!");
}
new T
{
DestinationRef = ElementReference.New(destination),
DestinationIsIndirect = destinationIsIndirect,
DestinationDisplacement = destinationDisplacement,
SourceValue = value,
SourceIsIndirect = sourceIsIndirect,
SourceDisplacement = sourceDisplacement,
};
}
private static void DoDestinationSource<T>(string destination, string source, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
where T : InstructionWithDestinationAndSource, new()
{
if (destinationDisplacement != null)
{
destinationIsIndirect = true;
if (destinationDisplacement == 0)
{
destinationDisplacement = null;
}
}
if (sourceDisplacement != null)
{
sourceIsIndirect = true;
if (sourceDisplacement == 0)
{
sourceDisplacement = null;
}
}
if (destinationIsIndirect && sourceIsIndirect)
{
throw new Exception("Both destination and source cannot be indirect!");
}
new T
{
DestinationRef = ElementReference.New(destination),
DestinationIsIndirect = destinationIsIndirect,
DestinationDisplacement = destinationDisplacement,
SourceRef = ElementReference.New(source),
SourceIsIndirect = sourceIsIndirect,
SourceDisplacement = sourceDisplacement,
};
}
private static void DoDestinationSource<T>(Register destination, string sourceLabel, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
where T : InstructionWithDestinationAndSource, new()
{
if (destinationDisplacement != null)
{
destinationIsIndirect = true;
if (destinationDisplacement == 0)
{
destinationDisplacement = null;
}
}
if (sourceDisplacement != null)
{
sourceIsIndirect = true;
if (sourceDisplacement == 0)
{
sourceDisplacement = null;
}
}
new T
{
DestinationReg = destination.RegEnum,
DestinationIsIndirect = destinationIsIndirect,
DestinationDisplacement = destinationDisplacement,
SourceRef = ElementReference.New(sourceLabel),
SourceIsIndirect = sourceIsIndirect,
SourceDisplacement = sourceDisplacement
};
}
private static void DoDestinationSource<T>(Register destination, uint value, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
where T : InstructionWithDestinationAndSource, new()
{
if (destinationDisplacement != null)
{
destinationIsIndirect = true;
if (destinationDisplacement == 0)
{
destinationDisplacement = null;
}
}
if (sourceDisplacement != null)
{
sourceIsIndirect = true;
if (sourceDisplacement == 0)
{
sourceDisplacement = null;
}
}
new T
{
DestinationReg = destination.RegEnum,
DestinationIsIndirect = destinationIsIndirect,
DestinationDisplacement = destinationDisplacement,
SourceValue = value,
SourceIsIndirect = sourceIsIndirect,
SourceDisplacement = sourceDisplacement,
};
}
private static void DoDestinationSource<T>(Register destination,
Register source,
bool destinationIsIndirect = false,
int? destinationDisplacement = null,
bool sourceIsIndirect = false,
int? sourceDisplacement = null)
where T : InstructionWithDestinationAndSource, new()
{
if (destinationDisplacement != null)
{
destinationIsIndirect = true;
if (destinationDisplacement == 0)
{
destinationDisplacement = null;
}
}
if (sourceDisplacement != null)
{
sourceIsIndirect = true;
if (sourceDisplacement == 0)
{
sourceDisplacement = null;
}
}
if (destinationIsIndirect && sourceIsIndirect)
{
throw new Exception("Both destination and source cannot be indirect!");
}
new T
{
DestinationReg = destination.RegEnum,
DestinationIsIndirect = destinationIsIndirect,
DestinationDisplacement = destinationDisplacement,
SourceIsIndirect = sourceIsIndirect,
SourceDisplacement = sourceDisplacement,
SourceReg = source.RegEnum
};
}
#endregion InstructionWithDestinationAndSource
#region Mov
public static void Set(string destination, Register source, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null, RegisterSize? size = null)
{

View file

@ -12,7 +12,8 @@ namespace XSharp.Compiler
Byte8 = 8,
Short16 = 16,
Int32 = 32,
FPU = 128,
FPU = 128,
XMM = 128,
}
public abstract class Register
@ -27,6 +28,11 @@ namespace XSharp.Compiler
Name = name;
RegEnum = regEnum;
}
public static implicit operator RegistersEnum(Register register)
{
return register.RegEnum;
}
}
private static readonly Dictionary<string, Register> mRegisters;
@ -78,9 +84,16 @@ namespace XSharp.Compiler
}
}
public class RegisterXMM : Register
{
public RegisterXMM(string name, RegistersEnum regEnum) : base(name, regEnum, RegisterSize.XMM)
{
}
}
public class RegisterSegment: Register
{
public RegisterSegment(string name, RegistersEnum regEnum): base(name, regEnum, RegisterSize.Int32)
public RegisterSegment(string name, RegistersEnum regEnum): base(name, regEnum, RegisterSize.Short16)
{
}
}
@ -126,5 +139,15 @@ namespace XSharp.Compiler
public static readonly RegisterFPU ST5 = new RegisterFPU(nameof(ST5), RegistersEnum.ST5);
public static readonly RegisterFPU ST6 = new RegisterFPU(nameof(ST6), RegistersEnum.ST6);
public static readonly RegisterFPU ST7 = new RegisterFPU(nameof(ST7), RegistersEnum.ST7);
public static readonly RegisterXMM XMM0 = new RegisterXMM(nameof(XMM0), RegistersEnum.XMM0);
public static readonly RegisterXMM XMM1 = new RegisterXMM(nameof(XMM1), RegistersEnum.XMM1);
public static readonly RegisterXMM XMM2 = new RegisterXMM(nameof(XMM2), RegistersEnum.XMM2);
public static readonly RegisterXMM XMM3 = new RegisterXMM(nameof(XMM3), RegistersEnum.XMM3);
public static readonly RegisterXMM XMM4 = new RegisterXMM(nameof(XMM4), RegistersEnum.XMM4);
public static readonly RegisterXMM XMM5 = new RegisterXMM(nameof(XMM5), RegistersEnum.XMM5);
public static readonly RegisterXMM XMM6 = new RegisterXMM(nameof(XMM6), RegistersEnum.XMM6);
public static readonly RegisterXMM XMM7 = new RegisterXMM(nameof(XMM7), RegistersEnum.XMM7);
}
}

View file

@ -0,0 +1,29 @@
 public static void $MethodName$(string destination, Register source, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<$InstructionClass$>(destination, source, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}
public static void $MethodName$(string destination, UInt32 value, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<$InstructionClass$>(destination, value, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}
public static void $MethodName$(string destination, string source, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<$InstructionClass$>(destination, source, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}
public static void $MethodName$(Register destination, string sourceLabel, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<$InstructionClass$>(destination, sourceLabel, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}
public static void $MethodName$(Register destination, uint value, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<$InstructionClass$>(destination, value, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}
public static void $MethodName$(Register destination, Register source, bool destinationIsIndirect = false, int? destinationDisplacement = null, bool sourceIsIndirect = false, int? sourceDisplacement = null)
{
DoDestinationSource<$InstructionClass$>(destination, source, destinationIsIndirect, destinationDisplacement, sourceIsIndirect, sourceDisplacement);
}

View file

@ -102,6 +102,8 @@
<Compile Include="TokenPatterns.cs" />
<Compile Include="XS.cs" />
<Compile Include="XS.FPU.cs" />
<Compile Include="XS.SSE.cs" />
<Compile Include="XS.SSE2.cs" />
<Compile Include="XS.Temp.cs" />
<Compile Include="XSRegisters.cs" />
</ItemGroup>
@ -127,6 +129,7 @@
<Content Include="Docs\ToDo.html" />
<Content Include="Docs\XSharp.htm" />
<Content Include="XSTemplate.DestinationSize.txt" />
<Content Include="XSTemplate.DestinationSource.txt" />
<Content Include="XSTemplate.DestinationSourceSize.txt" />
<None Include=".editorconfig" />
<None Include="app.config" />