43 lines
696 B
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
|
|
}
|