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 +