ralloc.h 1.1 KiB raw
1
#ifndef ralloc_H
2
#define ralloc_H
3
4
#include <stdio.h>
5
6
#include "riscv.h"
7
#include "types.h"
8
9
/* Number of available registers. */
10
#define RALLOC_NREGS 15
11
12
/* Order of registers to allocate. */
13
extern const reg_t ralloc_regs[RALLOC_NREGS];
14
15
/* Register allocator context. */
16
typedef struct {
17
    bool regs[RALLOC_NREGS]; /* Registers status. */
18
} ralloc_t;
19
20
/* Return a new register allocator. */
21
ralloc_t ralloc(void);
22
/* Allocate and return a new register. */
23
reg_t ralloc_next(ralloc_t *ra);
24
/* Allocate and return a new register, avoiding `r` when possible. */
25
reg_t ralloc_next_except(ralloc_t *ra, reg_t r);
26
/* Free the given register. */
27
void ralloc_free(ralloc_t *ra, reg_t r);
28
/* Free all allocated registers. */
29
void ralloc_free_all(ralloc_t *ra);
30
/* Returns whether this register is free to reserve. */
31
bool ralloc_is_free(ralloc_t *ra, reg_t r);
32
/* Reserve a register. Fails if the register is already reserved. */
33
void ralloc_reserve(ralloc_t *ra, reg_t r);
34
/* Save the register allocation state. */
35
void ralloc_save(ralloc_t *ra, bool *reserved);
36
/* Restore the register allocation state. */
37
void ralloc_restore(ralloc_t *ra, bool *reserved);
38
39
#endif