示例#1
0
        public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
        {
            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);

            if (node.Operand2.IsCPURegister)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append8Bits(0xD3);
                opcodeEncoder.Append2Bits(0b11);
                opcodeEncoder.Append3Bits(0b111);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                return;
            }

            if (node.Operand2.IsConstantOne)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append8Bits(0xD1);
                opcodeEncoder.Append2Bits(0b11);
                opcodeEncoder.Append3Bits(0b111);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                return;
            }

            if (node.Operand2.IsConstant)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append8Bits(0xC1);
                opcodeEncoder.Append2Bits(0b11);
                opcodeEncoder.Append3Bits(0b111);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append8BitImmediate(node.Operand2);
                return;
            }

            throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode");
        }
示例#2
0
        public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
        {
            System.Diagnostics.Debug.Assert(node.ResultCount == 2);
            System.Diagnostics.Debug.Assert(node.OperandCount == 1);

            opcodeEncoder.SuppressByte(0x40);
            opcodeEncoder.Append4Bits(0b0100);
            opcodeEncoder.Append1Bit(0b1);
            opcodeEncoder.Append1Bit(0b0);
            opcodeEncoder.Append1Bit(0b0);
            opcodeEncoder.Append1Bit(0b0);
            opcodeEncoder.Append8Bits(0x99);
        }
示例#3
0
        public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
        {
            System.Diagnostics.Debug.Assert(node.ResultCount == 1);
            System.Diagnostics.Debug.Assert(node.OperandCount == 0);

            opcodeEncoder.SuppressByte(0x40);
            opcodeEncoder.Append4Bits(0b0100);
            opcodeEncoder.Append1Bit(0b0);
            opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
            opcodeEncoder.Append1Bit(0b0);
            opcodeEncoder.Append1Bit(0b0);
            opcodeEncoder.Append4Bits(0b0101);
            opcodeEncoder.Append1Bit(0b0);
            opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
        }
示例#4
0
        public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
        {
            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);

            opcodeEncoder.Append8Bits(0x66);
            opcodeEncoder.SuppressByte(0x40);
            opcodeEncoder.Append4Bits(0b0100);
            opcodeEncoder.Append1Bit(0b0);
            opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
            opcodeEncoder.Append1Bit(0b0);
            opcodeEncoder.Append1Bit((node.Operand1.Register.RegisterCode >> 3) & 0x1);
            opcodeEncoder.Append8Bits(0x0F);
            opcodeEncoder.Append8Bits(0x3A);
            opcodeEncoder.Append8Bits(0x0B);
            opcodeEncoder.Append2Bits(0b11);
            opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
            opcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode);
            opcodeEncoder.Append8BitImmediate(node.Operand2);
        }
示例#5
0
        public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
        {
            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)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append1Bit((node.GetOperand(3).Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Operand2.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append8Bits(0xB1);
                opcodeEncoder.Append2Bits(0b00);
                opcodeEncoder.Append3Bits(node.GetOperand(3).Register.RegisterCode);
                opcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode);
                return;
            }

            throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode");
        }
示例#6
0
        public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
        {
            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)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append8Bits(0xF2);
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append8Bits(0x10);
                opcodeEncoder.Append2Bits(0b01);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append3Bits(0b101);
                opcodeEncoder.Append8Bits(0x00);
                return;
            }

            if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && node.Operand2.IsConstantZero)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append8Bits(0xF2);
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append8Bits(0x10);
                opcodeEncoder.Append2Bits(0b00);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append3Bits(0b100);
                opcodeEncoder.Append2Bits(0b00);
                opcodeEncoder.Append3Bits(0b100);
                opcodeEncoder.Append3Bits(0b100);
                return;
            }

            if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && (node.Operand2.IsConstant && node.Operand2.ConstantSigned32 >= -128 && node.Operand2.ConstantSigned32 <= 127))
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append8Bits(0xF2);
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append8Bits(0x10);
                opcodeEncoder.Append2Bits(0b01);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append3Bits(0b100);
                opcodeEncoder.Append2Bits(0b00);
                opcodeEncoder.Append3Bits(0b100);
                opcodeEncoder.Append3Bits(0b100);
                opcodeEncoder.Append8BitImmediate(node.Operand2);
                return;
            }

            if ((node.Operand1.IsCPURegister && node.Operand1.Register.RegisterCode == 4) && node.Operand2.IsConstant)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append8Bits(0xF2);
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append8Bits(0x10);
                opcodeEncoder.Append2Bits(0b10);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append3Bits(0b100);
                opcodeEncoder.Append8BitImmediate(node.Operand2);
                return;
            }

            if (node.Operand1.IsCPURegister && node.Operand2.IsCPURegister)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit((node.Operand1.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append8Bits(0xF2);
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append8Bits(0x10);
                opcodeEncoder.Append2Bits(0b00);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append3Bits(0b100);
                opcodeEncoder.Append2Bits(0b00);
                opcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode);
                opcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode);
                return;
            }

            if (node.Operand1.IsCPURegister && node.Operand2.IsConstantZero)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Operand1.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append8Bits(0xF2);
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append8Bits(0x10);
                opcodeEncoder.Append2Bits(0b00);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode);
                return;
            }

            if (node.Operand1.IsCPURegister && (node.Operand2.IsConstant && node.Operand2.ConstantSigned32 >= -128 && node.Operand2.ConstantSigned32 <= 127))
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Operand1.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append8Bits(0xF2);
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append8Bits(0x10);
                opcodeEncoder.Append2Bits(0b01);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode);
                opcodeEncoder.Append8BitImmediate(node.Operand2);
                return;
            }

            if (node.Operand1.IsCPURegister && node.Operand2.IsConstant)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Operand1.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append8Bits(0xF2);
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append8Bits(0x10);
                opcodeEncoder.Append2Bits(0b10);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode);
                opcodeEncoder.Append32BitImmediate(node.Operand2);
                return;
            }

            if (node.Operand1.IsConstant && node.Operand2.IsConstantZero)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append8Bits(0xF2);
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append8Bits(0x10);
                opcodeEncoder.Append2Bits(0b00);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append3Bits(0b101);
                opcodeEncoder.Append32BitImmediate(node.Operand1);
                return;
            }

            if (node.Operand1.IsConstant && node.Operand2.IsConstant)
            {
                opcodeEncoder.SuppressByte(0x40);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append8Bits(0xF2);
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append8Bits(0x10);
                opcodeEncoder.Append2Bits(0b00);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append3Bits(0b101);
                opcodeEncoder.Append32BitImmediateWithOffset(node.Operand1, node.Operand2);
                return;
            }

            throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode");
        }