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;
}