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 ");