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();
        }
示例#3
0
        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");
        }
示例#4
0
        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");
        }
示例#5
0
        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);
        }
示例#6
0
        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");
        }
示例#7
0
        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");
        }
示例#8
0
        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);
        }
示例#9
0
        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);
            }
        }
示例#10
0
        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);
 }
示例#12
0
 /// <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);
 }
示例#13
0
 /// <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);
 }
示例#14
0
 protected override void Finish()
 {
     CodeEmitter = null;
     codeStream  = null;
 }
示例#15
0
 /// <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);
示例#16
0
 /// <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);
 }
示例#17
0
 /// <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);
示例#18
0
 /// <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);
 }
示例#21
0
 /// <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);
 }
示例#23
0
 /// <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);
 }
示例#24
0
        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 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 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)
 {
     Emit(node, emitter as MachineCodeEmitter);
 }
示例#28
0
 /// <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);
 }
示例#29
0
        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");
        }
示例#30
0
 /// <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);
 }