pass: first attempt at register allocation

This commit is contained in:
Michael McLoughlin
2018-12-05 00:05:57 -08:00
parent 9376a230cf
commit 022cbb7792
9 changed files with 394 additions and 24 deletions

View File

@@ -1,7 +1,7 @@
package reg
// Set is a set of registers.
type Set map[ID]Register
type Set map[Register]bool
// NewEmptySet builds an empty register set.
func NewEmptySet() Set {
@@ -20,7 +20,7 @@ func NewSetFromSlice(rs []Register) Set {
// Clone returns a copy of s.
func (s Set) Clone() Set {
c := NewEmptySet()
for _, r := range s {
for r := range s {
c.Add(r)
}
return c
@@ -28,17 +28,17 @@ func (s Set) Clone() Set {
// Add r to s.
func (s Set) Add(r Register) {
s[r.ID()] = r
s[r] = true
}
// Discard removes r from s, if present.
func (s Set) Discard(r Register) {
delete(s, r.ID())
delete(s, r)
}
// Update adds every register in t to s.
func (s Set) Update(t Set) {
for _, r := range t {
for r := range t {
s.Add(r)
}
}
@@ -52,7 +52,7 @@ func (s Set) Difference(t Set) Set {
// DifferenceUpdate removes every element of t from s.
func (s Set) DifferenceUpdate(t Set) {
for _, r := range t {
for r := range t {
s.Discard(r)
}
}
@@ -62,10 +62,21 @@ func (s Set) Equals(t Set) bool {
if len(s) != len(t) {
return false
}
for _, r := range s {
if _, found := t[r.ID()]; !found {
for r := range s {
if _, found := t[r]; !found {
return false
}
}
return true
}
// OfKind returns the set of elements of s with kind k.
func (s Set) OfKind(k Kind) Set {
t := NewEmptySet()
for r := range s {
if r.Kind() == k {
t.Add(r)
}
}
return t
}