1package regalloc
2
3import (
4 "fmt"
5 "strings"
6)
7
8// NewRegSet returns a new RegSet with the given registers.
9func NewRegSet(regs ...RealReg) RegSet {
10 var ret RegSet
11 for _, r := range regs {
12 ret = ret.add(r)
13 }
14 return ret
15}
16
17// RegSet represents a set of registers.
18type RegSet uint64
19
20func (rs RegSet) format(info *RegisterInfo) string { //nolint:unused
21 var ret []string
22 for i := 0; i < 64; i++ {
23 if rs&(1<<uint(i)) != 0 {
24 ret = append(ret, info.RealRegName(RealReg(i)))
25 }
26 }
27 return strings.Join(ret, ", ")
28}
29
30func (rs RegSet) has(r RealReg) bool {
31 return rs&(1<<uint(r)) != 0
32}
33
34func (rs RegSet) add(r RealReg) RegSet {
35 if r >= 64 {
36 return rs
37 }
38 return rs | 1<<uint(r)
39}
40
41func (rs RegSet) Range(f func(allocatedRealReg RealReg)) {
42 for i := 0; i < 64; i++ {
43 if rs&(1<<uint(i)) != 0 {
44 f(RealReg(i))
45 }
46 }
47}
48
49type regInUseSet[I Instr, B Block[I], F Function[I, B]] [64]*vrState[I, B, F]
50
51func newRegInUseSet[I Instr, B Block[I], F Function[I, B]]() regInUseSet[I, B, F] {
52 var ret regInUseSet[I, B, F]
53 ret.reset()
54 return ret
55}
56
57func (rs *regInUseSet[I, B, F]) reset() {
58 clear(rs[:])
59}
60
61func (rs *regInUseSet[I, B, F]) format(info *RegisterInfo) string { //nolint:unused
62 var ret []string
63 for i, vr := range rs {
64 if vr != nil {
65 ret = append(ret, fmt.Sprintf("(%s->v%d)", info.RealRegName(RealReg(i)), vr.v.ID()))
66 }
67 }
68 return strings.Join(ret, ", ")
69}
70
71func (rs *regInUseSet[I, B, F]) has(r RealReg) bool {
72 return r < 64 && rs[r] != nil
73}
74
75func (rs *regInUseSet[I, B, F]) get(r RealReg) *vrState[I, B, F] {
76 return rs[r]
77}
78
79func (rs *regInUseSet[I, B, F]) remove(r RealReg) {
80 rs[r] = nil
81}
82
83func (rs *regInUseSet[I, B, F]) add(r RealReg, vr *vrState[I, B, F]) {
84 if r >= 64 {
85 return
86 }
87 rs[r] = vr
88}
89
90func (rs *regInUseSet[I, B, F]) range_(f func(allocatedRealReg RealReg, vr *vrState[I, B, F])) {
91 for i, vr := range rs {
92 if vr != nil {
93 f(RealReg(i), vr)
94 }
95 }
96}