38 lines
984 B
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
|
|
}
|