mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-24 12:35:31 +00:00
This commit is contained in:
parent
06abbc8a14
commit
aace0f4e37
5 changed files with 1188 additions and 338 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -26,6 +26,14 @@ namespace Indy.IL2CPU.Tests.AssemblerTests.X86 {
|
||||||
DestInfo = new Constraints {TestImmediate8=false, TestImmediate32=false, TestImmediate16=false },
|
DestInfo = new Constraints {TestImmediate8=false, TestImmediate32=false, TestImmediate16=false },
|
||||||
SourceInfo = new Constraints { }
|
SourceInfo = new Constraints { }
|
||||||
});
|
});
|
||||||
|
opcodesException.Add(typeof(Call), new ConstraintsContainer{
|
||||||
|
DestInfo=new Constraints{ TestImmediate16=false, TestImmediate8=false, TestMem16=false, TestMem8=false, InvalidRegisters=Registers.Get8BitRegisters().Union(Registers.Get16BitRegisters())},
|
||||||
|
InvalidSizes=Instruction.InstructionSizes.Byte | Instruction.InstructionSizes.Word
|
||||||
|
});
|
||||||
|
opcodesException.Add(typeof(CmpXchg), new ConstraintsContainer {
|
||||||
|
DestInfo = new Constraints { TestImmediate32 = false, TestImmediate16 = false, TestImmediate8 = false },
|
||||||
|
SourceInfo = new Constraints { TestImmediate32 = false, TestImmediate16 = false, TestImmediate8 = false, TestMem8 = false, TestMem16 = false, TestMem32 = false, TestRegisters = true }
|
||||||
|
});
|
||||||
opcodesException.Add(typeof(ConditionalJump), new ConstraintsContainer {
|
opcodesException.Add(typeof(ConditionalJump), new ConstraintsContainer {
|
||||||
DestInfo = new Constraints { TestImmediate32 = true, TestImmediate16 = false, TestImmediate8 = false, TestMem8 = false, TestMem16 = false, TestMem32 = false, TestRegisters = false }
|
DestInfo = new Constraints { TestImmediate32 = true, TestImmediate16 = false, TestImmediate8 = false, TestMem8 = false, TestMem16 = false, TestMem32 = false, TestRegisters = false }
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -4,5 +4,24 @@ using System.Linq;
|
||||||
namespace Indy.IL2CPU.Assembler.X86 {
|
namespace Indy.IL2CPU.Assembler.X86 {
|
||||||
[OpCode("cmpxchg")]
|
[OpCode("cmpxchg")]
|
||||||
public class CmpXchg: InstructionWithDestinationAndSourceAndSize {
|
public class CmpXchg: InstructionWithDestinationAndSourceAndSize {
|
||||||
|
public static void InitializeEncodingData(Instruction.InstructionData aData) {
|
||||||
|
aData.EncodingOptions.Add(new InstructionData.InstructionEncodingOption {
|
||||||
|
OpCode=new byte[]{0x0F, 0xB0},
|
||||||
|
OperandSizeByte=1,
|
||||||
|
NeedsModRMByte=true,
|
||||||
|
DestinationMemory=true,
|
||||||
|
SourceReg=Guid.Empty,
|
||||||
|
ReverseRegisters=true
|
||||||
|
}); // register to memory
|
||||||
|
aData.EncodingOptions.Add(new InstructionData.InstructionEncodingOption {
|
||||||
|
OpCode=new byte[] {0x0F, 0xB0},
|
||||||
|
OperandSizeByte=1,
|
||||||
|
NeedsModRMByte=true,
|
||||||
|
ReverseRegisters=true,
|
||||||
|
InitialModRMByteValue = 0xC0,
|
||||||
|
SourceReg=Guid.Empty,
|
||||||
|
DestinationReg=Guid.Empty
|
||||||
|
}); // register1, register2
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -6,6 +6,28 @@ using System.Text;
|
||||||
namespace Indy.IL2CPU.Assembler.X86 {
|
namespace Indy.IL2CPU.Assembler.X86 {
|
||||||
[OpCode("call")]
|
[OpCode("call")]
|
||||||
public class Call: JumpBase {
|
public class Call: JumpBase {
|
||||||
|
public static void InitializeEncodingData(Instruction.InstructionData aData) {
|
||||||
|
aData.EncodingOptions.Add(new InstructionData.InstructionEncodingOption {
|
||||||
|
OpCode = new byte[] { 0xE8 },
|
||||||
|
DestinationImmediate = true,
|
||||||
|
AllowedSizes = InstructionSizes.DWord
|
||||||
|
}); // direct value
|
||||||
|
aData.EncodingOptions.Add(new InstructionData.InstructionEncodingOption {
|
||||||
|
OpCode = new byte[] { 0xFF, 0xD0 },
|
||||||
|
DestinationReg = Guid.Empty,
|
||||||
|
DestinationRegByte=1,
|
||||||
|
AllowedSizes = InstructionSizes.DWord
|
||||||
|
}); // register indirect
|
||||||
|
aData.EncodingOptions.Add(new InstructionData.InstructionEncodingOption {
|
||||||
|
OpCode = new byte[] { 0xFF },
|
||||||
|
NeedsModRMByte=true,
|
||||||
|
InitialModRMByteValue=0x10,
|
||||||
|
DestinationMemory=true,
|
||||||
|
ReverseRegisters=true,
|
||||||
|
AllowedSizes = InstructionSizes.DWord
|
||||||
|
}); // memory indirect
|
||||||
|
}
|
||||||
|
|
||||||
public Call() {
|
public Call() {
|
||||||
mNear = false;
|
mNear = false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,70 @@ namespace TestApp {
|
||||||
class Program {
|
class Program {
|
||||||
class Renderer : Y86 {
|
class Renderer : Y86 {
|
||||||
public void DoRender() {
|
public void DoRender() {
|
||||||
new global::Indy.IL2CPU.Assembler.X86.And { SourceValue=0, DestinationReg = Registers.EAX};
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AH, DestinationReg = Registers.AH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AH, DestinationReg = Registers.AL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AH, DestinationReg = Registers.BH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AH, DestinationReg = Registers.BL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AH, DestinationReg = Registers.CH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AH, DestinationReg = Registers.CL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AH, DestinationReg = Registers.DH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AH, DestinationReg = Registers.DL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AL, DestinationReg = Registers.AH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AL, DestinationReg = Registers.AL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AL, DestinationReg = Registers.BH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AL, DestinationReg = Registers.BL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AL, DestinationReg = Registers.CH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AL, DestinationReg = Registers.CL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AL, DestinationReg = Registers.DH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.AL, DestinationReg = Registers.DL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BH, DestinationReg = Registers.AH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BH, DestinationReg = Registers.AL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BH, DestinationReg = Registers.BH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BH, DestinationReg = Registers.BL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BH, DestinationReg = Registers.CH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BH, DestinationReg = Registers.CL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BH, DestinationReg = Registers.DH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BH, DestinationReg = Registers.DL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BL, DestinationReg = Registers.AH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BL, DestinationReg = Registers.AL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BL, DestinationReg = Registers.BH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BL, DestinationReg = Registers.BL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BL, DestinationReg = Registers.CH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BL, DestinationReg = Registers.CL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BL, DestinationReg = Registers.DH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.BL, DestinationReg = Registers.DL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CH, DestinationReg = Registers.AH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CH, DestinationReg = Registers.AL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CH, DestinationReg = Registers.BH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CH, DestinationReg = Registers.BL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CH, DestinationReg = Registers.CH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CH, DestinationReg = Registers.CL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CH, DestinationReg = Registers.DH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CH, DestinationReg = Registers.DL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CL, DestinationReg = Registers.AH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CL, DestinationReg = Registers.AL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CL, DestinationReg = Registers.BH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CL, DestinationReg = Registers.BL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CL, DestinationReg = Registers.CH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CL, DestinationReg = Registers.CL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CL, DestinationReg = Registers.DH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.CL, DestinationReg = Registers.DL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DH, DestinationReg = Registers.AH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DH, DestinationReg = Registers.AL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DH, DestinationReg = Registers.BH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DH, DestinationReg = Registers.BL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DH, DestinationReg = Registers.CH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DH, DestinationReg = Registers.CL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DH, DestinationReg = Registers.DH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DH, DestinationReg = Registers.DL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DL, DestinationReg = Registers.AH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DL, DestinationReg = Registers.AL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DL, DestinationReg = Registers.BH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DL, DestinationReg = Registers.BL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DL, DestinationReg = Registers.CH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DL, DestinationReg = Registers.CL, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DL, DestinationReg = Registers.DH, Size = 8 };
|
||||||
|
new global::Indy.IL2CPU.Assembler.X86.CmpXchg { SourceReg = Registers.DL, DestinationReg = Registers.DL, Size = 8 };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void Main(string[] args) {
|
static void Main(string[] args) {
|
||||||
|
|
@ -40,7 +103,7 @@ namespace TestApp {
|
||||||
xAsm.FlushBinary(xOutput, 0x200000);
|
xAsm.FlushBinary(xOutput, 0x200000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestCodeGenerator.Execute();
|
//TestCodeGenerator.Execute();
|
||||||
|
|
||||||
//InvalidOpcodeTester.Initialize();
|
//InvalidOpcodeTester.Initialize();
|
||||||
//InvalidOpcodeTester.ExecuteSingle(typeof(Move), 0);
|
//InvalidOpcodeTester.ExecuteSingle(typeof(Move), 0);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue