protected override void Run() { if (!HasProtectedRegions) return; ProtectedRegion.FinalizeAll(BasicBlocks, MethodCompiler.ProtectedRegions); codeEmitter = MethodCompiler.Pipeline.FindFirst<CodeGenerationStage>().CodeEmitter; EmitProtectedRegionTable(); }
protected override void Run() { if (!HasProtectedRegions) return; ProtectedRegion.FinalizeAll(BasicBlocks, MethodCompiler.ProtectedRegions); codeEmitter = MethodCompiler.Pipeline.FindFirst<CodeGenerationStage>().CodeEmitter; if (TypeLayout.NativePointerSize == 4) NativePatchType = BuiltInPatch.I4; else NativePatchType = BuiltInPatch.I8; EmitProtectedRegionTable(); }
public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { System.Diagnostics.Debug.Assert(node.ResultCount == 1); System.Diagnostics.Debug.Assert(node.OperandCount == 4); if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 0) && node.Operand2.IsCPURegister && node.Operand3.IsConstantZero && node.GetOperand(3).IsCPURegister) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b1); emitter.OpcodeEncoder.Append1Bit((node.GetOperand(3).Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Operand2.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xB1); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.GetOperand(3).Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode); return; } throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode"); }
public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { System.Diagnostics.Debug.Assert(node.ResultCount == 1); System.Diagnostics.Debug.Assert(node.OperandCount == 2); if (node.Operand1.IsCPURegister && node.Operand2.IsConstant) { emitter.OpcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode)); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append4Bits(0b1101); emitter.OpcodeEncoder.Append1Bit(node.StatusRegister == StatusRegister.Update ? 1 :0); emitter.OpcodeEncoder.Append4Bits(0b0000); emitter.OpcodeEncoder.Append4Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append5BitImmediate(node.Operand2); emitter.OpcodeEncoder.Append2Bits(0b11); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append4Bits(node.Operand1.Register.RegisterCode); return; } throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode"); }
public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { System.Diagnostics.Debug.Assert(node.ResultCount == 1); System.Diagnostics.Debug.Assert(node.OperandCount == 2); System.Diagnostics.Debug.Assert(node.Result.IsCPURegister); System.Diagnostics.Debug.Assert(node.Operand1.IsCPURegister); System.Diagnostics.Debug.Assert(node.Result.Register == node.Operand1.Register); emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Operand1.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0x3A); emitter.OpcodeEncoder.Append8Bits(0x0B); emitter.OpcodeEncoder.Append2Bits(0b11); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); emitter.OpcodeEncoder.Append8BitImmediate(node.Operand2); }
public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { System.Diagnostics.Debug.Assert(node.ResultCount == 1); System.Diagnostics.Debug.Assert(node.OperandCount == 1); if (node.Operand1.IsCPURegister) { emitter.OpcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode)); emitter.OpcodeEncoder.Append3Bits(0b110); emitter.OpcodeEncoder.Append1Bit(0b1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit(0b1); emitter.OpcodeEncoder.Append4Bits(node.Operand1.Register.RegisterCode); emitter.OpcodeEncoder.Append1Bit(node.Operand3.IsR4 ? 0 : 1); emitter.OpcodeEncoder.Append4Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append4Bits(0b0001); emitter.OpcodeEncoder.Append8Bits(0x00); return; } throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode"); }
public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { System.Diagnostics.Debug.Assert(node.ResultCount == 0); System.Diagnostics.Debug.Assert(node.OperandCount == 1); if (node.Operand1.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0xFF); emitter.OpcodeEncoder.Append2Bits(0b11); emitter.OpcodeEncoder.Append3Bits(0b010); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); return; } if (node.Operand1.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0xE8); emitter.OpcodeEncoder.EmitRelative32(node.Operand1); return; } throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode"); }
public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { Debug.Assert(node.Result.IsCPURegister); Debug.Assert(node.Operand1.IsCPURegister); // reg from mmxreg // 0000 1111:0111 1110: 11 mmxreg reg var opcode = new OpcodeEncoder() .AppendNibble(Bits.b0110) // 4:opcode .AppendNibble(Bits.b0110) // 4:opcode .AppendNibble(Bits.b0000) // 4:opcode .AppendNibble(Bits.b1111) // 4:opcode .Append3Bits(Bits.b011) // 3:opcode .AppendBit(node.Result.Register.Width != 128) // 1:direction .AppendNibble(Bits.b1110) // 4:opcode .Append2Bits(Bits.b11) // 2:opcode .AppendRM(node.Operand1) // 3:r/m (source) .AppendRegister(node.Result.Register); // 3:register (destination) emitter.Emit(opcode); }
private static void MovapsMemoryToReg(InstructionNode node, BaseCodeEmitter emitter) { Debug.Assert(node.Result.IsCPURegister); // mem to xmmreg 1111 0011:0000 1111:0101 1101: mod xmmreg r/m var opcode = new OpcodeEncoder() .AppendNibble(Bits.b1111) // 4:opcode .AppendNibble(Bits.b0011) // 4:opcode .AppendNibble(Bits.b0000) // 4:opcode .AppendNibble(Bits.b1111) // 4:opcode .AppendNibble(Bits.b0101) // 4:opcode .AppendNibble(Bits.b1101) // 4:opcode .ModRegRMSIBDisplacement(false, node.Result, node.Operand1, node.Operand2) // Mod-Reg-RM-?SIB-?Displacement .AppendConditionalPatchPlaceholder(node.Operand1.IsLinkerResolved, out int patchOffset); // 32:memory if (node.Operand1.IsLinkerResolved) { emitter.Emit(opcode, node.Operand1, patchOffset); } else { emitter.Emit(opcode); } }
private static void MovMemoryToReg(InstructionNode node, BaseCodeEmitter emitter) { Debug.Assert(node.Result.IsCPURegister); int patchOffset; // memory to reg 1000 101w: mod reg r/m var opcode = new OpcodeEncoder() .AppendConditionalPrefix(node.Size == InstructionSize.Size16, 0x66) // 8:prefix: 16bit .AppendNibble(Bits.b1000) // 4:opcode .Append3Bits(Bits.b101) // 3:opcode .AppendWidthBit(node.Size != InstructionSize.Size8) // 1:width .ModRegRMSIBDisplacement(false, node.Result, node.Operand1, node.Operand2) // Mod-Reg-RM-?SIB-?Displacement .AppendConditionalPatchPlaceholder(node.Operand1.IsLinkerResolved, out patchOffset); // 32:memory if (node.Operand1.IsLinkerResolved) { emitter.Emit(opcode, node.Operand1, patchOffset); } else { emitter.Emit(opcode); } }
/// <summary> /// Begins the generate. /// </summary> protected virtual void BeginGenerate() { codeEmitter = Architecture.GetCodeEmitter(); codeEmitter.Initialize(MethodCompiler.Method.FullName, MethodCompiler.Linker, codeStream); }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="node">The node.</param> /// <param name="emitter">The emitter.</param> public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { CmpXchg(node, emitter); }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="node">The node.</param> /// <param name="emitter">The emitter.</param> public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { InvlpgMemory(node, emitter); }
protected override void Finish() { CodeEmitter = null; codeStream = null; }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="node">The node.</param> /// <param name="emitter">The emitter.</param> public abstract void Emit(InstructionNode node, BaseCodeEmitter emitter);
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="node">The node.</param> /// <param name="emitter">The emitter.</param> public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { LidtMemoryConstant(node, emitter); }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="context">The context.</param> /// <param name="emitter">The emitter.</param> public abstract void Emit(Context context, BaseCodeEmitter emitter);
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="node">The node.</param> /// <param name="emitter">The emitter.</param> public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { MovsxMemoryToReg(node, emitter); }
/// <summary> /// Emits the instruction. /// </summary> /// <param name="context">The context.</param> /// <param name="codeEmitter">The code emitter.</param> protected virtual void EmitInstruction(Context context, BaseCodeEmitter codeEmitter) { (context.Instruction as BasePlatformInstruction).Emit(context, codeEmitter); }
/// <summary> /// Emits the instruction. /// </summary> /// <param name="node">The node.</param> /// <param name="codeEmitter">The code emitter.</param> protected virtual void EmitInstruction(InstructionNode node, BaseCodeEmitter codeEmitter) { (node.Instruction as BasePlatformInstruction).Emit(node, codeEmitter); }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="node">The node.</param> /// <param name="emitter">The emitter.</param> public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { EmitLegacy(node, emitter as X64CodeEmitter); }
/// <summary> /// Begins the generate. /// </summary> protected virtual void BeginGenerate() { codeEmitter = Architecture.GetCodeEmitter(); codeEmitter.Initialize(MethodCompiler.Method.FullName, MethodCompiler.Linker, codeStream, TypeSystem); }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="node">The node.</param> /// <param name="emitter">The emitter.</param> public void Emit(InstructionNode node, BaseCodeEmitter emitter) { Emit(node, emitter as ARMv6CodeEmitter); }
public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { System.Diagnostics.Debug.Assert(node.ResultCount == 0); System.Diagnostics.Debug.Assert(node.OperandCount == 3); if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 5) && node.Operand2.IsConstantZero && node.Operand3.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0x89); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(node.Operand3.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append8Bits(0x00); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 5) && node.Operand2.IsCPURegister && node.Operand3.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0x89); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(node.Operand3.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append8Bits(0x00); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && node.Operand2.IsConstantZero && node.Operand3.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0x89); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Operand3.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append3Bits(0b100); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && (node.Operand2.IsConstant && node.Operand2.ConstantSigned32 >= -128 && node.Operand2.ConstantSigned32 <= 127) && node.Operand3.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0x89); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(node.Operand3.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append8BitImmediate(node.Operand2); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && node.Operand2.IsConstant && node.Operand3.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0x89); emitter.OpcodeEncoder.Append2Bits(0b10); emitter.OpcodeEncoder.Append3Bits(node.Operand3.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append32BitImmediate(node.Operand2); return; } if (node.Operand1.IsCPURegister && node.Operand2.IsCPURegister && node.Operand3.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0x89); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Operand3.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); return; } if (node.Operand1.IsCPURegister && node.Operand2.IsConstantZero && node.Operand3.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0x89); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Operand3.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); return; } if (node.Operand1.IsCPURegister && (node.Operand2.IsConstant && node.Operand2.ConstantSigned32 >= -128 && node.Operand2.ConstantSigned32 <= 127) && node.Operand3.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0x89); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(node.Operand3.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); emitter.OpcodeEncoder.Append8BitImmediate(node.Operand2); return; } if (node.Operand1.IsCPURegister && node.Operand2.IsConstant && node.Operand3.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0x89); emitter.OpcodeEncoder.Append2Bits(0b10); emitter.OpcodeEncoder.Append3Bits(node.Operand3.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); emitter.OpcodeEncoder.Append32BitImmediate(node.Operand2); return; } if (node.Operand1.IsConstant && node.Operand2.IsConstantZero && node.Operand3.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0x89); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Operand3.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append32BitImmediate(node.Operand1); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 5) && node.Operand2.IsConstantZero && node.Operand3.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0xC7); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(0b000); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append8Bits(0x00); emitter.OpcodeEncoder.Append16BitImmediate(node.Operand3); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 5) && node.Operand2.IsCPURegister && node.Operand3.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0xC7); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(0b000); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append8Bits(0x00); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && node.Operand2.IsConstantZero && node.Operand3.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0xC7); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b000); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append16BitImmediate(node.Operand3); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && (node.Operand2.IsConstant && node.Operand2.ConstantSigned32 >= -128 && node.Operand2.ConstantSigned32 <= 127) && node.Operand3.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0xC7); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(0b000); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append8BitImmediate(node.Operand2); emitter.OpcodeEncoder.Append16BitImmediate(node.Operand3); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && node.Operand2.IsConstant && node.Operand3.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0xC7); emitter.OpcodeEncoder.Append2Bits(0b10); emitter.OpcodeEncoder.Append3Bits(0b000); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append8BitImmediate(node.Operand2); emitter.OpcodeEncoder.Append32BitImmediate(node.Operand3); return; } if (node.Operand1.IsCPURegister && node.Operand2.IsCPURegister && node.Operand3.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0xC7); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b000); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); emitter.OpcodeEncoder.Append16BitImmediate(node.Operand3); return; } if (node.Operand1.IsCPURegister && node.Operand2.IsConstantZero && node.Operand3.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0xC7); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b000); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); emitter.OpcodeEncoder.Append16BitImmediate(node.Operand3); return; } if (node.Operand1.IsCPURegister && (node.Operand2.IsConstant && node.Operand2.ConstantSigned32 >= -128 && node.Operand2.ConstantSigned32 <= 127) && node.Operand3.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0xC7); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(0b000); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); emitter.OpcodeEncoder.Append8BitImmediate(node.Operand2); emitter.OpcodeEncoder.Append16BitImmediate(node.Operand3); return; } if (node.Operand1.IsCPURegister && node.Operand2.IsConstant && node.Operand3.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0xC7); emitter.OpcodeEncoder.Append2Bits(0b10); emitter.OpcodeEncoder.Append3Bits(0b000); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); emitter.OpcodeEncoder.Append32BitImmediate(node.Operand2); emitter.OpcodeEncoder.Append16BitImmediate(node.Operand3); return; } if (node.Operand1.IsConstant && node.Operand2.IsConstantZero && node.Operand3.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0xC7); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b000); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append32BitImmediate(node.Operand1); emitter.OpcodeEncoder.Append16BitImmediate(node.Operand3); return; } if (node.Operand1.IsConstant && node.Operand2.IsConstant && node.Operand3.IsConstant) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0xC7); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b000); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append32BitImmediateWithOffset(node.Operand1, node.Operand2); emitter.OpcodeEncoder.Append16BitImmediate(node.Operand3); return; } if (node.Operand1.IsConstant && node.Operand2.IsConstant && node.Operand3.IsCPURegister) { emitter.OpcodeEncoder.Append8Bits(0x66); emitter.OpcodeEncoder.Append8Bits(0x89); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Operand3.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append32BitImmediateWithOffset(node.Operand1, node.Operand2); return; } throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode"); }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="node">The node.</param> /// <param name="emitter">The emitter.</param> public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { Emit(node, emitter as MachineCodeEmitter); }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="node">The node.</param> /// <param name="emitter">The emitter.</param> public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { LeaAddress(node, emitter); }
public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { System.Diagnostics.Debug.Assert(node.ResultCount == 1); System.Diagnostics.Debug.Assert(node.OperandCount == 2); if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 5) && node.Operand2.IsConstantZero) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xBF); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append8Bits(0x00); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 5) && node.Operand2.IsCPURegister) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit((node.Operand2.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xBF); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append8Bits(0x00); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && node.Operand2.IsConstantZero) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xBF); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append3Bits(0b100); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && (node.Operand2.IsConstant && node.Operand2.ConstantSignedInteger >= -128 && node.Operand2.ConstantSignedInteger <= 127)) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xBF); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append8BitImmediate(node.Operand2); return; } if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && node.Operand2.IsConstant) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xBF); emitter.OpcodeEncoder.Append2Bits(0b10); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append8BitImmediate(node.Operand2); return; } if (node.Operand1.IsCPURegister && node.Operand2.IsCPURegister) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit((node.Operand1.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xBF); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b100); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); return; } if (node.Operand1.IsCPURegister && node.Operand2.IsConstantZero) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Operand1.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xBF); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); return; } if (node.Operand1.IsCPURegister && (node.Operand2.IsConstant && node.Operand2.ConstantSignedInteger >= -128 && node.Operand2.ConstantSignedInteger <= 127)) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Operand1.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xBF); emitter.OpcodeEncoder.Append2Bits(0b01); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); emitter.OpcodeEncoder.Append8BitImmediate(node.Operand2); return; } if (node.Operand1.IsCPURegister && node.Operand2.IsConstant) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Operand1.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xBF); emitter.OpcodeEncoder.Append2Bits(0b10); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); emitter.OpcodeEncoder.Append32BitImmediate(node.Operand2); return; } if (node.Operand1.IsConstant && node.Operand2.IsConstantZero) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xBF); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append32BitImmediate(node.Operand1); return; } if (node.Operand1.IsConstant && node.Operand2.IsConstant) { emitter.OpcodeEncoder.SuppressByte(0x40); emitter.OpcodeEncoder.Append4Bits(0b0100); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append1Bit(0b0); emitter.OpcodeEncoder.Append8Bits(0x0F); emitter.OpcodeEncoder.Append8Bits(0xBF); emitter.OpcodeEncoder.Append2Bits(0b00); emitter.OpcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); emitter.OpcodeEncoder.Append3Bits(0b101); emitter.OpcodeEncoder.Append32BitImmediateWithOffset(node.Operand1, node.Operand2); return; } throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode"); }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="node">The node.</param> /// <param name="emitter">The emitter.</param> public override void Emit(InstructionNode node, BaseCodeEmitter emitter) { MovupsRegToMemory(node, emitter); }