shithub: scc

Download patch

ref: 6da9ccc28f4f38116d98d6e602dbe5dafda110e0
parent: dfc2beaa2c71a595983aefba6782ad412a4662b6
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Apr 12 13:16:50 EDT 2016

[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

--- a/cc2/arch/qbe/cgen.c
+++ b/cc2/arch/qbe/cgen.c
@@ -7,7 +7,58 @@
 {
 }
 
+/*
+ * 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;
 }
--- a/cc2/arch/z80/cgen.c
+++ b/cc2/arch/z80/cgen.c
@@ -42,10 +42,8 @@
 		np->address = 20;
 		break;
 	default:
-		if (lp)
-			sethi(lp);
-		if (rp)
-			sethi(rp);
+		sethi(lp);
+		sethi(rp);
 		break;
 	}