git: 9front

Download patch

ref: 760f367290415fbfb2d462d855f1c46aa85a87e1
parent: 8b36084e2b8283e6e895266e5a9b56a32c9133df
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Apr 18 21:25:35 EDT 2020

6c: conserve registers for floating point operations

for floating point operations, reuse the return register
on the right hand side if it has higher complex number
than the left hand side to conserve registers.

this makes the following code compile, that was previously
run out of floating point register:

float
f(float r[15])
{
	return (r[0] + (r[1] * (r[2] + r[3] * (r[4] + r[5] * (r[6] + r[7] * (r[8] + r[9] * (r[10] + r[11] * (r[12] + r[13] * r[14]))))))));
}

the downside is that this produces extra move operations.

--- a/sys/src/cmd/6c/cgen.c
+++ b/sys/src/cmd/6c/cgen.c
@@ -824,9 +824,9 @@
 				gopcode(o, n->type, r, &nod);
 		} else {
 			/* TO DO: could do better with r->addable >= INDEXED */
-			regalloc(&nod1, r, Z);
+			regalloc(&nod1, r, nn);
 			cgen(r, &nod1);
-			regalloc(&nod, l, nn);
+			regalloc(&nod, l, Z);
 			cgen(l, &nod);
 			gopcode(o, n->type, &nod1, &nod);
 			regfree(&nod1);
--