This commit is contained in:
mterwoord_cp 2008-12-24 15:33:22 +00:00
parent 06abbc8a14
commit aace0f4e37
5 changed files with 1188 additions and 338 deletions

View file

@ -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 }
});

View file

@ -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
}
}
}

View file

@ -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;
}

View file

@ -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);