q/src/core/ExpressionToMemory.go

38 lines
984 B
Go

package core
import (
"fmt"
"git.urbach.dev/cli/q/src/asm"
"git.urbach.dev/cli/q/src/eval"
"git.urbach.dev/cli/q/src/expression"
"git.urbach.dev/cli/q/src/types"
)
// ExpressionToMemory puts the result of an expression into the specified memory address.
func (f *Function) ExpressionToMemory(node *expression.Expression, memory asm.Memory) (types.Type, error) {
value, err := f.Evaluate(node)
if err != nil {
return nil, err
}
switch value := value.(type) {
case eval.Number:
f.MemoryNumber(asm.STORE, memory, value.Number)
case eval.Register:
f.MemoryRegister(asm.STORE, memory, value.Register)
f.FreeRegister(value.Register)
case eval.Memory:
tmp := f.NewRegister()
f.MemoryRegister(asm.LOAD, value.Memory, tmp)
f.MemoryRegister(asm.STORE, memory, tmp)
f.FreeRegister(tmp)
case eval.Label:
f.MemoryLabel(asm.STORE, memory, value.Label)
default:
panic(fmt.Errorf("%s: not implemented: %v", f.UniqueName, value))
}
return value.Type(), err
}