mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-30 12:50:19 +00:00
[-] some unnecessary overloads [+] overloaded operators in order to allow defining memory operands easily [+] overloaded automatic conversions to allow operands [+] Labels support [+] code generator based on F# started
74 lines
1.7 KiB
C#
74 lines
1.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.IO;
|
|
using System.Diagnostics;
|
|
|
|
namespace Lost.JIT.AMD64
|
|
{
|
|
public sealed class Push : ProcessorInstruction
|
|
{
|
|
public Push(InstructionOperand source)
|
|
{
|
|
Source = source;
|
|
}
|
|
|
|
public InstructionOperand Source
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
|
|
public override int? Size
|
|
{
|
|
get { throw new NotImplementedException(); }
|
|
}
|
|
|
|
public override void Compile(Stream destStream)
|
|
{
|
|
if (Source is MemoryOperand)
|
|
{
|
|
var dest = Source as MemoryOperand;
|
|
Rex rex = NeedsRex(dest);
|
|
if (rex != Rex.None) destStream.WriteByte((byte)rex);
|
|
destStream.WriteByte(0xFF);
|
|
WriteOperand(6, dest, destStream);
|
|
return;
|
|
}
|
|
|
|
if (Source is GeneralPurposeRegister)
|
|
{
|
|
var dest = Source as GeneralPurposeRegister;
|
|
if (dest.Size != 8) throw new NotSupportedException();
|
|
if (dest.Register.IsNew()) destStream.WriteByte((byte)Rex.NewRegOpcode);
|
|
destStream.WriteByte(0x50 + dest.Register.GetIndex());
|
|
return;
|
|
//destStream.WriteByte(ModRM(0, dest.Register, Registers.None));
|
|
}
|
|
|
|
if (Source is ImmediateOperand)
|
|
{
|
|
var source = Source as ImmediateOperand;
|
|
if (source.Value.FitsInByte())
|
|
{
|
|
destStream.WriteByte(0x6A);
|
|
destStream.WriteByte(source.Value);
|
|
} else
|
|
{
|
|
destStream.WriteByte(0x68);
|
|
destStream.WriteInt(source.Value);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override string OpCodeFASM
|
|
{
|
|
get { return "push"; }
|
|
}
|
|
public override string ToFASM()
|
|
{
|
|
return string.Format(Source is MemoryOperand ? "push qword {0}" : "push {0}", Source);
|
|
}
|
|
}
|
|
}
|