mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-21 13:28:41 +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 },
|
||||
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 {
|
||||
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 {
|
||||
[OpCode("cmpxchg")]
|
||||
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 {
|
||||
[OpCode("call")]
|
||||
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() {
|
||||
mNear = false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,70 @@ namespace TestApp {
|
|||
class Program {
|
||||
class Renderer : Y86 {
|
||||
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) {
|
||||
|
|
@ -40,7 +103,7 @@ namespace TestApp {
|
|||
xAsm.FlushBinary(xOutput, 0x200000);
|
||||
}
|
||||
|
||||
// TestCodeGenerator.Execute();
|
||||
//TestCodeGenerator.Execute();
|
||||
|
||||
//InvalidOpcodeTester.Initialize();
|
||||
//InvalidOpcodeTester.ExecuteSingle(typeof(Move), 0);
|
||||
|
|
|
|||
Loading…
Reference in a new issue