30 lines
676 B
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
|
|
}
|