From 3fb05c382a386ee9ba98bc165732c62bb02167c9 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Wed, 12 Feb 2025 17:02:51 +0100 Subject: [PATCH] Reduced number of register moves --- src/core/CompileReturn.go | 8 +++++++- src/core/UsesRegister.go | 13 ++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/core/CompileReturn.go b/src/core/CompileReturn.go index 752669f..fb93354 100644 --- a/src/core/CompileReturn.go +++ b/src/core/CompileReturn.go @@ -18,7 +18,13 @@ func (f *Function) CompileReturn(node *ast.Return) error { } for i := len(node.Values) - 1; i >= 0; i-- { - f.SaveRegister(f.CPU.Output[i]) + for j := range i { + if f.UsesRegister(node.Values[j], f.CPU.Output[i]) { + f.SaveRegister(f.CPU.Output[i]) + break + } + } + typ, err := f.ExpressionToRegister(node.Values[i], f.CPU.Output[i]) if err != nil { diff --git a/src/core/UsesRegister.go b/src/core/UsesRegister.go index 0ad2d90..74519bd 100644 --- a/src/core/UsesRegister.go +++ b/src/core/UsesRegister.go @@ -4,12 +4,23 @@ import ( "git.akyoto.dev/cli/q/src/ast" "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" ) // UsesRegister returns true if evaluating the expression would write or read the given register. func (f *Function) UsesRegister(expr *expression.Expression, register cpu.Register) bool { if expr.IsLeaf() { - return false + if expr.Token.Kind != token.Identifier { + return false + } + + variable := f.VariableByName(expr.Token.Text(f.File.Bytes)) + + if variable == nil || variable.Register != register { + return false + } + + return true } if ast.IsFunctionCall(expr) {