diff --git a/ERACompiler/ERACompiler/ERACompiler.xml b/ERACompiler/ERACompiler/ERACompiler.xml
index ee12a64..4a5d9dc 100644
--- a/ERACompiler/ERACompiler/ERACompiler.xml
+++ b/ERACompiler/ERACompiler/ERACompiler.xml
@@ -29,6 +29,13 @@
A source code from a file.
Generated string of assembly commands.
+
+
+ Simple DFS to convert the CodeNode tree to the flat linked list of bytes
+
+
+
+
Represents a level of compilation.
@@ -52,6 +59,34 @@
AAST root node
Corresponding binary code in byte array
+
+
+ Marks given register as "occupied", so that, for example, GetFreeRegisterNode() does not consider this register until it is free.
+
+ The number of a register to be occupied.
+
+
+
+ Frees a given register.
+
+ The number of a register to be freed.
+
+
+
+ Returns a byte representing the register number.
+
+ A string formatted in the following way: "r0", "r25", "pc", "sb", etc.
+ The number of a register represented in a string.
+
+
+
+ Converts given list of bytes to the string (JSON) representation which is ERA assembly language apparently.
+
+ The list of bytes to be converted.
+ Command address parameter. Used for marking an asm command with its address within the binary file.
+ Tabulation parameter. Used for fancy JSON output.
+ A string formatted in JSON representing asm commands in ERA assembly language.
+
Contains functionality for conversion of source code of the program to the list of tokens.
@@ -91,6 +126,51 @@
A string for checking.
Whether or not there is a match.
+
+
+ Performs all semantics checks and prepares AST to be transfered to the Generator.
+ Contains some necessary static methods used in node annotators.
+
+
+
+
+ Initializes all node annotators
+
+
+
+
+ Builds annotated AST which is basically reduced AST with some changes and additional information
+ that is needed for the Generator
+
+ The root node of the AST from SyntaxAnalyzer
+ The root node of the annotated AST
+
+
+
+ Identifies a variable type given a type AST node.
+
+ Type AST node
+ Is type constant or not.
+ A new VarType object identified from a given AST Type node.
+
+
+
+ DFS that identifies all used variables (in fact, identifiers) starting from a given AAST node.
+
+ An AAST root node from where DFS starts.
+ A set of unique variables (identifiers) that are appearing down the AAST tree.
+
+
+
+ Evaluates the maximum depth of a Block Bodies down the AAST tree. Maximum depth in this sense is the maximum number of children that can have
+ some Block Body down the AAST tree starting from a given AAST node. It is used when calculating the Live Interval end for, for example, 'for' loop
+ iterators (know as 'i' usually). Some inner Block Bodies may have more Statements inside them, than the 'for' loop Block Body, so we do not
+ want the Register Allocation algorithm to deallocate our 'i' iterator before we reach the end of the most outer (or 'for') Block Body.
+ Therefore, we use this DFS that tells us the number of children of a Block Body with maximum number of children (Statements basically).
+
+
+
+
Used for current context retrieval
@@ -98,6 +178,13 @@
Parent (or current) node from which to start the search
Nearest context (may return global Program context)
+
+
+ Retrieves all parameter types from a given Parameters AST node.
+
+ A Paramters AST node.
+ A list of VarType objects representing types of the routine parameters.
+
Performs additional checks after the AAST is constructed.
@@ -129,6 +216,14 @@
Current context
True if constant, false otherwise
+
+
+ Checks whether an operand is constant or not.
+
+ And operand AST node
+ The current context the node belongs to.
+ True if operand is constant, false otherwise.
+
The purpose of this class it to check the code for syntax errors and build Abstract Syntax Tree that can be used by Semantic Analyzer.
diff --git a/ERACompiler/ERACompiler/Modules/Compiler.cs b/ERACompiler/ERACompiler/Modules/Compiler.cs
index ac790be..98e3ed3 100644
--- a/ERACompiler/ERACompiler/Modules/Compiler.cs
+++ b/ERACompiler/ERACompiler/Modules/Compiler.cs
@@ -109,6 +109,11 @@ public byte[] Compile(string sourceCode)
return Compile(sourceCode, CompilationMode.GENERATION);
}
+ ///
+ /// Simple DFS to convert the CodeNode tree to the flat linked list of bytes
+ ///
+ ///
+ ///
private LinkedList CollectBytes(CodeNode cn)
{
if (cn.IsLeaf())
diff --git a/ERACompiler/ERACompiler/Modules/Generator.cs b/ERACompiler/ERACompiler/Modules/Generator.cs
index 19b0807..903987d 100644
--- a/ERACompiler/ERACompiler/Modules/Generator.cs
+++ b/ERACompiler/ERACompiler/Modules/Generator.cs
@@ -73,19 +73,32 @@ public static CodeNode GetProgramCodeNodeRoot(AASTNode root)
Helper functions
*/
+ ///
+ /// Marks given register as "occupied", so that, for example, GetFreeRegisterNode() does not consider this register until it is free.
+ ///
+ /// The number of a register to be occupied.
public void OccupateReg(byte regNum)
{
regOccup[regNum] = true;
}
+ ///
+ /// Frees a given register.
+ ///
+ /// The number of a register to be freed.
public void FreeReg(byte regNum)
{
// If register is allocated to a variable - do not free it
// It will be swapped if needed when calling GetFreeReg()
- if (!regAllocRTV.ContainsKey(regNum))
+ if (!regAllocRTV.ContainsKey(regNum) && regNum < regOccup.Length)
regOccup[regNum] = false;
}
+ ///
+ /// Returns a byte representing the register number.
+ ///
+ /// A string formatted in the following way: "r0", "r25", "pc", "sb", etc.
+ /// The number of a register represented in a string.
public static byte IdentifyRegister(string reg)
{
if (reg[0] == 'r')
@@ -103,15 +116,22 @@ public static byte IdentifyRegister(string reg)
{
return reg switch
{
- "pc" => 0xFF,
- "sb" => 0xFE,
- "sp" => 0xFD,
- "fp" => 0xFC,
- _ => 0x00,
+ "pc" => 0x0000001F,
+ "sb" => 0x0000001E,
+ "sp" => 0x0000001D,
+ "fp" => 0x0000001C,
+ _ => 0x00000000,
};
}
}
+ ///
+ /// Converts given list of bytes to the string (JSON) representation which is ERA assembly language apparently.
+ ///
+ /// The list of bytes to be converted.
+ /// Command address parameter. Used for marking an asm command with its address within the binary file.
+ /// Tabulation parameter. Used for fancy JSON output.
+ /// A string formatted in JSON representing asm commands in ERA assembly language.
public static string ConvertToAssemblyCode(LinkedList bincode, int offset, int padding = 0)
{
int i = -1;
diff --git a/ERACompiler/ERACompiler/Modules/SemanticAnalyzer.cs b/ERACompiler/ERACompiler/Modules/SemanticAnalyzer.cs
index c4eeab5..41f79f2 100644
--- a/ERACompiler/ERACompiler/Modules/SemanticAnalyzer.cs
+++ b/ERACompiler/ERACompiler/Modules/SemanticAnalyzer.cs
@@ -6,12 +6,19 @@
namespace ERACompiler.Modules
{
+ ///
+ /// Performs all semantics checks and prepares AST to be transfered to the Generator.
+ /// Contains some necessary static methods used in node annotators.
+ ///
public class SemanticAnalyzer
{
public static readonly VarType no_type = new VarType(VarType.ERAType.NO_TYPE); // Placeholder
- public readonly Dictionary nodeAnnotators;
+ public readonly Dictionary nodeAnnotators; // All the AST annotators
public AASTNode varToAddToCtx = null; // For "for" loops
+ ///
+ /// Initializes all node annotators
+ ///
public SemanticAnalyzer()
{
nodeAnnotators = new Dictionary
@@ -70,6 +77,12 @@ public SemanticAnalyzer()
};
}
+ ///
+ /// Builds annotated AST which is basically reduced AST with some changes and additional information
+ /// that is needed for the Generator
+ ///
+ /// The root node of the AST from SyntaxAnalyzer
+ /// The root node of the annotated AST
public AASTNode BuildAAST(ASTNode ASTRoot)
{
AASTNode program = nodeAnnotators[ASTRoot.ASTType].Annotate(ASTRoot, null);
@@ -87,6 +100,12 @@ public AASTNode BuildAAST(ASTNode ASTRoot)
return program;
}
+ ///
+ /// Identifies a variable type given a type AST node.
+ ///
+ /// Type AST node
+ /// Is type constant or not.
+ /// A new VarType object identified from a given AST Type node.
public static VarType IdentifyType(ASTNode node, bool isConst = false)
{
VarType vt;
@@ -147,6 +166,11 @@ public static VarType IdentifyType(ASTNode node, bool isConst = false)
return vt;
}
+ ///
+ /// DFS that identifies all used variables (in fact, identifiers) starting from a given AAST node.
+ ///
+ /// An AAST root node from where DFS starts.
+ /// A set of unique variables (identifiers) that are appearing down the AAST tree.
public static HashSet GetAllUsedVars(AASTNode node)
{
HashSet set = new HashSet();
@@ -159,6 +183,15 @@ public static HashSet GetAllUsedVars(AASTNode node)
return set;
}
+ ///
+ /// Evaluates the maximum depth of a Block Bodies down the AAST tree. Maximum depth in this sense is the maximum number of children that can have
+ /// some Block Body down the AAST tree starting from a given AAST node. It is used when calculating the Live Interval end for, for example, 'for' loop
+ /// iterators (know as 'i' usually). Some inner Block Bodies may have more Statements inside them, than the 'for' loop Block Body, so we do not
+ /// want the Register Allocation algorithm to deallocate our 'i' iterator before we reach the end of the most outer (or 'for') Block Body.
+ /// Therefore, we use this DFS that tells us the number of children of a Block Body with maximum number of children (Statements basically).
+ ///
+ ///
+ ///
public static int GetMaxDepth(AASTNode node)
{
int maxDepth = 1;
@@ -192,6 +225,11 @@ public static int GetMaxDepth(AASTNode node)
return null;
}
+ ///
+ /// Retrieves all parameter types from a given Parameters AST node.
+ ///
+ /// A Paramters AST node.
+ /// A list of VarType objects representing types of the routine parameters.
public static List RetrieveParamTypes(ASTNode node)
{
List lst = new List
@@ -755,6 +793,12 @@ public static bool IsExprConstant(ASTNode node, Context ctx)
return true;
}
+ ///
+ /// Checks whether an operand is constant or not.
+ ///
+ /// And operand AST node
+ /// The current context the node belongs to.
+ /// True if operand is constant, false otherwise.
public static bool IsOperandConstant(ASTNode node, Context ctx)
{
string type = node.Children[0].ASTType; // The child of Operand
diff --git a/ERACompiler/ERACompilerUnitTests/compiled_example_asm.bin b/ERACompiler/ERACompilerUnitTests/compiled_example_asm.bin
new file mode 100644
index 0000000..753e6ea
--- /dev/null
+++ b/ERACompiler/ERACompilerUnitTests/compiled_example_asm.bin
@@ -0,0 +1,10487 @@
+{
+ "name": "Program",
+ "token": "code",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Version/padding/tech bytes",
+ "token": "no_token",
+ "bytes": [
+ "00",
+ "01",
+ "00",
+ "00",
+ "00",
+ "12",
+ "00",
+ "00",
+ "00",
+ "1E",
+ "00",
+ "00",
+ "00",
+ "4E",
+ "00",
+ "00",
+ "07",
+ "A9"
+ ],
+ "children": []
+ },
+ {
+ "name": "Static bytes",
+ "token": "no_token",
+ "bytes": [
+ "01",
+ "00",
+ "00",
+ "00",
+ "00",
+ "00",
+ "00",
+ "00",
+ "00",
+ "00",
+ "00",
+ "03",
+ "00",
+ "00",
+ "00",
+ "01",
+ "00",
+ "00",
+ "00",
+ "04",
+ "00",
+ "00",
+ "00",
+ "01",
+ "00",
+ "00",
+ "00",
+ "05",
+ "00",
+ "00",
+ "00",
+ "09",
+ "00",
+ "00",
+ "00",
+ "02",
+ "00",
+ "00",
+ "00",
+ "06",
+ "00",
+ "00",
+ "00",
+ "05",
+ "00",
+ "00",
+ "00",
+ "03",
+ "00",
+ "00",
+ "00",
+ "05",
+ "00",
+ "00",
+ "00",
+ "00",
+ "00",
+ "00",
+ "00",
+ "00"
+ ],
+ "children": []
+ },
+ {
+ "name": "Units' addresses node",
+ "token": "no_token",
+ "bytes": [
+ "{00060} [f08] SB := SB + const",
+ "{00062} [f32] 0000 0004",
+ "{00066} [f08] R27 := SB + const",
+ "{00068} [f32] 0000 0000",
+ "{00072} [f32] R26 := 0",
+ "{00074} [f08] R26 := R26 + const",
+ "{00076} [f32] 0000 007C",
+ "{00080} [f32] ->R27 := R26",
+ "{00082} [f08] R27 := SB + const",
+ "{00084} [f32] 0000 0030",
+ "{00088} [f32] R26 := 0",
+ "{00090} [f08] R26 := R26 + const",
+ "{00092} [f32] 0000 0F02",
+ "{00096} [f32] ->R27 := R26",
+ "{00098} [f08] R27 := SB + const",
+ "{000100} [f32] 0000 0034",
+ "{000104} [f32] R26 := 0",
+ "{000106} [f08] R26 := R26 + const",
+ "{000108} [f32] 0000 0F30",
+ "{000112} [f32] ->R27 := R26",
+ "{000114} [f08] R27 := SB + const",
+ "{000116} [f32] 0000 0000",
+ "{000120} [f32] R27 := ->R27",
+ "{000122} [f32] if R27 goto R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Actual program code",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Code",
+ "token": "code",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Copy SP to FP",
+ "token": "no_token",
+ "bytes": [
+ "{000124} [f32] FP := SP"
+ ],
+ "children": []
+ },
+ {
+ "name": "Stack allocation",
+ "token": "no_token",
+ "bytes": [
+ "{000126} [f08] SP := SP + const",
+ "{000128} [f32] 0000 00F6"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'var1' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000132} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000134} [f08] R27 := R27 + const",
+ "{000136} [f32] 0000 0000",
+ "{000140} [f32] R0 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "var1",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'var2' into R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000142} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000144} [f08] R27 := R27 + const",
+ "{000146} [f32] 0000 0002",
+ "{000150} [f32] R1 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "load var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000152} [f32] R2 := 0",
+ "{000154} [f08] R2 := R2 + const",
+ "{000156} [f32] 0000 FFFF",
+ "{000160} [f32] R1 &= R2"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Load variable 'var3' into R2",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000162} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000164} [f08] R27 := R27 + const",
+ "{000166} [f32] 0000 0004",
+ "{000170} [f32] R2 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "load var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000172} [f32] R3 := 0",
+ "{000174} [f08] R3 := R3 + const",
+ "{000176} [f32] 0000 FFFF",
+ "{000180} [f32] R2 &= R3"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "short",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "short",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "var2",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Variable definition",
+ "token": "var3",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'var4' into R3",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000182} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000184} [f08] R27 := R27 + const",
+ "{000186} [f32] 0000 0005",
+ "{000190} [f32] R3 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "load var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000192} [f32] R4 := 0",
+ "{000194} [f08] R4 := R4 + const",
+ "{000196} [f32] 0000 00FF",
+ "{000200} [f32] R3 &= R4"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Load variable 'var5' into R4",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000202} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000204} [f08] R27 := R27 + const",
+ "{000206} [f32] 0000 0006",
+ "{000210} [f32] R4 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "load var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000212} [f32] R5 := 0",
+ "{000214} [f08] R5 := R5 + const",
+ "{000216} [f32] 0000 00FF",
+ "{000220} [f32] R4 &= R5"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "var4",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{000222} [f32] R5 := 0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "VarDef MOV",
+ "token": "no_token",
+ "bytes": [
+ "{000224} [f32] R3 := R5"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'var4' from R5",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000226} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000228} [f08] R27 := R27 + const",
+ "{000230} [f32] 0000 0005"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000234} [f32] R6 := ->R27",
+ "{000236} [f32] R7 := 0",
+ "{000238} [f08] R7 := R7 + const",
+ "{000240} [f32] FFFF FF00",
+ "{000244} [f32] R6 &= R7",
+ "{000246} [f32] R7 := 0",
+ "{000248} [f08] R7 := R7 + const",
+ "{000250} [f32] 0000 00FF",
+ "{000254} [f32] R5 &= R7",
+ "{000256} [f32] R5 |= R6"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000258} [f32] ->R27 := R5"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Variable definition",
+ "token": "var5",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "6",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "6",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{000260} [f32] R5 := 6"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "VarDef MOV",
+ "token": "no_token",
+ "bytes": [
+ "{000262} [f32] R4 := R5"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'var5' from R5",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000264} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000266} [f08] R27 := R27 + const",
+ "{000268} [f32] 0000 0006"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000272} [f32] R6 := ->R27",
+ "{000274} [f32] R7 := 0",
+ "{000276} [f08] R7 := R7 + const",
+ "{000278} [f32] FFFF FF00",
+ "{000282} [f32] R6 &= R7",
+ "{000284} [f32] R7 := 0",
+ "{000286} [f08] R7 := R7 + const",
+ "{000288} [f32] 0000 00FF",
+ "{000292} [f32] R5 &= R7",
+ "{000294} [f32] R5 |= R6"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000296} [f32] ->R27 := R5"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "var4",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "var4",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDA constant",
+ "token": "no_token",
+ "bytes": [
+ "{000298} [f32] R5 := 0",
+ "{000300} [f08] R5 := R5 + const",
+ "{000302} [f32] FFFF FFCE"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Primary",
+ "token": "var4",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Assignment mov",
+ "token": "no_token",
+ "bytes": [
+ "{000306} [f32] R3 := R5"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'var4' from R5",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000308} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000310} [f08] R27 := R27 + const",
+ "{000312} [f32] 0000 0005"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000316} [f32] R6 := ->R27",
+ "{000318} [f32] R7 := 0",
+ "{000320} [f08] R7 := R7 + const",
+ "{000322} [f32] FFFF FF00",
+ "{000326} [f32] R6 &= R7",
+ "{000328} [f32] R7 := 0",
+ "{000330} [f08] R7 := R7 + const",
+ "{000332} [f32] 0000 00FF",
+ "{000336} [f32] R5 &= R7",
+ "{000338} [f32] R5 |= R6"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000340} [f32] ->R27 := R5"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'ptr1' into R5",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000342} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000344} [f08] R27 := R27 + const",
+ "{000346} [f32] 0000 000A",
+ "{000350} [f32] R5 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "ptr1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "<-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Reference",
+ "token": "<-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load variable address 'var1' into R6",
+ "token": "no_token",
+ "bytes": [
+ "{000352} [f32] R27 := FP",
+ "{000354} [f08] R27 := R27 + const",
+ "{000356} [f32] 0000 0000",
+ "{000360} [f32] R6 := R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "VarDef MOV",
+ "token": "no_token",
+ "bytes": [
+ "{000362} [f32] R5 := R6"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'ptr1' from R6",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000364} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000366} [f08] R27 := R27 + const",
+ "{000368} [f32] 0000 000A"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000372} [f32] ->R27 := R6"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'ptr1' from R5",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000374} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000376} [f08] R27 := R27 + const",
+ "{000378} [f32] 0000 000A"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000382} [f32] ->R27 := R5"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'ptr2' into R5",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000384} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000386} [f08] R27 := R27 + const",
+ "{000388} [f32] 0000 000E",
+ "{000392} [f32] R5 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "short",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "short",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "ptr2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "<-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Reference",
+ "token": "<-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load variable address 'var2' into R6",
+ "token": "no_token",
+ "bytes": [
+ "{000394} [f32] R27 := FP",
+ "{000396} [f08] R27 := R27 + const",
+ "{000398} [f32] 0000 0004",
+ "{000402} [f32] R6 := R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "VarDef MOV",
+ "token": "no_token",
+ "bytes": [
+ "{000404} [f32] R5 := R6"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'ptr2' from R6",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000406} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000408} [f08] R27 := R27 + const",
+ "{000410} [f32] 0000 000E"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000414} [f32] ->R27 := R6"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'ptr2' from R5",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000416} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000418} [f08] R27 := R27 + const",
+ "{000420} [f32] 0000 000E"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000424} [f32] ->R27 := R5"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'ptr3' into R5",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000426} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000428} [f08] R27 := R27 + const",
+ "{000430} [f32] 0000 0012",
+ "{000434} [f32] R5 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "ptr3",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "<-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Reference",
+ "token": "<-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load variable address 'var4' into R6",
+ "token": "no_token",
+ "bytes": [
+ "{000436} [f32] R27 := FP",
+ "{000438} [f08] R27 := R27 + const",
+ "{000440} [f32] 0000 0008",
+ "{000444} [f32] R6 := R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "VarDef MOV",
+ "token": "no_token",
+ "bytes": [
+ "{000446} [f32] R5 := R6"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'ptr3' from R6",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000448} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000450} [f08] R27 := R27 + const",
+ "{000452} [f32] 0000 0012"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000456} [f32] ->R27 := R6"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'var4' from R3",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000458} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000460} [f08] R27 := R27 + const",
+ "{000462} [f32] 0000 0005"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000466} [f32] R6 := ->R27",
+ "{000468} [f32] R7 := 0",
+ "{000470} [f08] R7 := R7 + const",
+ "{000472} [f32] FFFF FF00",
+ "{000476} [f32] R6 &= R7",
+ "{000478} [f32] R7 := 0",
+ "{000480} [f08] R7 := R7 + const",
+ "{000482} [f32] 0000 00FF",
+ "{000486} [f32] R3 &= R7",
+ "{000488} [f32] R3 |= R6"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000490} [f32] ->R27 := R3"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Store variable 'ptr3' from R5",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000492} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000494} [f08] R27 := R27 + const",
+ "{000496} [f32] 0000 0012"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000500} [f32] ->R27 := R5"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Constant definition",
+ "token": "cnst1",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "short",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "short",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Constant definition",
+ "token": "cnst2",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Constant definition",
+ "token": "cnst3",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Constant definition",
+ "token": "cnst_addr1",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Array definition",
+ "token": "arr1",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "short",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "short",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Array definition",
+ "token": "arr2",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'size1' into R3",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000502} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000504} [f08] R27 := R27 + const",
+ "{000506} [f32] 0000 0066",
+ "{000510} [f32] R3 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "size1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{000512} [f32] R5 := 0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "VarDef MOV",
+ "token": "no_token",
+ "bytes": [
+ "{000514} [f32] R3 := R5"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'size1' from R5",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000516} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000518} [f08] R27 := R27 + const",
+ "{000520} [f32] 0000 0066"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000524} [f32] ->R27 := R5"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Array definition",
+ "token": "arr3",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "size1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "size1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{000526} [f32] R5 := R3"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Array heap allocation 1",
+ "token": "no_token",
+ "bytes": [
+ "{000528} [f08] R5 := R5 + const",
+ "{000530} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by -R5 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{000534} [f32] R27 := 0",
+ "{000536} [f32] R27 := ->R27",
+ "{000538} [f32] R27 -= R5",
+ "{000540} [f32] SB := 0",
+ "{000542} [f32] ->SB := R27",
+ "{000544} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{000546} [f32] R27 := 0",
+ "{000548} [f32] R27 := ->R27",
+ "{000550} [f08] R27 := R27 + const",
+ "{000552} [f32] 0000 0000",
+ "{000556} [f32] ->R27 := R5"
+ ],
+ "children": []
+ },
+ {
+ "name": "Array heap allocation 2",
+ "token": "no_token",
+ "bytes": [
+ "{000558} [f32] R6 := 0",
+ "{000560} [f32] R7 := ->R6",
+ "{000562} [f08] R7 := R7 + const",
+ "{000564} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'arr3' from R7",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000568} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000570} [f08] R27 := R27 + const",
+ "{000572} [f32] 0000 006A"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000576} [f32] ->R27 := R7"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'size1' from R3",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000578} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000580} [f08] R27 := R27 + const",
+ "{000582} [f32] 0000 0066"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000586} [f32] ->R27 := R3"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Array definition",
+ "token": "arr_addr1",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "short",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "short",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Array definition",
+ "token": "arr_addr2",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Array definition",
+ "token": "arr_addr3",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "var5",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "var5",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{000588} [f32] R3 := R4"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Expression",
+ "token": "2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{000590} [f32] R5 := 12"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Operation '*'",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 1",
+ "token": "no_token",
+ "bytes": [
+ "{000592} [f32] R6 := 0",
+ "{000594} [f08] R6 := R6 + const",
+ "{000596} [f32] 0000 0020"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{000600} [f32] R7 := 0",
+ "{000602} [f08] R7 := R7 + const",
+ "{000604} [f32] 0000 0276"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{000608} [f32] R8 := 0",
+ "{000610} [f08] R8 := R8 + const",
+ "{000612} [f32] 0000 027E"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{000616} [f32] R9 := 0",
+ "{000618} [f08] R9 := R9 + const",
+ "{000620} [f32] 0000 0280"
+ ],
+ "children": []
+ },
+ {
+ "name": "mult 2",
+ "token": "no_token",
+ "bytes": [
+ "{000624} [f32] R10 := 1",
+ "{000626} [f32] R11 := 0",
+ "{000628} [f32] R12 := 1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 3",
+ "token": "no_token",
+ "bytes": [
+ "{000630} [f32] R13 := 0",
+ "{000632} [f32] R10 &= R5",
+ "{000634} [f32] if R10 goto R8",
+ "{000636} [f32] if R12 goto R9"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 4",
+ "token": "no_token",
+ "bytes": [
+ "{000638} [f32] R11 += R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 5",
+ "token": "no_token",
+ "bytes": [
+ "{000640} [f32] R10 := 1",
+ "{000642} [f32] R12 := 1",
+ "{000644} [f32] R3 <= R3",
+ "{000646} [f32] R5 >= R5",
+ "{000648} [f32] R6 -= R12",
+ "{000650} [f32] R13 ?= R6",
+ "{000652} [f32] R13 &= R12",
+ "{000654} [f32] if R13 goto R7",
+ "{000656} [f32] R3 := R11"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Arr def ASL",
+ "token": "no_token",
+ "bytes": [
+ "{000658} [f32] R3 <<= R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Arr def ASL",
+ "token": "no_token",
+ "bytes": [
+ "{000660} [f32] R3 <<= R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Array heap allocation 1",
+ "token": "no_token",
+ "bytes": [
+ "{000662} [f08] R3 := R3 + const",
+ "{000664} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by -R3 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{000668} [f32] R27 := 0",
+ "{000670} [f32] R27 := ->R27",
+ "{000672} [f32] R27 -= R3",
+ "{000674} [f32] SB := 0",
+ "{000676} [f32] ->SB := R27",
+ "{000678} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{000680} [f32] R27 := 0",
+ "{000682} [f32] R27 := ->R27",
+ "{000684} [f08] R27 := R27 + const",
+ "{000686} [f32] 0000 0000",
+ "{000690} [f32] ->R27 := R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Array heap allocation 2",
+ "token": "no_token",
+ "bytes": [
+ "{000692} [f32] R5 := 0",
+ "{000694} [f32] R6 := ->R5",
+ "{000696} [f08] R6 := R6 + const",
+ "{000698} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'arr_addr3' from R6",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000702} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000704} [f08] R27 := R27 + const",
+ "{000706} [f32] 0000 00E6"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000710} [f32] ->R27 := R6"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'var5' from R4",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000712} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000714} [f08] R27 := R27 + const",
+ "{000716} [f32] 0000 0006"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000720} [f32] R3 := ->R27",
+ "{000722} [f32] R5 := 0",
+ "{000724} [f08] R5 := R5 + const",
+ "{000726} [f32] FFFF FF00",
+ "{000730} [f32] R3 &= R5",
+ "{000732} [f32] R5 := 0",
+ "{000734} [f08] R5 := R5 + const",
+ "{000736} [f32] 0000 00FF",
+ "{000740} [f32] R4 &= R5",
+ "{000742} [f32] R4 |= R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000744} [f32] ->R27 := R4"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "asm",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assembly block",
+ "token": "asm",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Label",
+ "token": "label",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register := Register",
+ "token": "no_token",
+ "bytes": [
+ "{000746} [f32] R0 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register := -> [ Register ]",
+ "token": "no_token",
+ "bytes": [
+ "{000748} [f32] R0 := ->R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register := Expression",
+ "token": "no_token",
+ "bytes": [
+ "{000750} [f32] R0 := 5"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register := Register + Expression",
+ "token": "no_token",
+ "bytes": [
+ "{000752} [f08] R0 := R0 + const",
+ "{000754} [f32] 0000 0064"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{000758} [f32] R0 := 0",
+ "{000760} [f08] R0 := R0 + const",
+ "{000762} [f32] 0000 02EA"
+ ],
+ "children": []
+ },
+ {
+ "name": "-> [ Register ] := Register",
+ "token": "no_token",
+ "bytes": [
+ "{000766} [f32] ->R0 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register += Register",
+ "token": "no_token",
+ "bytes": [
+ "{000768} [f32] R0 += R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register -= Register",
+ "token": "no_token",
+ "bytes": [
+ "{000770} [f32] R0 -= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register &= Register",
+ "token": "no_token",
+ "bytes": [
+ "{000772} [f32] R0 &= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register |= Register",
+ "token": "no_token",
+ "bytes": [
+ "{000774} [f32] R0 |= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register ^= Register",
+ "token": "no_token",
+ "bytes": [
+ "{000776} [f32] R0 ^= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register ?= Register",
+ "token": "no_token",
+ "bytes": [
+ "{000778} [f32] R0 ?= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register <<= Register",
+ "token": "no_token",
+ "bytes": [
+ "{000780} [f32] R0 <<= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register >>= Register",
+ "token": "no_token",
+ "bytes": [
+ "{000782} [f32] R0 >>= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register <= Register",
+ "token": "no_token",
+ "bytes": [
+ "{000784} [f32] R0 <= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register >= Register",
+ "token": "no_token",
+ "bytes": [
+ "{000786} [f32] R0 >= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "if Register goto Register",
+ "token": "no_token",
+ "bytes": [
+ "{000788} [f32] if R0 goto R1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "if",
+ "bytes": [],
+ "children": [
+ {
+ "name": "If",
+ "token": "if",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{000790} [f32] R3 := R0"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "NUMBER",
+ "token": "2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{000792} [f32] R4 := 2"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Operation '>'",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "cond cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000794} [f32] R5 := 1",
+ "{000796} [f32] R4 ?= R3",
+ "{000798} [f32] R5 &= R4",
+ "{000800} [f32] R3 := 1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{000802} [f32] R4 := 0",
+ "{000804} [f08] R4 := R4 + const",
+ "{000806} [f32] 0000 032E"
+ ],
+ "children": []
+ },
+ {
+ "name": "cond cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000810} [f32] if R5 goto R4",
+ "{000812} [f32] R3 := 0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{000814} [f32] R4 := 0",
+ "{000816} [f08] R4 := R4 + const",
+ "{000818} [f32] 0000 0342"
+ ],
+ "children": []
+ },
+ {
+ "name": "CBR if true",
+ "token": "no_token",
+ "bytes": [
+ "{000822} [f32] if R3 goto R4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{000824} [f32] R4 := 0",
+ "{000826} [f08] R4 := R4 + const",
+ "{000828} [f32] 0000 03DA"
+ ],
+ "children": []
+ },
+ {
+ "name": "CBR if false",
+ "token": "no_token",
+ "bytes": [
+ "{000832} [f32] if R4 goto R4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Block body",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000834} [f32] ->SP := FP",
+ "{000836} [f32] FP := SP",
+ "{000838} [f08] FP := FP + const",
+ "{000840} [f32] 0000 0004",
+ "{000844} [f32] SP := FP",
+ "{000846} [f08] SP := SP + const",
+ "{000848} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{000852} [f32] R3 := 0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Primary",
+ "token": "var1",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Assignment mov",
+ "token": "no_token",
+ "bytes": [
+ "{000854} [f32] R0 := R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'var1' from R3",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000856} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var block offset",
+ "token": "no_token",
+ "bytes": [
+ "{000858} [f08] R27 := R27 + const",
+ "{000860} [f32] FFFF FFFC",
+ "{000864} [f32] R27 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000866} [f08] R27 := R27 + const",
+ "{000868} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000872} [f32] ->R27 := R3"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'var1' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000874} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var block offset",
+ "token": "no_token",
+ "bytes": [
+ "{000876} [f08] R27 := R27 + const",
+ "{000878} [f32] FFFF FFFC",
+ "{000882} [f32] R27 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000884} [f08] R27 := R27 + const",
+ "{000886} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000890} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Store variable 'var2' from R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000892} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var block offset",
+ "token": "no_token",
+ "bytes": [
+ "{000894} [f08] R27 := R27 + const",
+ "{000896} [f32] FFFF FFFC",
+ "{000900} [f32] R27 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000902} [f08] R27 := R27 + const",
+ "{000904} [f32] 0000 0002"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000908} [f32] R0 := ->R27",
+ "{000910} [f32] R3 := 0",
+ "{000912} [f08] R3 := R3 + const",
+ "{000914} [f32] FFFF 0000",
+ "{000918} [f32] R0 &= R3",
+ "{000920} [f32] R3 := 0",
+ "{000922} [f08] R3 := R3 + const",
+ "{000924} [f32] 0000 FFFF",
+ "{000928} [f32] R1 &= R3",
+ "{000930} [f32] R1 |= R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000932} [f32] ->R27 := R1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Store variable 'var3' from R2",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000934} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var block offset",
+ "token": "no_token",
+ "bytes": [
+ "{000936} [f08] R27 := R27 + const",
+ "{000938} [f32] FFFF FFFC",
+ "{000942} [f32] R27 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000944} [f08] R27 := R27 + const",
+ "{000946} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000950} [f32] R0 := ->R27",
+ "{000952} [f32] R1 := 0",
+ "{000954} [f08] R1 := R1 + const",
+ "{000956} [f32] FFFF 0000",
+ "{000960} [f32] R0 &= R1",
+ "{000962} [f32] R1 := 0",
+ "{000964} [f08] R1 := R1 + const",
+ "{000966} [f32] 0000 FFFF",
+ "{000970} [f32] R2 &= R1",
+ "{000972} [f32] R2 |= R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{000974} [f32] ->R27 := R2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Dynamic array deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Block body cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000976} [f08] FP := FP + const",
+ "{000978} [f32] FFFF FFFC",
+ "{000982} [f32] SP := FP",
+ "{000984} [f32] FP := ->FP"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'var1' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{000986} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{000988} [f08] R27 := R27 + const",
+ "{000990} [f32] 0000 0000",
+ "{000994} [f32] R0 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "if",
+ "bytes": [],
+ "children": [
+ {
+ "name": "If",
+ "token": "if",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{000996} [f32] R1 := R0"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "NUMBER",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{000998} [f32] R2 := 0"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Operation '='",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "cond cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001000} [f32] R3 := 4",
+ "{001002} [f32] R2 ?= R1",
+ "{001004} [f32] R3 &= R2",
+ "{001006} [f32] R1 := 1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{001008} [f32] R2 := 0",
+ "{001010} [f08] R2 := R2 + const",
+ "{001012} [f32] 0000 03FC"
+ ],
+ "children": []
+ },
+ {
+ "name": "cond cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001016} [f32] if R3 goto R2",
+ "{001018} [f32] R1 := 0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{001020} [f32] R2 := 0",
+ "{001022} [f08] R2 := R2 + const",
+ "{001024} [f32] 0000 0458"
+ ],
+ "children": []
+ },
+ {
+ "name": "CBR if true",
+ "token": "no_token",
+ "bytes": [
+ "{001028} [f32] if R1 goto R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Block body",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001030} [f32] ->SP := FP",
+ "{001032} [f32] FP := SP",
+ "{001034} [f08] FP := FP + const",
+ "{001036} [f32] 0000 0004",
+ "{001040} [f32] SP := FP",
+ "{001042} [f08] SP := SP + const",
+ "{001044} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{001048} [f32] R1 := R0"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "NUMBER",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{001050} [f32] R2 := 1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Operation '-'",
+ "token": "no_token",
+ "bytes": [
+ "{001052} [f32] R1 -= R2"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Primary",
+ "token": "var1",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Assignment mov",
+ "token": "no_token",
+ "bytes": [
+ "{001054} [f32] R0 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'var1' from R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001056} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var block offset",
+ "token": "no_token",
+ "bytes": [
+ "{001058} [f08] R27 := R27 + const",
+ "{001060} [f32] FFFF FFFC",
+ "{001064} [f32] R27 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001066} [f08] R27 := R27 + const",
+ "{001068} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001072} [f32] ->R27 := R1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'var1' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001074} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var block offset",
+ "token": "no_token",
+ "bytes": [
+ "{001076} [f08] R27 := R27 + const",
+ "{001078} [f32] FFFF FFFC",
+ "{001082} [f32] R27 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001084} [f08] R27 := R27 + const",
+ "{001086} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001090} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Dynamic array deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Block body cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001092} [f08] FP := FP + const",
+ "{001094} [f32] FFFF FFFC",
+ "{001098} [f32] SP := FP",
+ "{001100} [f32] FP := ->FP"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{001102} [f32] R2 := 0",
+ "{001104} [f08] R2 := R2 + const",
+ "{001106} [f32] 0000 04E8"
+ ],
+ "children": []
+ },
+ {
+ "name": "CBR if false",
+ "token": "no_token",
+ "bytes": [
+ "{001110} [f32] if R2 goto R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Block body",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001112} [f32] ->SP := FP",
+ "{001114} [f32] FP := SP",
+ "{001116} [f08] FP := FP + const",
+ "{001118} [f32] 0000 0004",
+ "{001122} [f32] SP := FP",
+ "{001124} [f08] SP := SP + const",
+ "{001126} [f32] 0000 0001"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'a' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001130} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001132} [f08] R27 := R27 + const",
+ "{001134} [f32] FFFF FFFD",
+ "{001138} [f32] R0 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "load var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001140} [f32] R1 := 0",
+ "{001142} [f08] R1 := R1 + const",
+ "{001144} [f32] 0000 00FF",
+ "{001148} [f32] R0 &= R1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "byte",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "a",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'a' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001150} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001152} [f08] R27 := R27 + const",
+ "{001154} [f32] FFFF FFFD"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001158} [f32] R1 := ->R27",
+ "{001160} [f32] R2 := 0",
+ "{001162} [f08] R2 := R2 + const",
+ "{001164} [f32] FFFF FF00",
+ "{001168} [f32] R1 &= R2",
+ "{001170} [f32] R2 := 0",
+ "{001172} [f08] R2 := R2 + const",
+ "{001174} [f32] 0000 00FF",
+ "{001178} [f32] R0 &= R2",
+ "{001180} [f32] R0 |= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001182} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'var1' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001184} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds block offset",
+ "token": "no_token",
+ "bytes": [
+ "{001186} [f08] R27 := R27 + const",
+ "{001188} [f32] FFFF FFFC",
+ "{001192} [f32] R27 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001194} [f08] R27 := R27 + const",
+ "{001196} [f32] 0000 0000",
+ "{001200} [f32] R0 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{001202} [f32] R1 := R0"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "NUMBER",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{001204} [f32] R2 := 1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Operation '+'",
+ "token": "no_token",
+ "bytes": [
+ "{001206} [f32] R1 += R2"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Primary",
+ "token": "var1",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Assignment mov",
+ "token": "no_token",
+ "bytes": [
+ "{001208} [f32] R0 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'var1' from R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001210} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var block offset",
+ "token": "no_token",
+ "bytes": [
+ "{001212} [f08] R27 := R27 + const",
+ "{001214} [f32] FFFF FFFC",
+ "{001218} [f32] R27 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001220} [f08] R27 := R27 + const",
+ "{001222} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001226} [f32] ->R27 := R1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'var1' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001228} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var block offset",
+ "token": "no_token",
+ "bytes": [
+ "{001230} [f08] R27 := R27 + const",
+ "{001232} [f32] FFFF FFFC",
+ "{001236} [f32] R27 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001238} [f08] R27 := R27 + const",
+ "{001240} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001244} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Dynamic array deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Block body cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001246} [f08] FP := FP + const",
+ "{001248} [f32] FFFF FFFC",
+ "{001252} [f32] SP := FP",
+ "{001254} [f32] FP := ->FP"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "while",
+ "bytes": [],
+ "children": [
+ {
+ "name": "While",
+ "token": "while",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{001256} [f32] R0 := 0",
+ "{001258} [f08] R0 := R0 + const",
+ "{001260} [f32] 0000 0500"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{001264} [f32] R1 := 0",
+ "{001266} [f08] R1 := R1 + const",
+ "{001268} [f32] 0000 0570"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{001272} [f32] R2 := 0",
+ "{001274} [f08] R2 := R2 + const",
+ "{001276} [f32] 0000 0632"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Heap top change by -12 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{001280} [f32] R27 := 0",
+ "{001282} [f32] R27 := ->R27",
+ "{001284} [f08] R27 := R27 + const",
+ "{001286} [f32] FFFF FFF4",
+ "{001290} [f32] SB := 0",
+ "{001292} [f32] ->SB := R27",
+ "{001294} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{001296} [f32] R27 := 0",
+ "{001298} [f32] R27 := ->R27",
+ "{001300} [f08] R27 := R27 + const",
+ "{001302} [f32] 0000 0000",
+ "{001306} [f32] ->R27 := R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{001308} [f32] R27 := 0",
+ "{001310} [f32] R27 := ->R27",
+ "{001312} [f08] R27 := R27 + const",
+ "{001314} [f32] 0000 0004",
+ "{001318} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{001320} [f32] R27 := 0",
+ "{001322} [f32] R27 := ->R27",
+ "{001324} [f08] R27 := R27 + const",
+ "{001326} [f32] 0000 0008",
+ "{001330} [f32] ->R27 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Expression",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{001332} [f32] R0 := 0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{001334} [f32] R1 := 0",
+ "{001336} [f32] R1 := ->R1",
+ "{001338} [f08] R1 := R1 + const",
+ "{001340} [f32] 0000 0000",
+ "{001344} [f32] R1 := ->R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{001346} [f32] R2 := 0",
+ "{001348} [f32] R2 := ->R2",
+ "{001350} [f08] R2 := R2 + const",
+ "{001352} [f32] 0000 0004",
+ "{001356} [f32] R2 := ->R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{001358} [f32] R3 := 0",
+ "{001360} [f32] R3 := ->R3",
+ "{001362} [f08] R3 := R3 + const",
+ "{001364} [f32] 0000 0008",
+ "{001368} [f32] R3 := ->R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by 12 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{001370} [f32] R27 := 0",
+ "{001372} [f32] R27 := ->R27",
+ "{001374} [f08] R27 := R27 + const",
+ "{001376} [f32] 0000 000C",
+ "{001380} [f32] SB := 0",
+ "{001382} [f32] ->SB := R27",
+ "{001384} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "if fr0 cbr",
+ "token": "no_token",
+ "bytes": [
+ "{001386} [f32] if R0 goto R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "fr1 ldc, if fr0 cbr",
+ "token": "no_token",
+ "bytes": [
+ "{001388} [f32] R4 := 1",
+ "{001390} [f32] if R4 goto R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Heap top change by -12 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{001392} [f32] R27 := 0",
+ "{001394} [f32] R27 := ->R27",
+ "{001396} [f08] R27 := R27 + const",
+ "{001398} [f32] FFFF FFF4",
+ "{001402} [f32] SB := 0",
+ "{001404} [f32] ->SB := R27",
+ "{001406} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{001408} [f32] R27 := 0",
+ "{001410} [f32] R27 := ->R27",
+ "{001412} [f08] R27 := R27 + const",
+ "{001414} [f32] 0000 0000",
+ "{001418} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{001420} [f32] R27 := 0",
+ "{001422} [f32] R27 := ->R27",
+ "{001424} [f08] R27 := R27 + const",
+ "{001426} [f32] 0000 0004",
+ "{001430} [f32] ->R27 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{001432} [f32] R27 := 0",
+ "{001434} [f32] R27 := ->R27",
+ "{001436} [f08] R27 := R27 + const",
+ "{001438} [f32] 0000 0008",
+ "{001442} [f32] ->R27 := R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Loop body",
+ "token": "loop",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001444} [f32] ->SP := FP",
+ "{001446} [f32] FP := SP",
+ "{001448} [f08] FP := FP + const",
+ "{001450} [f32] 0000 0004",
+ "{001454} [f32] SP := FP",
+ "{001456} [f08] SP := SP + const",
+ "{001458} [f32] 0000 0008"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'a' into R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001462} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001464} [f08] R27 := R27 + const",
+ "{001466} [f32] 0000 0000",
+ "{001470} [f32] R1 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "a",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'b' into R2",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001472} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001474} [f08] R27 := R27 + const",
+ "{001476} [f32] 0000 0004",
+ "{001480} [f32] R2 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "b",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "a",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "a",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "a",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "a",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{001482} [f32] R3 := R1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Primary",
+ "token": "b",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{001484} [f32] R4 := R2"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Operation '+'",
+ "token": "no_token",
+ "bytes": [
+ "{001486} [f32] R3 += R4"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Primary",
+ "token": "a",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Assignment mov",
+ "token": "no_token",
+ "bytes": [
+ "{001488} [f32] R1 := R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'a' from R3",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001490} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001492} [f08] R27 := R27 + const",
+ "{001494} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001498} [f32] ->R27 := R3"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'b' from R2",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001500} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001502} [f08] R27 := R27 + const",
+ "{001504} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001508} [f32] ->R27 := R2"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Store variable 'a' from R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001510} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001512} [f08] R27 := R27 + const",
+ "{001514} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001518} [f32] ->R27 := R1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Dynamic array deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Block body cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001520} [f08] FP := FP + const",
+ "{001522} [f32] FFFF FFFC",
+ "{001526} [f32] SP := FP",
+ "{001528} [f32] FP := ->FP"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Load from heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{001530} [f32] R0 := 0",
+ "{001532} [f32] R0 := ->R0",
+ "{001534} [f08] R0 := R0 + const",
+ "{001536} [f32] 0000 0000",
+ "{001540} [f32] R0 := ->R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{001542} [f32] R1 := 0",
+ "{001544} [f32] R1 := ->R1",
+ "{001546} [f08] R1 := R1 + const",
+ "{001548} [f32] 0000 0004",
+ "{001552} [f32] R1 := ->R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{001554} [f32] R2 := 0",
+ "{001556} [f32] R2 := ->R2",
+ "{001558} [f08] R2 := R2 + const",
+ "{001560} [f32] 0000 0008",
+ "{001564} [f32] R2 := ->R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by 12 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{001566} [f32] R27 := 0",
+ "{001568} [f32] R27 := ->R27",
+ "{001570} [f08] R27 := R27 + const",
+ "{001572} [f32] 0000 000C",
+ "{001576} [f32] SB := 0",
+ "{001578} [f32] ->SB := R27",
+ "{001580} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "fr0 ldc, if fr0 cbr",
+ "token": "no_token",
+ "bytes": [
+ "{001582} [f32] R4 := 1",
+ "{001584} [f32] if R4 goto R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "loop",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Loop While",
+ "token": "loop",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{001586} [f32] R0 := 0",
+ "{001588} [f08] R0 := R0 + const",
+ "{001590} [f32] 0000 063A"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Heap top change by -4 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{001594} [f32] R27 := 0",
+ "{001596} [f32] R27 := ->R27",
+ "{001598} [f08] R27 := R27 + const",
+ "{001600} [f32] FFFF FFFC",
+ "{001604} [f32] SB := 0",
+ "{001606} [f32] ->SB := R27",
+ "{001608} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{001610} [f32] R27 := 0",
+ "{001612} [f32] R27 := ->R27",
+ "{001614} [f08] R27 := R27 + const",
+ "{001616} [f32] 0000 0000",
+ "{001620} [f32] ->R27 := R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Loop body",
+ "token": "loop",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001622} [f32] ->SP := FP",
+ "{001624} [f32] FP := SP",
+ "{001626} [f08] FP := FP + const",
+ "{001628} [f32] 0000 0004",
+ "{001632} [f32] SP := FP",
+ "{001634} [f08] SP := SP + const",
+ "{001636} [f32] 0000 0008"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'a' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001640} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001642} [f08] R27 := R27 + const",
+ "{001644} [f32] 0000 0000",
+ "{001648} [f32] R0 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "a",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'b' into R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001650} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001652} [f08] R27 := R27 + const",
+ "{001654} [f32] 0000 0004",
+ "{001658} [f32] R1 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "b",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "a",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "a",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "a",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "a",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{001660} [f32] R2 := R0"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Primary",
+ "token": "b",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{001662} [f32] R3 := R1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Operation '+'",
+ "token": "no_token",
+ "bytes": [
+ "{001664} [f32] R2 += R3"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Primary",
+ "token": "a",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Assignment mov",
+ "token": "no_token",
+ "bytes": [
+ "{001666} [f32] R0 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'a' from R2",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001668} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001670} [f08] R27 := R27 + const",
+ "{001672} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001676} [f32] ->R27 := R2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'b' from R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001678} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001680} [f08] R27 := R27 + const",
+ "{001682} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001686} [f32] ->R27 := R1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Store variable 'a' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001688} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001690} [f08] R27 := R27 + const",
+ "{001692} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{001696} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Dynamic array deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Block body cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001698} [f08] FP := FP + const",
+ "{001700} [f32] FFFF FFFC",
+ "{001704} [f32] SP := FP",
+ "{001706} [f32] FP := ->FP"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Expression",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{001708} [f32] R0 := 0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "fr0 fr2 mov",
+ "token": "no_token",
+ "bytes": [
+ "{001710} [f32] R1 := R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{001712} [f32] R0 := 0",
+ "{001714} [f32] R0 := ->R0",
+ "{001716} [f08] R0 := R0 + const",
+ "{001718} [f32] 0000 0000",
+ "{001722} [f32] R0 := ->R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by 4 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{001724} [f32] R27 := 0",
+ "{001726} [f32] R27 := ->R27",
+ "{001728} [f08] R27 := R27 + const",
+ "{001730} [f32] 0000 0004",
+ "{001734} [f32] SB := 0",
+ "{001736} [f32] ->SB := R27",
+ "{001738} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "if fr2 cbr",
+ "token": "no_token",
+ "bytes": [
+ "{001740} [f32] if R1 goto R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "for",
+ "bytes": [],
+ "children": [
+ {
+ "name": "For",
+ "token": "for",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "fr0 ldc",
+ "token": "no_token",
+ "bytes": [
+ "{001742} [f32] R0 := 0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "For iterator store",
+ "token": "no_token",
+ "bytes": [
+ "{001744} [f08] R1 := SP + const",
+ "{001746} [f32] 0000 0004",
+ "{001750} [f32] ->R1 := R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{001752} [f32] R1 := 0",
+ "{001754} [f08] R1 := R1 + const",
+ "{001756} [f32] 0000 06EA"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{001760} [f32] R2 := 0",
+ "{001762} [f08] R2 := R2 + const",
+ "{001764} [f32] 0000 091A"
+ ],
+ "children": []
+ },
+ {
+ "name": "fr5 := 6",
+ "token": "no_token",
+ "bytes": [
+ "{001768} [f32] R3 := 6"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Heap top change by -16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{001770} [f32] R27 := 0",
+ "{001772} [f32] R27 := ->R27",
+ "{001774} [f08] R27 := R27 + const",
+ "{001776} [f32] FFFF FFF0",
+ "{001780} [f32] SB := 0",
+ "{001782} [f32] ->SB := R27",
+ "{001784} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{001786} [f32] R27 := 0",
+ "{001788} [f32] R27 := ->R27",
+ "{001790} [f08] R27 := R27 + const",
+ "{001792} [f32] 0000 0000",
+ "{001796} [f32] ->R27 := R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{001798} [f32] R27 := 0",
+ "{001800} [f32] R27 := ->R27",
+ "{001802} [f08] R27 := R27 + const",
+ "{001804} [f32] 0000 0004",
+ "{001808} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{001810} [f32] R27 := 0",
+ "{001812} [f32] R27 := ->R27",
+ "{001814} [f08] R27 := R27 + const",
+ "{001816} [f32] 0000 0008",
+ "{001820} [f32] ->R27 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{001822} [f32] R27 := 0",
+ "{001824} [f32] R27 := ->R27",
+ "{001826} [f08] R27 := R27 + const",
+ "{001828} [f32] 0000 000C",
+ "{001832} [f32] ->R27 := R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "fr1 ldc",
+ "token": "no_token",
+ "bytes": [
+ "{001834} [f32] R0 := 10"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{001836} [f32] R1 := 0",
+ "{001838} [f32] R1 := ->R1",
+ "{001840} [f08] R1 := R1 + const",
+ "{001842} [f32] 0000 0000",
+ "{001846} [f32] R1 := ->R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{001848} [f32] R2 := 0",
+ "{001850} [f32] R2 := ->R2",
+ "{001852} [f08] R2 := R2 + const",
+ "{001854} [f32] 0000 0004",
+ "{001858} [f32] R2 := ->R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{001860} [f32] R3 := 0",
+ "{001862} [f32] R3 := ->R3",
+ "{001864} [f08] R3 := R3 + const",
+ "{001866} [f32] 0000 0008",
+ "{001870} [f32] R3 := ->R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{001872} [f32] R4 := 0",
+ "{001874} [f32] R4 := ->R4",
+ "{001876} [f08] R4 := R4 + const",
+ "{001878} [f32] 0000 000C",
+ "{001882} [f32] R4 := ->R4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by 16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{001884} [f32] R27 := 0",
+ "{001886} [f32] R27 := ->R27",
+ "{001888} [f08] R27 := R27 + const",
+ "{001890} [f32] 0000 0010",
+ "{001894} [f32] SB := 0",
+ "{001896} [f32] ->SB := R27",
+ "{001898} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "loop end check",
+ "token": "no_token",
+ "bytes": [
+ "{001900} [f32] R5 := R1",
+ "{001902} [f32] R5 ?= R0",
+ "{001904} [f32] R5 &= R4",
+ "{001906} [f32] if R5 goto R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by -16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{001908} [f32] R27 := 0",
+ "{001910} [f32] R27 := ->R27",
+ "{001912} [f08] R27 := R27 + const",
+ "{001914} [f32] FFFF FFF0",
+ "{001918} [f32] SB := 0",
+ "{001920} [f32] ->SB := R27",
+ "{001922} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{001924} [f32] R27 := 0",
+ "{001926} [f32] R27 := ->R27",
+ "{001928} [f08] R27 := R27 + const",
+ "{001930} [f32] 0000 0000",
+ "{001934} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{001936} [f32] R27 := 0",
+ "{001938} [f32] R27 := ->R27",
+ "{001940} [f08] R27 := R27 + const",
+ "{001942} [f32] 0000 0004",
+ "{001946} [f32] ->R27 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{001948} [f32] R27 := 0",
+ "{001950} [f32] R27 := ->R27",
+ "{001952} [f08] R27 := R27 + const",
+ "{001954} [f32] 0000 0008",
+ "{001958} [f32] ->R27 := R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{001960} [f32] R27 := 0",
+ "{001962} [f32] R27 := ->R27",
+ "{001964} [f08] R27 := R27 + const",
+ "{001966} [f32] 0000 000C",
+ "{001970} [f32] ->R27 := R4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Loop body",
+ "token": "loop",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001972} [f32] ->SP := FP",
+ "{001974} [f32] FP := SP",
+ "{001976} [f08] FP := FP + const",
+ "{001978} [f32] 0000 0004",
+ "{001982} [f32] SP := FP",
+ "{001984} [f08] SP := SP + const",
+ "{001986} [f32] 0000 0008"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'a' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{001990} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{001992} [f08] R27 := R27 + const",
+ "{001994} [f32] 0000 0004",
+ "{001998} [f32] R0 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Load variable 'i' into R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002000} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002002} [f08] R27 := R27 + const",
+ "{002004} [f32] 0000 0000",
+ "{002008} [f32] R1 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "a",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "i",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "i",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{002010} [f32] R2 := R1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "NUMBER",
+ "token": "2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{002012} [f32] R3 := 2"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Operation '*'",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 1",
+ "token": "no_token",
+ "bytes": [
+ "{002014} [f32] R4 := 0",
+ "{002016} [f08] R4 := R4 + const",
+ "{002018} [f32] 0000 0020"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{002022} [f32] R5 := 0",
+ "{002024} [f08] R5 := R5 + const",
+ "{002026} [f32] 0000 0804"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{002030} [f32] R6 := 0",
+ "{002032} [f08] R6 := R6 + const",
+ "{002034} [f32] 0000 080C"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{002038} [f32] R7 := 0",
+ "{002040} [f08] R7 := R7 + const",
+ "{002042} [f32] 0000 080E"
+ ],
+ "children": []
+ },
+ {
+ "name": "mult 2",
+ "token": "no_token",
+ "bytes": [
+ "{002046} [f32] R8 := 1",
+ "{002048} [f32] R9 := 0",
+ "{002050} [f32] R10 := 1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 3",
+ "token": "no_token",
+ "bytes": [
+ "{002052} [f32] R11 := 0",
+ "{002054} [f32] R8 &= R3",
+ "{002056} [f32] if R8 goto R6",
+ "{002058} [f32] if R10 goto R7"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 4",
+ "token": "no_token",
+ "bytes": [
+ "{002060} [f32] R9 += R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 5",
+ "token": "no_token",
+ "bytes": [
+ "{002062} [f32] R8 := 1",
+ "{002064} [f32] R10 := 1",
+ "{002066} [f32] R2 <= R2",
+ "{002068} [f32] R3 >= R3",
+ "{002070} [f32] R4 -= R10",
+ "{002072} [f32] R11 ?= R4",
+ "{002074} [f32] R11 &= R10",
+ "{002076} [f32] if R11 goto R5",
+ "{002078} [f32] R2 := R9"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "VarDef MOV",
+ "token": "no_token",
+ "bytes": [
+ "{002080} [f32] R0 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'a' from R2",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002082} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002084} [f08] R27 := R27 + const",
+ "{002086} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{002090} [f32] ->R27 := R2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'i' from R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002092} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002094} [f08] R27 := R27 + const",
+ "{002096} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{002100} [f32] ->R27 := R1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Store variable 'a' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002102} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002104} [f08] R27 := R27 + const",
+ "{002106} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{002110} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Dynamic array deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Block body cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002112} [f08] FP := FP + const",
+ "{002114} [f32] FFFF FFFC",
+ "{002118} [f32] SP := FP",
+ "{002120} [f32] FP := ->FP"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "fr2 ldc",
+ "token": "no_token",
+ "bytes": [
+ "{002122} [f32] R0 := 1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{002124} [f32] R1 := 0",
+ "{002126} [f32] R1 := ->R1",
+ "{002128} [f08] R1 := R1 + const",
+ "{002130} [f32] 0000 0000",
+ "{002134} [f32] R1 := ->R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{002136} [f32] R2 := 0",
+ "{002138} [f32] R2 := ->R2",
+ "{002140} [f08] R2 := R2 + const",
+ "{002142} [f32] 0000 0004",
+ "{002146} [f32] R2 := ->R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{002148} [f32] R3 := 0",
+ "{002150} [f32] R3 := ->R3",
+ "{002152} [f08] R3 := R3 + const",
+ "{002154} [f32] 0000 0008",
+ "{002158} [f32] R3 := ->R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{002160} [f32] R4 := 0",
+ "{002162} [f32] R4 := ->R4",
+ "{002164} [f08] R4 := R4 + const",
+ "{002166} [f32] 0000 000C",
+ "{002170} [f32] R4 := ->R4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by 16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{002172} [f32] R27 := 0",
+ "{002174} [f32] R27 := ->R27",
+ "{002176} [f08] R27 := R27 + const",
+ "{002178} [f32] 0000 0010",
+ "{002182} [f32] SB := 0",
+ "{002184} [f32] ->SB := R27",
+ "{002186} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "fr2 fr0 add",
+ "token": "no_token",
+ "bytes": [
+ "{002188} [f32] R1 += R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by -16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{002190} [f32] R27 := 0",
+ "{002192} [f32] R27 := ->R27",
+ "{002194} [f08] R27 := R27 + const",
+ "{002196} [f32] FFFF FFF0",
+ "{002200} [f32] SB := 0",
+ "{002202} [f32] ->SB := R27",
+ "{002204} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{002206} [f32] R27 := 0",
+ "{002208} [f32] R27 := ->R27",
+ "{002210} [f08] R27 := R27 + const",
+ "{002212} [f32] 0000 0000",
+ "{002216} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{002218} [f32] R27 := 0",
+ "{002220} [f32] R27 := ->R27",
+ "{002222} [f08] R27 := R27 + const",
+ "{002224} [f32] 0000 0004",
+ "{002228} [f32] ->R27 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{002230} [f32] R27 := 0",
+ "{002232} [f32] R27 := ->R27",
+ "{002234} [f08] R27 := R27 + const",
+ "{002236} [f32] 0000 0008",
+ "{002240} [f32] ->R27 := R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{002242} [f32] R27 := 0",
+ "{002244} [f32] R27 := ->R27",
+ "{002246} [f08] R27 := R27 + const",
+ "{002248} [f32] 0000 000C",
+ "{002252} [f32] ->R27 := R4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{002254} [f32] R0 := 0",
+ "{002256} [f32] R0 := ->R0",
+ "{002258} [f08] R0 := R0 + const",
+ "{002260} [f32] 0000 0000",
+ "{002264} [f32] R0 := ->R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{002266} [f32] R1 := 0",
+ "{002268} [f32] R1 := ->R1",
+ "{002270} [f08] R1 := R1 + const",
+ "{002272} [f32] 0000 0004",
+ "{002276} [f32] R1 := ->R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{002278} [f32] R2 := 0",
+ "{002280} [f32] R2 := ->R2",
+ "{002282} [f08] R2 := R2 + const",
+ "{002284} [f32] 0000 0008",
+ "{002288} [f32] R2 := ->R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{002290} [f32] R3 := 0",
+ "{002292} [f32] R3 := ->R3",
+ "{002294} [f08] R3 := R3 + const",
+ "{002296} [f32] 0000 000C",
+ "{002300} [f32] R3 := ->R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by 16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{002302} [f32] R27 := 0",
+ "{002304} [f32] R27 := ->R27",
+ "{002306} [f08] R27 := R27 + const",
+ "{002308} [f32] 0000 0010",
+ "{002312} [f32] SB := 0",
+ "{002314} [f32] ->SB := R27",
+ "{002316} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "for loop iterator update",
+ "token": "no_token",
+ "bytes": [
+ "{002318} [f08] R4 := SP + const",
+ "{002320} [f32] 0000 0004",
+ "{002324} [f32] ->R4 := R0",
+ "{002326} [f32] R4 := 1",
+ "{002328} [f32] if R4 goto R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "for",
+ "bytes": [],
+ "children": [
+ {
+ "name": "For",
+ "token": "for",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Expression",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{002330} [f32] R0 := 0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "For iterator store",
+ "token": "no_token",
+ "bytes": [
+ "{002332} [f08] R1 := SP + const",
+ "{002334} [f32] 0000 0004",
+ "{002338} [f32] ->R1 := R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{002340} [f32] R1 := 0",
+ "{002342} [f08] R1 := R1 + const",
+ "{002344} [f32] 0000 0936"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{002348} [f32] R2 := 0",
+ "{002350} [f08] R2 := R2 + const",
+ "{002352} [f32] 0000 0B66"
+ ],
+ "children": []
+ },
+ {
+ "name": "fr5 := 6",
+ "token": "no_token",
+ "bytes": [
+ "{002356} [f32] R3 := 6"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Heap top change by -16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{002358} [f32] R27 := 0",
+ "{002360} [f32] R27 := ->R27",
+ "{002362} [f08] R27 := R27 + const",
+ "{002364} [f32] FFFF FFF0",
+ "{002368} [f32] SB := 0",
+ "{002370} [f32] ->SB := R27",
+ "{002372} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{002374} [f32] R27 := 0",
+ "{002376} [f32] R27 := ->R27",
+ "{002378} [f08] R27 := R27 + const",
+ "{002380} [f32] 0000 0000",
+ "{002384} [f32] ->R27 := R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{002386} [f32] R27 := 0",
+ "{002388} [f32] R27 := ->R27",
+ "{002390} [f08] R27 := R27 + const",
+ "{002392} [f32] 0000 0004",
+ "{002396} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{002398} [f32] R27 := 0",
+ "{002400} [f32] R27 := ->R27",
+ "{002402} [f08] R27 := R27 + const",
+ "{002404} [f32] 0000 0008",
+ "{002408} [f32] ->R27 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{002410} [f32] R27 := 0",
+ "{002412} [f32] R27 := ->R27",
+ "{002414} [f08] R27 := R27 + const",
+ "{002416} [f32] 0000 000C",
+ "{002420} [f32] ->R27 := R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Expression",
+ "token": "10",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "10",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{002422} [f32] R0 := 10"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{002424} [f32] R1 := 0",
+ "{002426} [f32] R1 := ->R1",
+ "{002428} [f08] R1 := R1 + const",
+ "{002430} [f32] 0000 0000",
+ "{002434} [f32] R1 := ->R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{002436} [f32] R2 := 0",
+ "{002438} [f32] R2 := ->R2",
+ "{002440} [f08] R2 := R2 + const",
+ "{002442} [f32] 0000 0004",
+ "{002446} [f32] R2 := ->R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{002448} [f32] R3 := 0",
+ "{002450} [f32] R3 := ->R3",
+ "{002452} [f08] R3 := R3 + const",
+ "{002454} [f32] 0000 0008",
+ "{002458} [f32] R3 := ->R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{002460} [f32] R4 := 0",
+ "{002462} [f32] R4 := ->R4",
+ "{002464} [f08] R4 := R4 + const",
+ "{002466} [f32] 0000 000C",
+ "{002470} [f32] R4 := ->R4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by 16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{002472} [f32] R27 := 0",
+ "{002474} [f32] R27 := ->R27",
+ "{002476} [f08] R27 := R27 + const",
+ "{002478} [f32] 0000 0010",
+ "{002482} [f32] SB := 0",
+ "{002484} [f32] ->SB := R27",
+ "{002486} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "loop end check",
+ "token": "no_token",
+ "bytes": [
+ "{002488} [f32] R5 := R1",
+ "{002490} [f32] R5 ?= R0",
+ "{002492} [f32] R5 &= R4",
+ "{002494} [f32] if R5 goto R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by -16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{002496} [f32] R27 := 0",
+ "{002498} [f32] R27 := ->R27",
+ "{002500} [f08] R27 := R27 + const",
+ "{002502} [f32] FFFF FFF0",
+ "{002506} [f32] SB := 0",
+ "{002508} [f32] ->SB := R27",
+ "{002510} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{002512} [f32] R27 := 0",
+ "{002514} [f32] R27 := ->R27",
+ "{002516} [f08] R27 := R27 + const",
+ "{002518} [f32] 0000 0000",
+ "{002522} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{002524} [f32] R27 := 0",
+ "{002526} [f32] R27 := ->R27",
+ "{002528} [f08] R27 := R27 + const",
+ "{002530} [f32] 0000 0004",
+ "{002534} [f32] ->R27 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{002536} [f32] R27 := 0",
+ "{002538} [f32] R27 := ->R27",
+ "{002540} [f08] R27 := R27 + const",
+ "{002542} [f32] 0000 0008",
+ "{002546} [f32] ->R27 := R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{002548} [f32] R27 := 0",
+ "{002550} [f32] R27 := ->R27",
+ "{002552} [f08] R27 := R27 + const",
+ "{002554} [f32] 0000 000C",
+ "{002558} [f32] ->R27 := R4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Loop body",
+ "token": "loop",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002560} [f32] ->SP := FP",
+ "{002562} [f32] FP := SP",
+ "{002564} [f08] FP := FP + const",
+ "{002566} [f32] 0000 0004",
+ "{002570} [f32] SP := FP",
+ "{002572} [f08] SP := SP + const",
+ "{002574} [f32] 0000 0008"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'a' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002578} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002580} [f08] R27 := R27 + const",
+ "{002582} [f32] 0000 0004",
+ "{002586} [f32] R0 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Load variable 'iterator' into R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002588} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002590} [f08] R27 := R27 + const",
+ "{002592} [f32] 0000 0000",
+ "{002596} [f32] R1 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "a",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "iterator",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "iterator",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{002598} [f32] R2 := R1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "NUMBER",
+ "token": "2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{002600} [f32] R3 := 2"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Operation '*'",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 1",
+ "token": "no_token",
+ "bytes": [
+ "{002602} [f32] R4 := 0",
+ "{002604} [f08] R4 := R4 + const",
+ "{002606} [f32] 0000 0020"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{002610} [f32] R5 := 0",
+ "{002612} [f08] R5 := R5 + const",
+ "{002614} [f32] 0000 0A50"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{002618} [f32] R6 := 0",
+ "{002620} [f08] R6 := R6 + const",
+ "{002622} [f32] 0000 0A58"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{002626} [f32] R7 := 0",
+ "{002628} [f08] R7 := R7 + const",
+ "{002630} [f32] 0000 0A5A"
+ ],
+ "children": []
+ },
+ {
+ "name": "mult 2",
+ "token": "no_token",
+ "bytes": [
+ "{002634} [f32] R8 := 1",
+ "{002636} [f32] R9 := 0",
+ "{002638} [f32] R10 := 1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 3",
+ "token": "no_token",
+ "bytes": [
+ "{002640} [f32] R11 := 0",
+ "{002642} [f32] R8 &= R3",
+ "{002644} [f32] if R8 goto R6",
+ "{002646} [f32] if R10 goto R7"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 4",
+ "token": "no_token",
+ "bytes": [
+ "{002648} [f32] R9 += R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 5",
+ "token": "no_token",
+ "bytes": [
+ "{002650} [f32] R8 := 1",
+ "{002652} [f32] R10 := 1",
+ "{002654} [f32] R2 <= R2",
+ "{002656} [f32] R3 >= R3",
+ "{002658} [f32] R4 -= R10",
+ "{002660} [f32] R11 ?= R4",
+ "{002662} [f32] R11 &= R10",
+ "{002664} [f32] if R11 goto R5",
+ "{002666} [f32] R2 := R9"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "VarDef MOV",
+ "token": "no_token",
+ "bytes": [
+ "{002668} [f32] R0 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'a' from R2",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002670} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002672} [f08] R27 := R27 + const",
+ "{002674} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{002678} [f32] ->R27 := R2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'iterator' from R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002680} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002682} [f08] R27 := R27 + const",
+ "{002684} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{002688} [f32] ->R27 := R1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Store variable 'a' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002690} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002692} [f08] R27 := R27 + const",
+ "{002694} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{002698} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Dynamic array deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Block body cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002700} [f08] FP := FP + const",
+ "{002702} [f32] FFFF FFFC",
+ "{002706} [f32] SP := FP",
+ "{002708} [f32] FP := ->FP"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Expression",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{002710} [f32] R0 := 1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{002712} [f32] R1 := 0",
+ "{002714} [f32] R1 := ->R1",
+ "{002716} [f08] R1 := R1 + const",
+ "{002718} [f32] 0000 0000",
+ "{002722} [f32] R1 := ->R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{002724} [f32] R2 := 0",
+ "{002726} [f32] R2 := ->R2",
+ "{002728} [f08] R2 := R2 + const",
+ "{002730} [f32] 0000 0004",
+ "{002734} [f32] R2 := ->R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{002736} [f32] R3 := 0",
+ "{002738} [f32] R3 := ->R3",
+ "{002740} [f08] R3 := R3 + const",
+ "{002742} [f32] 0000 0008",
+ "{002746} [f32] R3 := ->R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{002748} [f32] R4 := 0",
+ "{002750} [f32] R4 := ->R4",
+ "{002752} [f08] R4 := R4 + const",
+ "{002754} [f32] 0000 000C",
+ "{002758} [f32] R4 := ->R4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by 16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{002760} [f32] R27 := 0",
+ "{002762} [f32] R27 := ->R27",
+ "{002764} [f08] R27 := R27 + const",
+ "{002766} [f32] 0000 0010",
+ "{002770} [f32] SB := 0",
+ "{002772} [f32] ->SB := R27",
+ "{002774} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "fr2 fr0 add",
+ "token": "no_token",
+ "bytes": [
+ "{002776} [f32] R1 += R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by -16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{002778} [f32] R27 := 0",
+ "{002780} [f32] R27 := ->R27",
+ "{002782} [f08] R27 := R27 + const",
+ "{002784} [f32] FFFF FFF0",
+ "{002788} [f32] SB := 0",
+ "{002790} [f32] ->SB := R27",
+ "{002792} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{002794} [f32] R27 := 0",
+ "{002796} [f32] R27 := ->R27",
+ "{002798} [f08] R27 := R27 + const",
+ "{002800} [f32] 0000 0000",
+ "{002804} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{002806} [f32] R27 := 0",
+ "{002808} [f32] R27 := ->R27",
+ "{002810} [f08] R27 := R27 + const",
+ "{002812} [f32] 0000 0004",
+ "{002816} [f32] ->R27 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{002818} [f32] R27 := 0",
+ "{002820} [f32] R27 := ->R27",
+ "{002822} [f08] R27 := R27 + const",
+ "{002824} [f32] 0000 0008",
+ "{002828} [f32] ->R27 := R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store to heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{002830} [f32] R27 := 0",
+ "{002832} [f32] R27 := ->R27",
+ "{002834} [f08] R27 := R27 + const",
+ "{002836} [f32] 0000 000C",
+ "{002840} [f32] ->R27 := R4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{002842} [f32] R0 := 0",
+ "{002844} [f32] R0 := ->R0",
+ "{002846} [f08] R0 := R0 + const",
+ "{002848} [f32] 0000 0000",
+ "{002852} [f32] R0 := ->R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 4",
+ "token": "no_token",
+ "bytes": [
+ "{002854} [f32] R1 := 0",
+ "{002856} [f32] R1 := ->R1",
+ "{002858} [f08] R1 := R1 + const",
+ "{002860} [f32] 0000 0004",
+ "{002864} [f32] R1 := ->R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 8",
+ "token": "no_token",
+ "bytes": [
+ "{002866} [f32] R2 := 0",
+ "{002868} [f32] R2 := ->R2",
+ "{002870} [f08] R2 := R2 + const",
+ "{002872} [f32] 0000 0008",
+ "{002876} [f32] R2 := ->R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 12",
+ "token": "no_token",
+ "bytes": [
+ "{002878} [f32] R3 := 0",
+ "{002880} [f32] R3 := ->R3",
+ "{002882} [f08] R3 := R3 + const",
+ "{002884} [f32] 0000 000C",
+ "{002888} [f32] R3 := ->R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by 16 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{002890} [f32] R27 := 0",
+ "{002892} [f32] R27 := ->R27",
+ "{002894} [f08] R27 := R27 + const",
+ "{002896} [f32] 0000 0010",
+ "{002900} [f32] SB := 0",
+ "{002902} [f32] ->SB := R27",
+ "{002904} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "for loop iterator update",
+ "token": "no_token",
+ "bytes": [
+ "{002906} [f08] R4 := SP + const",
+ "{002908} [f32] 0000 0004",
+ "{002912} [f32] ->R4 := R0",
+ "{002914} [f32] R4 := 1",
+ "{002916} [f32] if R4 goto R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Print",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "128",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "128",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDA constant",
+ "token": "no_token",
+ "bytes": [
+ "{002918} [f32] R0 := 0",
+ "{002920} [f08] R0 := R0 + const",
+ "{002922} [f32] 0000 0080"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Print",
+ "token": "no_token",
+ "bytes": [
+ "{002926} [f02] PRINT R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Print",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "sp",
+ "bytes": [],
+ "children": [
+ {
+ "name": "REGISTER",
+ "token": "sp",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Print",
+ "token": "no_token",
+ "bytes": [
+ "{002928} [f02] PRINT SP"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'var2' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002930} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002932} [f08] R27 := R27 + const",
+ "{002934} [f32] 0000 0002",
+ "{002938} [f32] R0 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "load var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{002940} [f32] R1 := 0",
+ "{002942} [f08] R1 := R1 + const",
+ "{002944} [f32] 0000 FFFF",
+ "{002948} [f32] R0 &= R1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Print",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "arr1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "arr1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "var2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "var2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{002950} [f32] R1 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Array index asl",
+ "token": "no_token",
+ "bytes": [
+ "{002952} [f32] R1 <<= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Array index asl",
+ "token": "no_token",
+ "bytes": [
+ "{002954} [f32] R1 <<= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load variable address 'arr1' into R2",
+ "token": "no_token",
+ "bytes": [
+ "{002956} [f32] R27 := FP",
+ "{002958} [f08] R27 := R27 + const",
+ "{002960} [f32] 0000 0016",
+ "{002964} [f32] R2 := R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Array element address load",
+ "token": "no_token",
+ "bytes": [
+ "{002966} [f32] R2 += R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Array element value load",
+ "token": "no_token",
+ "bytes": [
+ "{002968} [f32] R3 := 0",
+ "{002970} [f32] R2 -= R3",
+ "{002972} [f32] R2 := ->R2",
+ "{002974} [f32] R3 := 0",
+ "{002976} [f08] R3 := R3 + const",
+ "{002978} [f32] FFFF FFFF",
+ "{002982} [f32] R3 &= R2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Print",
+ "token": "no_token",
+ "bytes": [
+ "{002984} [f02] PRINT R2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'var2' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{002986} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002988} [f08] R27 := R27 + const",
+ "{002990} [f32] 0000 0002"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{002994} [f32] R1 := ->R27",
+ "{002996} [f32] R2 := 0",
+ "{002998} [f08] R2 := R2 + const",
+ "{003000} [f32] FFFF 0000",
+ "{003004} [f32] R1 &= R2",
+ "{003006} [f32] R2 := 0",
+ "{003008} [f08] R2 := R2 + const",
+ "{003010} [f32] 0000 FFFF",
+ "{003014} [f32] R0 &= R2",
+ "{003016} [f32] R0 |= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003018} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "test_rtn1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Call",
+ "token": "test_rtn1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Call jump",
+ "token": "no_token",
+ "bytes": [
+ "{003020} [f08] R27 := SB + const",
+ "{003022} [f32] 0000 0030",
+ "{003026} [f32] R27 := ->R27",
+ "{003028} [f32] if R27 goto R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'var3' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003030} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003032} [f08] R27 := R27 + const",
+ "{003034} [f32] 0000 0004",
+ "{003038} [f32] R0 := ->R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "load var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003040} [f32] R1 := 0",
+ "{003042} [f08] R1 := R1 + const",
+ "{003044} [f32] 0000 FFFF",
+ "{003048} [f32] R0 &= R1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "var3",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "var3",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "test_rtn2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "test_rtn2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "test_rtn2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003050} [f32] R1 := 1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Parameter store",
+ "token": "no_token",
+ "bytes": [
+ "{003052} [f32] R27 := SP",
+ "{003054} [f08] R27 := R27 + const",
+ "{003056} [f32] 0000 0005",
+ "{003060} [f32] R2 := ->R27",
+ "{003062} [f32] R3 := 0",
+ "{003064} [f08] R3 := R3 + const",
+ "{003066} [f32] FFFF FF00",
+ "{003070} [f32] R2 &= R3",
+ "{003072} [f32] R3 := 0",
+ "{003074} [f08] R3 := R3 + const",
+ "{003076} [f32] 0000 00FF",
+ "{003080} [f32] R1 &= R3",
+ "{003082} [f32] R1 |= R2",
+ "{003084} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Expression",
+ "token": "2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003086} [f32] R1 := 2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Parameter store",
+ "token": "no_token",
+ "bytes": [
+ "{003088} [f32] R27 := SP",
+ "{003090} [f08] R27 := R27 + const",
+ "{003092} [f32] 0000 0009",
+ "{003096} [f32] R2 := ->R27",
+ "{003098} [f32] R3 := 0",
+ "{003100} [f08] R3 := R3 + const",
+ "{003102} [f32] 0000 0000",
+ "{003106} [f32] R2 &= R3",
+ "{003108} [f32] R3 := 0",
+ "{003110} [f08] R3 := R3 + const",
+ "{003112} [f32] FFFF FFFF",
+ "{003116} [f32] R1 &= R3",
+ "{003118} [f32] R1 |= R2",
+ "{003120} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'var3' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003122} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003124} [f08] R27 := R27 + const",
+ "{003126} [f32] 0000 0004"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003130} [f32] R1 := ->R27",
+ "{003132} [f32] R2 := 0",
+ "{003134} [f08] R2 := R2 + const",
+ "{003136} [f32] FFFF 0000",
+ "{003140} [f32] R1 &= R2",
+ "{003142} [f32] R2 := 0",
+ "{003144} [f08] R2 := R2 + const",
+ "{003146} [f32] 0000 FFFF",
+ "{003150} [f32] R0 &= R2",
+ "{003152} [f32] R0 |= R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003154} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Call jump",
+ "token": "no_token",
+ "bytes": [
+ "{003156} [f08] R27 := SB + const",
+ "{003158} [f32] 0000 0034",
+ "{003162} [f32] R27 := ->R27",
+ "{003164} [f32] if R27 goto R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "return value",
+ "token": "no_token",
+ "bytes": [
+ "{003166} [f32] R0 := R26"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Primary",
+ "token": "var3",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load variable address 'var3' into R1",
+ "token": "no_token",
+ "bytes": [
+ "{003168} [f32] R27 := FP",
+ "{003170} [f08] R27 := R27 + const",
+ "{003172} [f32] 0000 0006",
+ "{003176} [f32] R1 := R27"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "asgmnt store cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003178} [f32] R2 := 2",
+ "{003180} [f32] R1 -= R2",
+ "{003182} [f32] R2 := ->R1",
+ "{003184} [f32] R3 := 0",
+ "{003186} [f08] R3 := R3 + const",
+ "{003188} [f32] FFFF 0000",
+ "{003192} [f32] R2 &= R3",
+ "{003194} [f32] R3 := 0",
+ "{003196} [f08] R3 := R3 + const",
+ "{003198} [f32] 0000 FFFF",
+ "{003202} [f32] R0 &= R3",
+ "{003204} [f32] R0 |= R2",
+ "{003206} [f32] ->R1 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'var1' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003208} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003210} [f08] R27 := R27 + const",
+ "{003212} [f32] 0000 0000",
+ "{003216} [f32] R0 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "<",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Goto label",
+ "token": "some_unique_label",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'var1' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003218} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003220} [f08] R27 := R27 + const",
+ "{003222} [f32] 0000 0000",
+ "{003226} [f32] R0 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Assignment",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "40",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "40",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDA constant",
+ "token": "no_token",
+ "bytes": [
+ "{003228} [f32] R1 := 0",
+ "{003230} [f08] R1 := R1 + const",
+ "{003232} [f32] 0000 0028"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Primary",
+ "token": "var1",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Assignment mov",
+ "token": "no_token",
+ "bytes": [
+ "{003236} [f32] R0 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'var1' from R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003238} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003240} [f08] R27 := R27 + const",
+ "{003242} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003246} [f32] ->R27 := R1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "goto",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Goto",
+ "token": "goto",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'var1' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003248} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003250} [f08] R27 := R27 + const",
+ "{003252} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003256} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{003258} [f32] R27 := 0",
+ "{003260} [f08] R27 := R27 + const",
+ "{003262} [f32] 0000 0C92"
+ ],
+ "children": []
+ },
+ {
+ "name": "goto jump",
+ "token": "no_token",
+ "bytes": [
+ "{003266} [f32] if R27 goto R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "if",
+ "bytes": [],
+ "children": [
+ {
+ "name": "If",
+ "token": "if",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "(",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "(",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003268} [f32] R0 := 2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{003270} [f32] R1 := 0",
+ "{003272} [f08] R1 := R1 + const",
+ "{003274} [f32] 0000 0CDA"
+ ],
+ "children": []
+ },
+ {
+ "name": "CBR if true",
+ "token": "no_token",
+ "bytes": [
+ "{003278} [f32] if R0 goto R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{003280} [f32] R1 := 0",
+ "{003282} [f08] R1 := R1 + const",
+ "{003284} [f32] 0000 0CFA"
+ ],
+ "children": []
+ },
+ {
+ "name": "CBR if false",
+ "token": "no_token",
+ "bytes": [
+ "{003288} [f32] if R1 goto R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Block body",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Block body cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003290} [f32] ->SP := FP",
+ "{003292} [f32] FP := SP",
+ "{003294} [f08] FP := FP + const",
+ "{003296} [f32] 0000 0004",
+ "{003300} [f32] SP := FP",
+ "{003302} [f08] SP := SP + const",
+ "{003304} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Print",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "10",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "10",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003308} [f32] R0 := 10"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Print",
+ "token": "no_token",
+ "bytes": [
+ "{003310} [f02] PRINT R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Dynamic array deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Block body cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003312} [f08] FP := FP + const",
+ "{003314} [f32] FFFF FFFC",
+ "{003318} [f32] SP := FP",
+ "{003320} [f32] FP := ->FP"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'var1' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003322} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003324} [f08] R27 := R27 + const",
+ "{003326} [f32] 0000 0000",
+ "{003330} [f32] R0 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "<-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Reference",
+ "token": "<-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load variable address 'var1' into R1",
+ "token": "no_token",
+ "bytes": [
+ "{003332} [f32] R27 := FP",
+ "{003334} [f08] R27 := R27 + const",
+ "{003336} [f32] 0000 0000",
+ "{003340} [f32] R1 := R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Dereference",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "var1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{003342} [f32] R2 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "asgmnt store cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003344} [f32] R3 := 0",
+ "{003346} [f32] R2 -= R3",
+ "{003348} [f32] R3 := ->R2",
+ "{003350} [f32] R4 := 0",
+ "{003352} [f08] R4 := R4 + const",
+ "{003354} [f32] 0000 0000",
+ "{003358} [f32] R3 &= R4",
+ "{003360} [f32] R4 := 0",
+ "{003362} [f08] R4 := R4 + const",
+ "{003364} [f32] FFFF FFFF",
+ "{003368} [f32] R1 &= R4",
+ "{003370} [f32] R1 |= R3",
+ "{003372} [f32] ->R2 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load variable 'var1' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003374} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003376} [f08] R27 := R27 + const",
+ "{003378} [f32] 0000 0000",
+ "{003382} [f32] R0 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'var1' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003384} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003386} [f08] R27 := R27 + const",
+ "{003388} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003392} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "20",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "20",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003394} [f32] R0 := 20"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Dereference",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003396} [f32] R1 := 0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "asgmnt store cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003398} [f32] R2 := 3",
+ "{003400} [f32] R1 -= R2",
+ "{003402} [f32] R2 := ->R1",
+ "{003404} [f32] R3 := 0",
+ "{003406} [f08] R3 := R3 + const",
+ "{003408} [f32] FFFF FF00",
+ "{003412} [f32] R2 &= R3",
+ "{003414} [f32] R3 := 0",
+ "{003416} [f08] R3 := R3 + const",
+ "{003418} [f32] 0000 00FF",
+ "{003422} [f32] R0 &= R3",
+ "{003424} [f32] R0 |= R2",
+ "{003426} [f32] ->R1 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "21",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "21",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003428} [f32] R0 := 21"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Dereference",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "test_rtn2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "test_rtn2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "test_rtn2",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003430} [f32] R1 := 1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Parameter store",
+ "token": "no_token",
+ "bytes": [
+ "{003432} [f32] R27 := SP",
+ "{003434} [f08] R27 := R27 + const",
+ "{003436} [f32] 0000 0005",
+ "{003440} [f32] R2 := ->R27",
+ "{003442} [f32] R3 := 0",
+ "{003444} [f08] R3 := R3 + const",
+ "{003446} [f32] FFFF FF00",
+ "{003450} [f32] R2 &= R3",
+ "{003452} [f32] R3 := 0",
+ "{003454} [f08] R3 := R3 + const",
+ "{003456} [f32] 0000 00FF",
+ "{003460} [f32] R1 &= R3",
+ "{003462} [f32] R1 |= R2",
+ "{003464} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Expression",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003466} [f32] R1 := 1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Parameter store",
+ "token": "no_token",
+ "bytes": [
+ "{003468} [f32] R27 := SP",
+ "{003470} [f08] R27 := R27 + const",
+ "{003472} [f32] 0000 0009",
+ "{003476} [f32] R2 := ->R27",
+ "{003478} [f32] R3 := 0",
+ "{003480} [f08] R3 := R3 + const",
+ "{003482} [f32] 0000 0000",
+ "{003486} [f32] R2 &= R3",
+ "{003488} [f32] R3 := 0",
+ "{003490} [f08] R3 := R3 + const",
+ "{003492} [f32] FFFF FFFF",
+ "{003496} [f32] R1 &= R3",
+ "{003498} [f32] R1 |= R2",
+ "{003500} [f32] ->R27 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Call jump",
+ "token": "no_token",
+ "bytes": [
+ "{003502} [f08] R27 := SB + const",
+ "{003504} [f32] 0000 0034",
+ "{003508} [f32] R27 := ->R27",
+ "{003510} [f32] if R27 goto R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "return value",
+ "token": "no_token",
+ "bytes": [
+ "{003512} [f32] R1 := R26"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "NUMBER",
+ "token": "7",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003514} [f32] R2 := 7"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Operation '+'",
+ "token": "no_token",
+ "bytes": [
+ "{003516} [f32] R1 += R2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "asgmnt store cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003518} [f32] R2 := 0",
+ "{003520} [f32] R1 -= R2",
+ "{003522} [f32] R2 := ->R1",
+ "{003524} [f32] R3 := 0",
+ "{003526} [f08] R3 := R3 + const",
+ "{003528} [f32] 0000 0000",
+ "{003532} [f32] R2 &= R3",
+ "{003534} [f32] R3 := 0",
+ "{003536} [f08] R3 := R3 + const",
+ "{003538} [f32] FFFF FFFF",
+ "{003542} [f32] R0 &= R3",
+ "{003544} [f32] R0 |= R2",
+ "{003546} [f32] ->R1 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'var6' into R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003548} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003550} [f08] R27 := R27 + const",
+ "{003552} [f32] 0000 00EA",
+ "{003556} [f32] R0 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "var6",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Dereference",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "10",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "10",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003558} [f32] R1 := 10"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Store variable 'var6' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003560} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003562} [f08] R27 := R27 + const",
+ "{003564} [f32] 0000 00EA"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003568} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "load deref cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003570} [f32] R2 := 3",
+ "{003572} [f32] R1 -= R2",
+ "{003574} [f32] R1 := ->R1",
+ "{003576} [f32] R2 := 0",
+ "{003578} [f08] R2 := R2 + const",
+ "{003580} [f32] 0000 00FF",
+ "{003584} [f32] R1 &= R2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "VarDef MOV",
+ "token": "no_token",
+ "bytes": [
+ "{003586} [f32] R0 := R1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'var6' from R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003588} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003590} [f08] R27 := R27 + const",
+ "{003592} [f32] 0000 00EA"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003596} [f32] ->R27 := R1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Load variable 'ptr4' into R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "load var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003598} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "load var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003600} [f08] R27 := R27 + const",
+ "{003602} [f32] 0000 00EE",
+ "{003606} [f32] R1 := ->R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Statement",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable declaration",
+ "token": "int",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Variable definition",
+ "token": "ptr4",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "<-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Reference",
+ "token": "<-",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load variable address 'var6' into R2",
+ "token": "no_token",
+ "bytes": [
+ "{003608} [f32] R27 := FP",
+ "{003610} [f08] R27 := R27 + const",
+ "{003612} [f32] 0000 00EA",
+ "{003616} [f32] R2 := R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "VarDef MOV",
+ "token": "no_token",
+ "bytes": [
+ "{003618} [f32] R1 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'ptr4' from R2",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003620} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003622} [f08] R27 := R27 + const",
+ "{003624} [f32] 0000 00EE"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003628} [f32] ->R27 := R2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "var6",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "var6",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Dereference",
+ "token": "->",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "ptr4",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "ptr4",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Copy for right value",
+ "token": "no_token",
+ "bytes": [
+ "{003630} [f32] R2 := R1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Store variable 'var6' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003632} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003634} [f08] R27 := R27 + const",
+ "{003636} [f32] 0000 00EA"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003640} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Store variable 'ptr4' from R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003642} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003644} [f08] R27 := R27 + const",
+ "{003646} [f32] 0000 00EE"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003650} [f32] ->R27 := R1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "load deref cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003652} [f32] R3 := 0",
+ "{003654} [f32] R2 -= R3",
+ "{003656} [f32] R2 := ->R2",
+ "{003658} [f32] R3 := 0",
+ "{003660} [f08] R3 := R3 + const",
+ "{003662} [f32] FFFF FFFF",
+ "{003666} [f32] R2 &= R3"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Primary",
+ "token": "var6",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Assignment mov",
+ "token": "no_token",
+ "bytes": [
+ "{003668} [f32] R0 := R2"
+ ],
+ "children": []
+ },
+ {
+ "name": "Store variable 'var6' from R2",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003670} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003672} [f08] R27 := R27 + const",
+ "{003674} [f32] 0000 00EA"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003678} [f32] ->R27 := R2"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Store variable 'ptr4' from R1",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003680} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003682} [f08] R27 := R27 + const",
+ "{003684} [f32] 0000 00EE"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003688} [f32] ->R27 := R1"
+ ],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Store variable 'var6' from R0",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "store var cmds 1",
+ "token": "no_token",
+ "bytes": [
+ "{003690} [f32] R27 := FP"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 2",
+ "token": "no_token",
+ "bytes": [
+ "{003692} [f08] R27 := R27 + const",
+ "{003694} [f32] 0000 00EA"
+ ],
+ "children": []
+ },
+ {
+ "name": "store var cmds 3",
+ "token": "no_token",
+ "bytes": [
+ "{003698} [f32] ->R27 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "r0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "r0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "r1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "REGISTER",
+ "token": "r1",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "REGISTER",
+ "token": "r0",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Assignment mov",
+ "token": "no_token",
+ "bytes": [
+ "{003700} [f32] R0 := R1"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "r0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Assignment",
+ "token": "r0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "52",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "52",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDA constant",
+ "token": "no_token",
+ "bytes": [
+ "{003702} [f32] R0 := 0",
+ "{003704} [f08] R0 := R0 + const",
+ "{003706} [f32] 0000 08BC"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "REGISTER",
+ "token": "r0",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Assignment mov",
+ "token": "no_token",
+ "bytes": [
+ "{003710} [f32] R0 := R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Print",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "r0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "REGISTER",
+ "token": "r0",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Print",
+ "token": "no_token",
+ "bytes": [
+ "{003712} [f02] PRINT R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Print",
+ "token": "print",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "arr1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Primary",
+ "token": "arr1",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "r0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "REGISTER",
+ "token": "r0",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "REGISTER",
+ "token": "r0",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Operation '*'",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 1",
+ "token": "no_token",
+ "bytes": [
+ "{003714} [f32] R0 := 0",
+ "{003716} [f08] R0 := R0 + const",
+ "{003718} [f32] 0000 0020"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{003722} [f32] R1 := 0",
+ "{003724} [f08] R1 := R1 + const",
+ "{003726} [f32] 0000 0EA8"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{003730} [f32] R2 := 0",
+ "{003732} [f08] R2 := R2 + const",
+ "{003734} [f32] 0000 0EB0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label declaration",
+ "token": "no_token",
+ "bytes": [
+ "{003738} [f32] R3 := 0",
+ "{003740} [f08] R3 := R3 + const",
+ "{003742} [f32] 0000 0EB2"
+ ],
+ "children": []
+ },
+ {
+ "name": "mult 2",
+ "token": "no_token",
+ "bytes": [
+ "{003746} [f32] R4 := 1",
+ "{003748} [f32] R5 := 0",
+ "{003750} [f32] R6 := 1"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 3",
+ "token": "no_token",
+ "bytes": [
+ "{003752} [f32] R7 := 0",
+ "{003754} [f32] R4 &= R0",
+ "{003756} [f32] if R4 goto R2",
+ "{003758} [f32] if R6 goto R3"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 4",
+ "token": "no_token",
+ "bytes": [
+ "{003760} [f32] R5 += R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Label",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "mult 5",
+ "token": "no_token",
+ "bytes": [
+ "{003762} [f32] R4 := 1",
+ "{003764} [f32] R6 := 1",
+ "{003766} [f32] R0 <= R0",
+ "{003768} [f32] R0 >= R0",
+ "{003770} [f32] R0 -= R6",
+ "{003772} [f32] R7 ?= R0",
+ "{003774} [f32] R7 &= R6",
+ "{003776} [f32] if R7 goto R1",
+ "{003778} [f32] R0 := R5"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Array index asl",
+ "token": "no_token",
+ "bytes": [
+ "{003780} [f32] R0 <<= R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Array index asl",
+ "token": "no_token",
+ "bytes": [
+ "{003782} [f32] R0 <<= R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load variable address 'arr1' into R0",
+ "token": "no_token",
+ "bytes": [
+ "{003784} [f32] R27 := FP",
+ "{003786} [f08] R27 := R27 + const",
+ "{003788} [f32] 0000 0016",
+ "{003792} [f32] R0 := R27"
+ ],
+ "children": []
+ },
+ {
+ "name": "Array element address load",
+ "token": "no_token",
+ "bytes": [
+ "{003794} [f32] R0 += R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Array element value load",
+ "token": "no_token",
+ "bytes": [
+ "{003796} [f32] R1 := 0",
+ "{003798} [f32] R0 -= R1",
+ "{003800} [f32] R0 := ->R0",
+ "{003802} [f32] R1 := 0",
+ "{003804} [f08] R1 := R1 + const",
+ "{003806} [f32] FFFF FFFF",
+ "{003810} [f32] R1 &= R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Print",
+ "token": "no_token",
+ "bytes": [
+ "{003812} [f02] PRINT R0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Dynamic array deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{003814} [f32] R0 := 0",
+ "{003816} [f32] R0 := ->R0",
+ "{003818} [f08] R0 := R0 + const",
+ "{003820} [f32] 0000 0000",
+ "{003824} [f32] R0 := ->R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by +R0 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{003826} [f32] R27 := 0",
+ "{003828} [f32] R27 := ->R27",
+ "{003830} [f32] R27 += R0",
+ "{003832} [f32] SB := 0",
+ "{003834} [f32] ->SB := R27",
+ "{003836} [f32] SB := 4"
+ ],
+ "children": []
+ },
+ {
+ "name": "Load from heap at 0",
+ "token": "no_token",
+ "bytes": [
+ "{003838} [f32] R0 := 0",
+ "{003840} [f32] R0 := ->R0",
+ "{003842} [f08] R0 := R0 + const",
+ "{003844} [f32] 0000 0000",
+ "{003848} [f32] R0 := ->R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Heap top change by +R0 bytes",
+ "token": "no_token",
+ "bytes": [
+ "{003850} [f32] R27 := 0",
+ "{003852} [f32] R27 := ->R27",
+ "{003854} [f32] R27 += R0",
+ "{003856} [f32] SB := 0",
+ "{003858} [f32] ->SB := R27",
+ "{003860} [f32] SB := 4"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Data",
+ "token": "data",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Routine",
+ "token": "routine",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Routine body",
+ "token": "do",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Pre routine body",
+ "token": "no_token",
+ "bytes": [
+ "{003862} [f32] ->SP := FP",
+ "{003864} [f32] FP := SP",
+ "{003866} [f08] FP := FP + const",
+ "{003868} [f32] 0000 0004",
+ "{003872} [f32] ->FP := R27",
+ "{003874} [f08] FP := FP + const",
+ "{003876} [f32] 0000 0004",
+ "{003880} [f32] SP := FP",
+ "{003882} [f08] SP := SP + const",
+ "{003884} [f32] 0000 0000"
+ ],
+ "children": []
+ },
+ {
+ "name": "Dynamic array deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Post routine body",
+ "token": "no_token",
+ "bytes": [
+ "{003888} [f08] FP := FP + const",
+ "{003890} [f32] FFFF FFFC",
+ "{003894} [f32] R27 := ->FP",
+ "{003896} [f08] FP := FP + const",
+ "{003898} [f32] FFFF FFFC",
+ "{003902} [f32] SP := FP",
+ "{003904} [f32] FP := ->FP",
+ "{003906} [f32] if R27 goto R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Routine",
+ "token": "routine",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Routine body",
+ "token": "do",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Pre routine body",
+ "token": "no_token",
+ "bytes": [
+ "{003908} [f32] ->SP := FP",
+ "{003910} [f32] FP := SP",
+ "{003912} [f08] FP := FP + const",
+ "{003914} [f32] 0000 0004",
+ "{003918} [f32] ->FP := R27",
+ "{003920} [f08] FP := FP + const",
+ "{003922} [f32] 0000 0004",
+ "{003926} [f32] SP := FP",
+ "{003928} [f08] SP := SP + const",
+ "{003930} [f32] 0000 0005"
+ ],
+ "children": []
+ },
+ {
+ "name": "Register allocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Statement",
+ "token": "return",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Return",
+ "token": "return",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Expression",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "NUMBER",
+ "token": "0",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Load LDC constant",
+ "token": "no_token",
+ "bytes": [
+ "{003934} [f32] R0 := 0"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "r26 return mov",
+ "token": "no_token",
+ "bytes": [
+ "{003936} [f32] R26 := R0"
+ ],
+ "children": []
+ },
+ {
+ "name": "Return to the calling function",
+ "token": "no_token",
+ "bytes": [
+ "{003938} [f08] FP := FP + const",
+ "{003940} [f32] FFFF FFFC",
+ "{003944} [f32] R27 := ->FP",
+ "{003946} [f08] FP := FP + const",
+ "{003948} [f32] FFFF FFFC",
+ "{003952} [f32] SP := FP",
+ "{003954} [f32] FP := ->FP",
+ "{003956} [f32] if R27 goto R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Register deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ },
+ {
+ "name": "Dynamic array deallocation",
+ "token": "no_token",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Get free register",
+ "token": "no_token",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ },
+ {
+ "name": "Post routine body",
+ "token": "no_token",
+ "bytes": [
+ "{003958} [f08] FP := FP + const",
+ "{003960} [f32] FFFF FFFC",
+ "{003964} [f32] R27 := ->FP",
+ "{003966} [f08] FP := FP + const",
+ "{003968} [f32] FFFF FFFC",
+ "{003972} [f32] SP := FP",
+ "{003974} [f32] FP := ->FP",
+ "{003976} [f32] if R27 goto R27"
+ ],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Annotations",
+ "token": "pragma",
+ "bytes": [],
+ "children": [
+ {
+ "name": "Pragma declaration",
+ "token": "memory",
+ "bytes": [],
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Skip/Stop",
+ "token": "no_token",
+ "bytes": [
+ "{003978} [f16] skip",
+ "{003980} [f08] stop"
+ ],
+ "children": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ERACompiler/ERACompilerUnitTests/example.era b/ERACompiler/ERACompilerUnitTests/example.era
index 23c5071..df6a39c 100644
--- a/ERACompiler/ERACompilerUnitTests/example.era
+++ b/ERACompiler/ERACompilerUnitTests/example.era
@@ -1,121 +1,405 @@
-// Program
-// Annotations
-pragma
- // PragmaDeclaration
- some_option1("some_flag1")
- some_option2()
-end
-//Data
-data data_block
- 3
- 14
- 15
-end
+///----------
+/// This file represents all tokens that may occur in the ERA program,
+/// all syntactic rules that ERA language has, and all semantic mechanisms
+/// that are executed under the hood. The purpose of this file is to
+/// give the most comprehensive description of the ERA language to the
+/// person who is completely unfamiliar with it.
+/// ---
+/// @author - Egor Klementev (@egorklementev)
+/// @date - 17/06/2021
+/// @institution - Innopolis University
+///----------
+
+
+// Small remarks:
+//
+// ATTENTION: Do not even try (well, I cannot stop you, of course) to send this file (compiled)
+// to the ERA simulator. It will definitely raise some errors that are hard to find and repair.
+//
+// Compiled version of this file (human readable) you can find on GitHub repo
+// (the file is called 'compiled_example_asm.bin').
+//
+// This is only the allowed comment feature in the ERA language by the way.
+//
+// The ERA language is case INsensitive, so you can write in CAPS IF YOU WANT.
-// Module
-module example_module
- // VarDeclaration
- // Variable
- // Type
- int var1;
- structure_in_module var2;
- // ArrayDeclaration
- int[] var3[5];
- int@ var4;
- // VarDefinition
- int var5 := 0;
- int@ var6 := <-var1;
- // Constant
- const var7 := 0, var8 := 0;
+// Code block
+//
+// Code block is an entry point of any ERA program.
+// For now, ERA language supports only one-file programs, and
+// only one occurrence of the Code block is allowed in a single file.
+code
+
+ // This is the first statement of the program to be executed
+ // (although it's assembly code is not at the beginning of the binary file.
+ // More on that later).
+ int var1; // This is a simple variable declaration. Variable 'var1' lives till the end of the Code block.
+
+ // 'int' type occupies 32 bits of memory on the stack. Variables 'var2' and 'var3' are of
+ // 'short' type and they occupy 16 bits on the stack. Position of these variable is right after
+ // variable 'var1' on the stack.
+ short var2, var3;
- // Routine, Parameters, Parameter
- routine routine_in_module (int param1, byte@ param2, short[] param3) : short
- // RoutineBody
- // AssemblyBlock, AssemblyStatement
- asm
- skip
- stop
- format(32)
- R0 := ->R1
- ->R2 := R3
- R4 := R5
- R6 := 0
- R7 += R8
- R9 -= R10
- R11 >>= R12
- R13 <<= R14
- R15 |= R16
- R17 &= R18
- R19 ^= R20
- R21 <= R22
- R23 >= R24
- R25 ?= R26
- if R27 goto R28
- end
-
- // ExtensionStatement
- // Loop, LoopBody
- // For
- for i from 0 to 10 step 1 loop
- param1 := param1 + 1;
- end
-
- // While, Break
- while 1 loop
- break;
- end
-
- // Assignment
- param1 := param1 + 1;
-
- // Swap
- int temp := 0;
- temp <=> param1;
-
- // If
- if temp > param1 do
- param1 := temp;
- else
- temp := param1;
- end
-
- // Call
- example_routine1(<-param1)
-
- // Expressions
- int var := param3[5] - 20 + param1 * 3;
- ->var := ->param2;
- param2 := <-var;
- ->param2 := ->50;
- example_structure s;
- s.var1 := 2;
-
- // Return
- return 0;
+ // Previously we did not assing anything to variable 'var1', 'var2' & 'var3', so they may contain
+ // any possible value. Generally, value of such variable is undefined and unexpected.
+ // Here, we assing 0 and 6 to the 'var4' & 'var5' correspondingly.
+ // Needless to say that 'byte' type occupies a single byte on the stack (which is exactly 8 bits).
+ byte var4 := 0, var5 := 6;
+
+ // That were all simple "native" types that act as you expect in C or C++.
+ // All 'int', 'short' & 'byte' types are singed, so, for example, you can write
+ // something like this (and compiler should not be angry):
+ var4 := -50;
+
+
+
+ // Similarly to the C/C++, ERA language has pointers in it:
+ //
+ int@ ptr1 := <-var1;
+ short@ ptr2 := <-var2;
+// byte@ ptr3 := <-var3;
+ // ATTENTION: the line above WOULD work, however NOT as you expect it to. The reason for that is
+ // that when dereferenced 'byte@' type indicates to the compiler that the 'ptr3'
+ // (in this case) is the address of some 'byte' variable, so compiler would generate
+ // commands that are loading a single byte instead of two bytes in case of 'short'.
+ // However, this is valid line of code but be carefull with the memory.
+
+ byte@ ptr3 := <-var4;
+ // As you can see, here the '<-' (reference) operator is used which returns the address of a variable on the stack.
+ // There are special cases with the arrays, more on that later.
+
+
+
+ // ERA language also has a constants:
+ //
+ int const cnst1 := 5;
+ short const cnst2 := 10;
+// byte const cnst3; // Constants have to be defined right when they are declared.
+ byte const cnst3 := -1;
+ int@ const cnst_addr1 := 1000; // Addresses can be also constant.
+// int@ const cnst_addr2 := <-ptr3; // References (<-) are not considered as constants for now. [SUBJECT TO CHANGE]
+ // You are not allowed to modify any of these constants later in the code.
+// cnst2 := 50; // This line would produce compilation error
+ // No constant is stored anywhere besides compilation-time storage that you do not have access to
+ // and just converted by the compiler to a raw number. So, 'cnst1' would be substituted with 5 anywhere it is used.
+
+
+
+ // ERA language has arrays language mechanism:
+ //
+ int[] arr1[10]; // 10 here is the size of array 'arr1'. So, there are 10 'int's which is 40 bytes.
+ short[] arr2[20]; // This is CONSTANT-size array.
+// byte[] arr3[0]; // Zero-size constant arrays are not allowed.
+ int size1 := 0;
+ byte[] arr3[size1]; // However, zero-size dynamic arrays are allowed. This is DYNAMIC-size array.
+
+ // ERA language expressions (for example, 1 + 2; 10 * 5; var1 - var2) are divided onto two categories:
+ // 1) Constant expressions - that can be precalculated and converted to a raw number by the compiler.
+ // 2) Dynamic expressions - that are directly translated to the ERA assembly code since they cannot be precalculated.
+ // An expression that has ONLY constants access and/or raw number in it with any kind of operation performed (+,-.*,&...)
+ // counts as constant since ERA compiler can examine its value before generating assembly code. Any constant
+ // expression present in a program is precalculated and converted to a raw number which appear in the final binary file.
+ // ---
+ // In the example above, it can be seen that there are two types of arrays: constant & dynamic arrays.
+ // In case of constant arrays, ERA compiler knows exactly how many elements are in the array.
+ // In case of dymanic arrays, ERA compiler does not know about array size.
+ // --
+ // The differences between them is the following:
+ // - Elements of the constant arrays are located at the stack alongside other variable (such as 'prt3' in this case.
+ // REMEMBER: constants are not stored to the stack and only converted to the raw numbers by the compiler.)
+ // - Elements of the dymanic arrays are located at the heap (more on heap later) and only the address of the
+ // first array element is located at the stack.
+ // - Compiler performs a set of checks when you declare a constant array, so you cannot declare an array with
+ // negative or zero number of elements.
+ // - Compiler does not perform any checks when you declare a dynamic array, so God bless you if you have negative o
+ // zero number of element. It would probably broke either compiler or simulator.
+
+ // There can be also arrays of addresses:
+ int@[] arr_addr1[10];
+ short@[] arr_addr2[20];
+ byte@[] arr_addr3[var5 * (2 + 10)];
+
+ // ATTENTION: this language feature has to be tested. I (Egor Klementev) am not sure whether it works properly or not.
+
+
+
+ // One of the key ERA language features are assembly blocks:
+ //
+ asm
+