34 lines
800 B
Go
Raw Normal View History

2024-07-03 16:37:59 +02:00
package core
import (
"git.akyoto.dev/cli/q/src/build/asm"
"git.akyoto.dev/cli/q/src/build/ast"
"git.akyoto.dev/cli/q/src/build/cpu"
"git.akyoto.dev/cli/q/src/build/expression"
)
// 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)
}
if ast.IsFunctionCall(root) {
err := f.CompileCall(root)
f.assembler.RegisterRegister(asm.MOVE, register, f.cpu.Output[0])
return err
}
left := root.Children[0]
right := root.Children[1]
err := f.ExpressionToRegister(left, register)
if err != nil {
return err
}
f.SaveRegister(register)
return f.Execute(root.Token, register, right)
}