Cosmos/source2/Compiler/Cosmos.Compiler.Assembler.X86/_Infra/Extensions.cs

98 lines
No EOL
4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Cosmos.Compiler.Assembler.X86 {
public static class InfraExtensions {
public static string GetDestinationAsString(this IInstructionWithDestination aThis) {
string xDest = "";
if((aThis.DestinationValue.HasValue ||aThis.DestinationRef != null) &&
aThis.DestinationIsIndirect &&
aThis.DestinationReg!=null) {
throw new Exception("[Scale*index+base] style addressing not supported at the moment");
}
if (aThis.DestinationRef != null) {
xDest = aThis.DestinationRef.ToString();
} else {
if (aThis.DestinationReg != null) {
xDest = Registers.GetRegisterName(aThis.DestinationReg.Value);
} else {
if (aThis.DestinationValue.HasValue)
xDest = "0x" + aThis.DestinationValue.GetValueOrDefault().ToString("X").ToUpperInvariant();
}
}
if (aThis.DestinationDisplacement != 0) {
if (aThis.DestinationDisplacement > 255) {
xDest += " + 0x" + aThis.DestinationDisplacement.ToString("X");
}else {
xDest += " + " + aThis.DestinationDisplacement;
}
}
if (aThis.DestinationIsIndirect) {
return String.Intern("[" + xDest + "]");
} else {
return String.Intern(xDest);
}
}
public static void DetermineSize(this IInstructionWithDestination aThis, IInstructionWithSize aThis2, byte aSize) {
if (aSize == 0) {
if (aThis.DestinationReg != null && !aThis.DestinationIsIndirect) {
if (Registers.Is16Bit(aThis.DestinationReg.Value)) {
aThis2.Size = 16;
} else {
if (Registers.Is32Bit(aThis.DestinationReg.Value)) {
aThis2.Size = 32;
} else {
aThis2.Size = 8;
}
}
return;
}
if (aThis.DestinationRef != null && !aThis.DestinationIsIndirect) {
aThis2.Size = 32;
return;
}
}
}
public static string GetMnemonic(this ConditionalTestEnum aThis) {
switch (aThis) {
case ConditionalTestEnum.Overflow:
return "o";
case ConditionalTestEnum.NoOverflow:
return "no";
case ConditionalTestEnum.Below:
return "b";
case ConditionalTestEnum.NotBelow:
return "nb";
case ConditionalTestEnum.Equal:
return "e";
case ConditionalTestEnum.NotEqual:
return "ne";
case ConditionalTestEnum.BelowOrEqual:
return "be";
case ConditionalTestEnum.NotBelowOrEqual:
return "nbe";
case ConditionalTestEnum.Sign:
return "s";
case ConditionalTestEnum.NotSign:
return "ns";
case ConditionalTestEnum.Parity:
return "p";
case ConditionalTestEnum.NotParity:
return "np";
case ConditionalTestEnum.LessThan:
return "l";
case ConditionalTestEnum.NotLessThan:
return "nl";
case ConditionalTestEnum.LessThanOrEqualTo:
return "le";
case ConditionalTestEnum.NotLessThanOrEqualTo:
return "nle";
default: throw new NotImplementedException();
}
}
}
}