#ifndef ralloc_H #define ralloc_H #include #include "riscv.h" #include "types.h" /* Number of available registers. */ #define RALLOC_NREGS 15 /* Order of registers to allocate. */ extern const reg_t ralloc_regs[RALLOC_NREGS]; /* Register allocator context. */ typedef struct { bool regs[RALLOC_NREGS]; /* Registers status. */ } ralloc_t; /* Return a new register allocator. */ ralloc_t ralloc(void); /* Allocate and return a new register. */ reg_t ralloc_next(ralloc_t *ra); /* Allocate and return a new register, avoiding `r` when possible. */ reg_t ralloc_next_except(ralloc_t *ra, reg_t r); /* Free the given register. */ void ralloc_free(ralloc_t *ra, reg_t r); /* Free all allocated registers. */ void ralloc_free_all(ralloc_t *ra); /* Returns whether this register is free to reserve. */ bool ralloc_is_free(ralloc_t *ra, reg_t r); /* Reserve a register. Fails if the register is already reserved. */ void ralloc_reserve(ralloc_t *ra, reg_t r); /* Save the register allocation state. */ void ralloc_save(ralloc_t *ra, bool *reserved); /* Restore the register allocation state. */ void ralloc_restore(ralloc_t *ra, bool *reserved); #endif