q/src/build/cpu/CPU.go

43 lines
696 B
Go

package cpu
// CPU represents the processor.
type CPU struct {
General []Register
Syscall []Register
Input []Register
Output []Register
usage uint64
}
func (c *CPU) Use(reg Register) {
c.usage |= (1 << reg)
}
func (c *CPU) Free(reg Register) {
c.usage &= ^(1 << reg)
}
func (c *CPU) IsFree(reg Register) bool {
return c.usage&(1<<reg) == 0
}
func (c *CPU) FindFree(registers []Register) (Register, bool) {
for _, reg := range registers {
if c.IsFree(reg) {
return reg, true
}
}
return 0, false
}
func (c *CPU) MustFindFree(registers []Register) Register {
register, exists := c.FindFree(registers)
if !exists {
panic("no free registers")
}
return register
}