regset.go

 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}