コード例 #1
0
ファイル: StrS16.cs プロジェクト: uxmal/MOSA-Project
        public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
        {
            System.Diagnostics.Debug.Assert(node.ResultCount == 0);
            System.Diagnostics.Debug.Assert(node.OperandCount == 3);

            if (node.Operand1.IsCPURegister && node.Operand2.IsConstant && node.Operand3.IsCPURegister)
            {
                opcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode));
                opcodeEncoder.Append3Bits(0b000);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(node.StatusRegister == StatusRegister.UpDirection ? 1 : 0);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append4Bits(node.Operand1.Register.RegisterCode);
                opcodeEncoder.Append4Bits(node.Operand3.Register.RegisterCode);
                opcodeEncoder.Append4BitImmediateHighNibble(node.Operand2);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append4BitImmediate(node.Operand2);
                return;
            }

            if (node.Operand1.IsCPURegister && node.Operand2.IsCPURegister && node.Operand3.IsCPURegister)
            {
                opcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode));
                opcodeEncoder.Append3Bits(0b000);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(node.StatusRegister == StatusRegister.UpDirection ? 1 : 0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append4Bits(node.Operand1.Register.RegisterCode);
                opcodeEncoder.Append4Bits(node.Operand3.Register.RegisterCode);
                opcodeEncoder.Append4Bits(0b0000);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append4Bits(node.Operand2.Register.RegisterCode);
                return;
            }

            throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode");
        }
コード例 #2
0
ファイル: Movw.cs プロジェクト: uxmal/MOSA-Project
        public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
        {
            System.Diagnostics.Debug.Assert(node.ResultCount == 1);
            System.Diagnostics.Debug.Assert(node.OperandCount == 1);

            if (node.Operand1.IsConstant)
            {
                opcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode));
                opcodeEncoder.Append2Bits(0b00);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append4Bits(0b1101);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append4BitImmediateHighNibble(node.Operand1);
                opcodeEncoder.Append4Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append12BitImmediate(node.Operand1);
                return;
            }

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