public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder) { System.Diagnostics.Debug.Assert(node.ResultCount == 1); System.Diagnostics.Debug.Assert(node.OperandCount == 3); 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.Append8Bits(0x0F); opcodeEncoder.Append8Bits(0xAD); opcodeEncoder.Append2Bits(0b11); opcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode); opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); return; } if (node.Operand2.IsConstant) { opcodeEncoder.Append8Bits(0x0F); opcodeEncoder.Append8Bits(0xAC); opcodeEncoder.Append2Bits(0b11); opcodeEncoder.Append3Bits(0b100); opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); opcodeEncoder.Append8BitImmediate(node.Operand2); return; } throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode"); }
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.IsCPURegister) { opcodeEncoder.SuppressByte(0x40); opcodeEncoder.Append4Bits(0b0100); opcodeEncoder.Append1Bit(0b0); opcodeEncoder.Append1Bit(0b0); opcodeEncoder.Append1Bit(0b0); opcodeEncoder.Append1Bit((node.Operand1.Register.RegisterCode >> 3) & 0x1); opcodeEncoder.Append8Bits(0xFF); opcodeEncoder.Append2Bits(0b11); opcodeEncoder.Append3Bits(0b100); opcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); return; } if (node.Operand1.IsConstant) { opcodeEncoder.Append8Bits(0xE9); opcodeEncoder.EmitRelative32(node.Operand1); return; } throw new Compiler.Common.Exceptions.CompilerException("Invalid Opcode"); }
public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder) { System.Diagnostics.Debug.Assert(node.ResultCount == 0); System.Diagnostics.Debug.Assert(node.OperandCount == 3); opcodeEncoder.Append8Bits(0x0F); opcodeEncoder.Append8Bits(0x30); }
public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder) { System.Diagnostics.Debug.Assert(node.ResultCount == 0); System.Diagnostics.Debug.Assert(node.OperandCount == 2); opcodeEncoder.Append8Bits(0x0F); opcodeEncoder.Append8Bits(0x22); opcodeEncoder.Append2Bits(0b11); opcodeEncoder.Append3Bits(node.Operand1.Register.RegisterCode); opcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode); }
public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder) { System.Diagnostics.Debug.Assert(node.ResultCount == 0); System.Diagnostics.Debug.Assert(node.OperandCount == 0); opcodeEncoder.Append8Bits(0xE9); opcodeEncoder.EmitRelative32(node.BranchTargets[0].Label); }
public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder) { System.Diagnostics.Debug.Assert(node.ResultCount == 1); System.Diagnostics.Debug.Assert(node.OperandCount == 1); 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.Append8Bits(0x0F); opcodeEncoder.Append8Bits(0x28); opcodeEncoder.Append2Bits(0b11); opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); opcodeEncoder.Append3Bits(node.Operand2.Register.RegisterCode); }
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.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"); }
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) { opcodeEncoder.Append8Bits(0xEF); return; } if (node.Operand1.IsConstant) { opcodeEncoder.Append8Bits(0xE7); opcodeEncoder.Append8BitImmediate(node.Operand1); 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 == 0); opcodeEncoder.Append8Bits(0x0F); opcodeEncoder.Append4Bits(0b1001); opcodeEncoder.Append4Bits(GetConditionCode(node.ConditionCode)); opcodeEncoder.Append2Bits(0b11); opcodeEncoder.Append3Bits(0b000); opcodeEncoder.Append3Bits(node.Result.Register.RegisterCode); }
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); }
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"); }
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"); }