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"); }
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.Append4Bits(GetConditionCode(node.ConditionCode)); opcodeEncoder.Append4Bits(0b1110); opcodeEncoder.Append4Bits(0b0001); opcodeEncoder.Append1Bit(0b0); opcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); opcodeEncoder.Append1Bit(0b0); opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); opcodeEncoder.Append4Bits(0b0001); opcodeEncoder.Append1Bit(node.Result.IsR4 ? 0 : 1); opcodeEncoder.Append2Bits(0b00); opcodeEncoder.Append1Bit(0b0); opcodeEncoder.Append1Bit(0b0); opcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode); return; } if (node.Operand1.IsCPURegister && node.Operand2.IsConstant) { opcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode)); opcodeEncoder.Append4Bits(0b1110); opcodeEncoder.Append4Bits(0b0001); opcodeEncoder.Append1Bit(0b0); opcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); opcodeEncoder.Append1Bit(0b0); opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); opcodeEncoder.Append4Bits(0b0001); opcodeEncoder.Append1Bit(node.Result.IsR4 ? 0 : 1); opcodeEncoder.Append2Bits(0b00); opcodeEncoder.Append1Bit(0b0); opcodeEncoder.Append1Bit(0b1); opcodeEncoder.Append4BitImmediate(node.Operand2); return; } throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode"); }