Working on improving ISA Linker.

This commit is contained in:
2025-07-21 01:47:31 +08:00
parent b164fc1798
commit 49d6d463bd
11 changed files with 228 additions and 24 deletions

View File

@@ -115,7 +115,7 @@ LabelConstant InternalLbl
{ {
return operationResult; return operationResult;
} }
if (!ISA.InstructionDefinitions.TryGetValue(LexDef.LexMatchedItemId, out var instructionDef)) if (!ISA.InstructionDefinitionAliases.TryGetValue(LexDef.LexMatchedItemId, out var instructionDef))
{ {
return operationResult; return operationResult;
} }

View File

@@ -1,21 +1,72 @@
using SVM.Core; using SVM.Core;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace SVM.Assembler.Core namespace SVM.Assembler.Core
{ {
[Serializable]
public class ISADefinition public class ISADefinition
{ {
public Dictionary<string, InstructionDefinition> InstructionDefinitions = new Dictionary<string, InstructionDefinition>(); public Dictionary<PrimaryInstruction, InstructionDefinition> InstructionDefinitions = new Dictionary<PrimaryInstruction, InstructionDefinition>();
public Dictionary<PrimaryInstruction, LinkerFunction> LinkerFunctions = new Dictionary<PrimaryInstruction, LinkerFunction>(); [NonSerialized]
public Dictionary<string, InstructionDefinition> InstructionDefinitionAliases = new Dictionary<string, InstructionDefinition>();
public void Init() public void Init()
{ {
foreach (var item in InstructionDefinitions) foreach (var item in InstructionDefinitions)
{ {
if (!LinkerFunctions.TryAdd(item.Value.PrimaryInstruction, item.Value.linkerFunction)) foreach (var alias in item.Value.aliases)
{ {
LinkerFunctions[item.Value.PrimaryInstruction] = item.Value.linkerFunction; if (!InstructionDefinitionAliases.TryAdd(alias, item.Value))
{
InstructionDefinitionAliases[alias] = item.Value;
}
} }
} }
} }
static void PrintDepth(int depth)
{
for (int i = 0; i < depth; i++)
{
Console.Write("\t");
}
}
static void ShowNode(XmlNode node, int depth = 0)
{
PrintDepth(depth);
Console.WriteLine($"[+]{node.NodeType}:{node.Name}");
foreach (XmlAttribute item in node.Attributes)
{
PrintDepth(depth + 1);
Console.WriteLine($"[i]{item.NodeType}:{item.Name}={item.InnerText}");
}
foreach (XmlElement item in node.ChildNodes)
{
if (item is XmlNode cnode)
{
ShowNode(cnode, depth + 1);
}
else
{
PrintDepth(depth + 1);
Console.Write($"[?]{item.NodeType}:{item.Name}");
}
}
}
public static bool TryParse(Stream inputStream, [MaybeNullWhen(false)] out ISADefinition definition)
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(inputStream);
foreach (XmlNode item in xmlDocument.ChildNodes)
{
ShowNode(item, 0);
}
definition = null;
return false;
}
} }
} }

View File

@@ -7,15 +7,8 @@ namespace SVM.Assembler.Core
[Serializable] [Serializable]
public class InstructionDefinition public class InstructionDefinition
{ {
public string MatchID; public PrimaryInstruction PrimaryInstruction = PrimaryInstruction.Nop;
public PrimaryInstruction PrimaryInstruction; public List<string> aliases = new List<string>();
public LinkerFunction linkerFunction;
public InstructionDefinition(string matchID, LinkerFunction assemblerFunction)
{
MatchID = matchID;
this.linkerFunction = assemblerFunction;
}
public List<InstructionParameter> ParameterPattern = new List<InstructionParameter>(); public List<InstructionParameter> ParameterPattern = new List<InstructionParameter>();
} }
} }

View File

@@ -1,9 +1,20 @@
using System.Collections.Generic; using SVM.Core;
using System;
using System.Collections.Generic;
namespace SVM.Assembler.Core namespace SVM.Assembler.Core
{ {
[Serializable]
public class InstructionParameter public class InstructionParameter
{ {
public List<string> AllowedTokenIds = new List<string>(); public List<string> AllowedTokenIds = new List<string>();
public ExpectdValue ExpectdValue = new ExpectdValue();
}
[Serializable]
public class ExpectdValue
{
public SVMNativeTypes Type;
public int Pos;
public string Converter = "";
} }
} }

View File

@@ -37,6 +37,12 @@ namespace SVM.Assembler.Core
} }
return operationResult; return operationResult;
} }
public static OperationResult<SVMInstruction> translate(InstructionDefinition def, LinkingContext context, IntermediateInstruction iinstruction)
{
OperationResult<SVMInstruction> result = new OperationResult<SVMInstruction>();
return result;
}
public unsafe static OperationResult<ManagedSVMProgram?> Finialize(ISADefinition definition, IntermediateObject Obj) public unsafe static OperationResult<ManagedSVMProgram?> Finialize(ISADefinition definition, IntermediateObject Obj)
{ {
OperationResult<ManagedSVMProgram?> operationResult = new OperationResult<ManagedSVMProgram?>(null); OperationResult<ManagedSVMProgram?> operationResult = new OperationResult<ManagedSVMProgram?>(null);
@@ -60,9 +66,10 @@ namespace SVM.Assembler.Core
} }
foreach (var item in Obj.instructions) foreach (var item in Obj.instructions)
{ {
if (definition.LinkerFunctions.TryGetValue(item.inst, out var func)) if (definition.InstructionDefinitions.TryGetValue(item.inst, out var def))
{ {
var inst = func(context, item);
var inst = translate(def, context, item);
if (operationResult.CheckAndInheritErrorAndWarnings(inst)) if (operationResult.CheckAndInheritErrorAndWarnings(inst))
{ {
return operationResult; return operationResult;

46
src/SVM.Assembler/ISA.xml Normal file
View File

@@ -0,0 +1,46 @@
<ISARoot>
<Enums>
</Enums>
<InstructionDefinition PrimaryInstruction="BMath">
<aliases>
<alias name="bmath"/>
<alias name="b.math"/>
<alias name="math.b"/>
</aliases>
<Parameters>
<InstructionParameter>
<AllowedIds>
<Text content="String"/>
</AllowedIds>
<ExpectedValue Type="Byte" Pos="1" Converter="InternalEnum:bOp" />
</InstructionParameter>
<InstructionParameter>
<AllowedIds>
<Text content="String"/>
</AllowedIds>
<ExpectedValue Type="Byte" Pos="2" Converter="InternalEnum:NativeType" />
</InstructionParameter>
<InstructionParameter>
<AllowedIds>
<Text content="String"/>
<Text content="Register"/>
</AllowedIds>
<ExpectedValue Type="Byte" Pos="3" Converter="Register" />
</InstructionParameter>
<InstructionParameter>
<AllowedIds>
<Text content="String"/>
<Text content="Register"/>
</AllowedIds>
<ExpectedValue Type="Byte" Pos="4" Converter="Register" />
</InstructionParameter>
<InstructionParameter>
<AllowedIds>
<Text content="String"/>
<Text content="Register"/>
</AllowedIds>
<ExpectedValue Type="Byte" Pos="5" Converter="Register" />
</InstructionParameter>
</Parameters>
</InstructionDefinition>
</ISARoot>

View File

@@ -0,0 +1,25 @@
using SVM.Assembler.Core;
using System.Reflection;
using System.Runtime.Serialization;
using System.Xml.Serialization;
namespace SVM.Assembler
{
internal class Program
{
static void Main(string[] args)
{
var fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("SVM.Assembler.ISA.xml");
if (fs is null)
{
Console.WriteLine("Cannot find ISA definition!");
return;
}
if(!ISADefinition.TryParse(fs, out var def))
{
Console.WriteLine("Cannot load ISA definition!");
return;
}
}
}
}

View File

@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PublishAot>true</PublishAot>
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
<ItemGroup>
<None Remove="ISA.xml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SVM.Assembler.Core\SVM.Assembler.Core.csproj" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="ISA.xml" />
</ItemGroup>
</Project>

View File

@@ -2,9 +2,14 @@
{ {
public enum PrimaryInstruction : byte public enum PrimaryInstruction : byte
{ {
// 0 1 2 3 4 5 6 Nop,
// Math [I]Op [I]Type [R]L [R]R [R]T [I]CheckOF // 0 1 2 3 4 5
// Math [I]Op [I]Type [R]L [R]R [R]T
BMath, BMath,
/// <summary>
/// Checked Binary Math
/// </summary>
CBMath,
// 0 1 2 3 4 // 0 1 2 3 4
// Math [I]Op [I]Type [R]L [R]T // Math [I]Op [I]Type [R]L [R]T
UMath, UMath,

View File

@@ -79,20 +79,48 @@ namespace SVM.Core
var L = Instruction.GetData<byte>(3); var L = Instruction.GetData<byte>(3);
var R = Instruction.GetData<byte>(4); var R = Instruction.GetData<byte>(4);
var T = Instruction.GetData<byte>(5); var T = Instruction.GetData<byte>(5);
var Of = Instruction.GetData<byte>(6);
switch (Op) switch (Op)
{ {
case BMathOp.Add: case BMathOp.Add:
MathImpl.MathAdd(registers, statePtr, NativeType, L, R, T, Of == 1); MathImpl.MathAdd(registers, statePtr, NativeType, L, R, T, false);
break; break;
case BMathOp.Sub: case BMathOp.Sub:
MathImpl.MathSub(registers, statePtr, NativeType, L, R, T, Of == 1); MathImpl.MathSub(registers, statePtr, NativeType, L, R, T, false);
break; break;
case BMathOp.Mul: case BMathOp.Mul:
MathImpl.MathMul(registers, statePtr, NativeType, L, R, T, Of == 1); MathImpl.MathMul(registers, statePtr, NativeType, L, R, T, false);
break; break;
case BMathOp.Div: case BMathOp.Div:
MathImpl.MathDiv(registers, statePtr, NativeType, L, R, T, Of == 1); MathImpl.MathDiv(registers, statePtr, NativeType, L, R, T, false);
break;
case BMathOp.Mod:
MathImpl.MathMod(registers, statePtr, NativeType, L, R, T);
break;
default:
break;
}
}
break;
case PrimaryInstruction.CBMath:
{
var Op = Instruction.GetData<BMathOp>(1);
var NativeType = Instruction.GetData<SVMNativeTypes>(2);
var L = Instruction.GetData<byte>(3);
var R = Instruction.GetData<byte>(4);
var T = Instruction.GetData<byte>(5);
switch (Op)
{
case BMathOp.Add:
MathImpl.MathAdd(registers, statePtr, NativeType, L, R, T, true);
break;
case BMathOp.Sub:
MathImpl.MathSub(registers, statePtr, NativeType, L, R, T, true);
break;
case BMathOp.Mul:
MathImpl.MathMul(registers, statePtr, NativeType, L, R, T, true);
break;
case BMathOp.Div:
MathImpl.MathDiv(registers, statePtr, NativeType, L, R, T, true);
break; break;
case BMathOp.Mod: case BMathOp.Mod:
MathImpl.MathMod(registers, statePtr, NativeType, L, R, T); MathImpl.MathMod(registers, statePtr, NativeType, L, R, T);

View File

@@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SVM.Standalone", "SVM.Stand
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SVM.Assembler.Core", "SVM.Assembler.Core\SVM.Assembler.Core.csproj", "{B51D33D7-920B-44DE-8EB8-F8E8DFAE4CA8}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SVM.Assembler.Core", "SVM.Assembler.Core\SVM.Assembler.Core.csproj", "{B51D33D7-920B-44DE-8EB8-F8E8DFAE4CA8}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SVM.Assembler", "SVM.Assembler\SVM.Assembler.csproj", "{E2B82455-3947-4C11-82D0-178E8D8C3D64}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@@ -55,6 +57,18 @@ Global
{B51D33D7-920B-44DE-8EB8-F8E8DFAE4CA8}.Release|x64.Build.0 = Release|Any CPU {B51D33D7-920B-44DE-8EB8-F8E8DFAE4CA8}.Release|x64.Build.0 = Release|Any CPU
{B51D33D7-920B-44DE-8EB8-F8E8DFAE4CA8}.Release|x86.ActiveCfg = Release|Any CPU {B51D33D7-920B-44DE-8EB8-F8E8DFAE4CA8}.Release|x86.ActiveCfg = Release|Any CPU
{B51D33D7-920B-44DE-8EB8-F8E8DFAE4CA8}.Release|x86.Build.0 = Release|Any CPU {B51D33D7-920B-44DE-8EB8-F8E8DFAE4CA8}.Release|x86.Build.0 = Release|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Debug|x64.ActiveCfg = Debug|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Debug|x64.Build.0 = Debug|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Debug|x86.ActiveCfg = Debug|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Debug|x86.Build.0 = Debug|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Release|Any CPU.Build.0 = Release|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Release|x64.ActiveCfg = Release|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Release|x64.Build.0 = Release|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Release|x86.ActiveCfg = Release|Any CPU
{E2B82455-3947-4C11-82D0-178E8D8C3D64}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE