commit 53e82078e4f9c8450ba94ba169cce9b51d513df2
parent 3bab86e457e6c4035faa26e237bc5ed7e85da472
Author: Roberto E. Vargas Caballero <roberto.vargas@igrid-td.com>
Date:   Tue, 12 Apr 2016 17:16:50 +0200
[cc2-qbe] Add Sethi-Ullman number calculation
In the case of QBE we can ignore the addressability, and we only
use it for the Sethi-Ullman number generation
Diffstat:
2 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/cc2/arch/qbe/cgen.c b/cc2/arch/qbe/cgen.c
@@ -7,7 +7,58 @@ generate(void)
 {
 }
 
+/*
+ * This is strongly influenced by
+ * http://plan9.bell-labs.com/sys/doc/compiler.ps (/sys/doc/compiler.ps)
+ * calculate addresability as follows
+ *     AUTO => 11          value+fp
+ *     REG => 11           reg
+ *     STATIC => 11        (value)
+ *     CONST => 11         $value
+ * These values of addressability are not used in the code generation.
+ * They are only used to calculate the Sethi-Ullman numbers. Since
+ * QBE is AMD64 targered we could do a better job here, and try to
+ * detect some of the complex addressing modes of these processors.
+ */
 Node *
 sethi(Node *np)
 {
+	Node *lp, *rp;
+
+	if (!np)
+		return np;
+
+	np->complex = 0;
+	np->address = 0;
+	lp = np->left;
+	rp = np->right;
+
+	switch (np->op) {
+	case AUTO:
+	case REG:
+	case MEM:
+	case CONST:
+		np->address = 11;
+		break;
+	default:
+		sethi(lp);
+		sethi(rp);
+		break;
+	}
+
+	if (np->address > 10)
+		return np;
+	if (lp)
+		rp->complex = lp->complex;
+	if (rp) {
+		int d = np->complex - rp->complex;
+
+		if (d == 0)
+			++np->complex;
+		else if (d < 0)
+			np->complex = rp->complex;
+	}
+	if (np->complex == 0)
+		++rp->complex;
+	return np;
 }
diff --git a/cc2/arch/z80/cgen.c b/cc2/arch/z80/cgen.c
@@ -42,10 +42,8 @@ sethi(Node *np)
 		np->address = 20;
 		break;
 	default:
-		if (lp)
-			sethi(lp);
-		if (rp)
-			sethi(rp);
+		sethi(lp);
+		sethi(rp);
 		break;
 	}