Improved code generation

This commit is contained in:
Eduard Urbach 2024-07-04 12:32:56 +02:00
parent 75672c1e16
commit 0a661b4345
Signed by: eduard
GPG key ID: 49226B848C78F6C8
9 changed files with 70 additions and 23 deletions

View file

@ -8,19 +8,28 @@ import (
)
// ExpressionToRegister puts the result of an expression into the specified register.
func (f *Function) ExpressionToRegister(root *expression.Expression, register cpu.Register) error {
if root.IsLeaf() {
return f.TokenToRegister(root.Token, register)
func (f *Function) ExpressionToRegister(node *expression.Expression, register cpu.Register) error {
if node.IsLeaf() {
return f.TokenToRegister(node.Token, register)
}
if ast.IsFunctionCall(root) {
err := f.CompileCall(root)
f.assembler.RegisterRegister(asm.MOVE, register, f.cpu.Output[0])
if ast.IsFunctionCall(node) {
err := f.CompileCall(node)
if register != f.cpu.Output[0] {
f.assembler.RegisterRegister(asm.MOVE, register, f.cpu.Output[0])
}
return err
}
left := root.Children[0]
right := root.Children[1]
left := node.Children[0]
right := node.Children[1]
final := register
if OverwritesRegister(right, register) {
register = f.cpu.MustFindFree(f.cpu.General)
}
err := f.ExpressionToRegister(left, register)
@ -28,6 +37,13 @@ func (f *Function) ExpressionToRegister(root *expression.Expression, register cp
return err
}
f.SaveRegister(register)
return f.Execute(root.Token, register, right)
f.cpu.Use(register)
err = f.Execute(node.Token, register, right)
if register != final {
f.assembler.RegisterRegister(asm.MOVE, final, register)
}
f.cpu.Free(register)
return err
}