public override void Compile(Assembly assembly, Scope scope, Register target) { throw new CompileError("Comparisons in general expressions are not implemented"); //Evaluate in reverse in case both need to go on the stack var secondTarget = scope.FindFreeRegister(); if (Scope.IsRegister((Register)secondTarget)) scope.UseRegister(secondTarget); (ChildNodes[1] as CompilableNode).Compile(assembly, scope, (Register)secondTarget); if (AsString == "==" || AsString == "!=") { (ChildNodes[0] as CompilableNode).Compile(assembly, scope, Register.STACK); if (target == Register.STACK) { assembly.Add("SET", Scope.TempRegister, "0x0", "Equality onto stack"); assembly.Add((AsString == "==" ? "IFE" : "IFN"), "POP", Scope.GetRegisterLabelSecond(secondTarget)); assembly.Add("SET", Scope.TempRegister, "0x1"); assembly.Add("SET", "PUSH", Scope.TempRegister); } else { assembly.Add("SET", Scope.GetRegisterLabelFirst((int)target), "0x0", "Equality into register"); assembly.Add((AsString == "==" ? "IFE" : "IFN"), "POP", Scope.GetRegisterLabelSecond(secondTarget)); assembly.Add("SET", Scope.GetRegisterLabelFirst((int)target), "0x1"); } } if (secondTarget == (int)Register.STACK) scope.stackDepth -= 1; else scope.FreeRegister(secondTarget); }
private static void PushRegister(Assembly assembly, Scope scope, Register r) { assembly.Add("SET", "PUSH", Scope.GetRegisterLabelSecond((int)r), "Saving register"); scope.FreeRegister(0); scope.stackDepth += 1; }