예제 #1
0
파일: Fmov.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 == 2);

            if (node.Operand1.IsConstant)
            {
                opcodeEncoder.Append4Bits(0b0001);
                opcodeEncoder.Append4Bits(0b1110);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append1Bit(node.Result.IsR4 ? 0 : 1);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append8BitImmediate(node.Operand2);
                opcodeEncoder.Append3Bits(0b100);
                opcodeEncoder.Append4Bits(0b0000);
                opcodeEncoder.Append1Bit(0b0);
                return;
            }

            if (node.Operand1.IsCPURegister)
            {
                opcodeEncoder.Append4Bits(0b0011);
                opcodeEncoder.Append3Bits(0b110);
                opcodeEncoder.Append1Bit(0b1);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append2Bits(0b11);
                opcodeEncoder.Append4Bits(0b0000);
                opcodeEncoder.Append1Bit(0b0);
                opcodeEncoder.Append4Bits(node.Operand1.Register.RegisterCode);
                opcodeEncoder.Append4Bits(node.Result.Register.RegisterCode);
                return;
            }

            throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode");
        }
예제 #2
0
파일: B.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 == 0);

            opcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode));
            opcodeEncoder.Append4Bits(0b1010);
            opcodeEncoder.EmitRelative24(node.BranchTargets[0].Label);
        }
예제 #3
0
        public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
        {
            System.Diagnostics.Debug.Assert(node.ResultCount == 0);
            System.Diagnostics.Debug.Assert(node.OperandCount == 2);

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

            throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode");
        }
예제 #4
0
파일: Setcc.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 == 0);

            opcodeEncoder.Append8Bits(0x0F);
            opcodeEncoder.Append4Bits(0b1001);
            opcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode));
            opcodeEncoder.Append2Bits(0b11);
            opcodeEncoder.Append3Bits(0b000);
            opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
        }
예제 #5
0
        public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
        {
            System.Diagnostics.Debug.Assert(node.ResultCount == 0);
            System.Diagnostics.Debug.Assert(node.OperandCount == 1);

            if (node.Operand1.IsConstant)
            {
                opcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode));
                opcodeEncoder.Append4Bits(0b1011);
                opcodeEncoder.EmitRelative24(node.BranchTargets[0].Label);
                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.Operand2.IsCPURegister)
            {
                opcodeEncoder.Append8Bits(0x0F);
                opcodeEncoder.Append4Bits(0b0100);
                opcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode));
                opcodeEncoder.Append2Bits(0b11);
                opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
                opcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode);
                return;
            }

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

            opcodeEncoder.Append8Bits(0x0F);
            opcodeEncoder.SuppressByte(0x40);
            opcodeEncoder.Append4Bits(0b0100);
            opcodeEncoder.Append1Bit(0b0);
            opcodeEncoder.Append1Bit((node.Result.Register.RegisterCode >> 3) & 0x1);
            opcodeEncoder.Append1Bit(0b0);
            opcodeEncoder.Append1Bit((node.Operand2.Register.RegisterCode >> 3) & 0x1);
            opcodeEncoder.Append4Bits(0b0100);
            opcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode));
            opcodeEncoder.Append2Bits(0b11);
            opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode);
            opcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode);
        }