q/src/build/z/SaveRegister.go

30 lines
676 B
Go

package z
import (
"git.akyoto.dev/cli/q/src/build/asm"
"git.akyoto.dev/cli/q/src/build/cpu"
)
// SaveRegister attempts to move a variable occupying this register to another register.
func (f *Compiler) SaveRegister(register cpu.Register) {
if !f.CurrentScope().IsUsed(register) {
return
}
for _, general := range f.CPU.General {
if register == general {
return
}
}
variable := f.VariableByRegister(register)
if variable == nil || variable.Alive == 0 {
return
}
newRegister := f.CurrentScope().MustFindFree(f.CPU.General)
f.CurrentScope().Reserve(newRegister)
f.RegisterRegister(asm.MOVE, newRegister, register)
variable.Register = newRegister
}