shithub: mc

Download patch

ref: 666f22f278c03138c337d734f8759194482d1d18
parent: 80c98275269f28f88827ce8d493bb5db47db9757
author: Ori Bernstein <[email protected]>
date: Wed Sep 25 07:05:34 EDT 2013

Start moving towards support for register classes.

--- a/6/asm.h
+++ b/6/asm.h
@@ -3,7 +3,6 @@
 #define Maxdef (2*Maxarg)       /* maximum number of registers an insn can use or def */
 #define Wordsz 4                /* the size of a "natural int" */
 #define Ptrsz 8                 /* the size of a machine word (ie, pointer size) */
-#define _K 14                    /* the number of allocatable registers */
 #define Nsaved 13               /* number of registers saved in the ABI */
 
 typedef size_t regid;
@@ -48,6 +47,13 @@
     ModeD, /* float64 */
     Nmode,
 } Mode;
+
+typedef enum {
+    Classbad,
+    Classint,
+    Classflt,
+    Nclass,
+} Rclass;
 
 /* a register, label, or memory location */
 struct Loc {
--- a/6/ra.c
+++ b/6/ra.c
@@ -103,6 +103,28 @@
     [Rxmm15f] = 31,  [Rxmm15d] = 31,
 };
 
+static int _K[Nclass] = {
+    [Classbad] = 0,
+    [Classint] = 14,
+    [Classflt] = 16,
+};
+
+static Rclass rclass(Loc *l)
+{
+    switch (l->mode) {
+        case ModeNone:  return Classbad;
+        case Nmode:     return Classbad;
+        case ModeB:     return Classint;
+        case ModeW:     return Classint;
+        case ModeL:     return Classint;
+        case ModeQ:     return Classint;
+
+        case ModeF:     return Classflt;
+        case ModeD:     return Classflt;
+    }
+    return Classbad;
+}
+
 /* %esp, %ebp are not in the allocatable pool */
 static int isfixreg(Loc *l)
 {
@@ -209,7 +231,7 @@
 
 static int istrivial(Isel *s, regid r)
 {
-    return s->degree[r] < _K;
+    return s->degree[r] < _K[rclass(locmap[r])];
 }
 
 static void liveness(Isel *s)
@@ -620,7 +642,7 @@
     for (n = 0; adjiter(s, v, &n); n++)
         if (!istrivial(s, n))
             k++;
-    return k < _K;
+    return k < _K[rclass(locmap[u])];
 }
 
 /* FIXME: is this actually correct? */
@@ -812,16 +834,16 @@
  */
 static int paint(Isel *s)
 {
-    int taken[_K + 2]; /* esp, ebp aren't "real colours" */
+    int taken[Nreg];
     Loc *n, *w;
     regid l;
-    size_t i;
+    int i;
     int spilled;
     int found;
 
     spilled = 0;
     while (s->nselstk) {
-        bzero(taken, _K*sizeof(int));
+        bzero(taken, Nreg*sizeof(int));
         n = lpop(&s->selstk, &s->nselstk);
 
         for (l = 0; bsiter(s->gadj[n->reg.id], &l); l++) {
@@ -833,7 +855,7 @@
         }
 
         found = 0;
-        for (i = 0; i < _K; i++) {
+        for (i = 0; i < _K[rclass(n)]; i++) {
             if (!taken[i]) {
                 if (debugopt['r']) {
                     fprintf(stdout, "\tselecting ");