summary refs log tree commit diff
path: root/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c65
1 files changed, 30 insertions, 35 deletions
diff --git a/parse.c b/parse.c
index 1fd032a..521e2bf 100644
--- a/parse.c
+++ b/parse.c
@@ -143,10 +143,7 @@ static struct {
 } tokval;
 static int lnum;
 
-static Tmp *tmp;
-static Con *con;
-static int ntmp;
-static int ncon;
+static Fn *curf;
 static Phi **plink;
 static Blk **bmap;
 static Blk *curb;
@@ -360,11 +357,11 @@ tmpref(char *v)
 {
 	int t;
 
-	for (t=Tmp0; t<ntmp; t++)
-		if (strcmp(v, tmp[t].name) == 0)
+	for (t=Tmp0; t<curf->ntmp; t++)
+		if (strcmp(v, curf->tmp[t].name) == 0)
 			return TMP(t);
-	vgrow(&tmp, ++ntmp);
-	strcpy(tmp[t].name, v);
+	newtmp(0, Kw, curf);
+	strcpy(curf->tmp[t].name, v);
 	return TMP(t);
 }
 
@@ -396,13 +393,13 @@ parseref()
 		c.type = CAddr;
 		strcpy(c.label, tokval.str);
 	Look:
-		for (i=0; i<ncon; i++)
-			if (con[i].type == c.type
-			&& con[i].bits.i == c.bits.i
-			&& strcmp(con[i].label, c.label) == 0)
+		for (i=0; i<curf->ncon; i++)
+			if (curf->con[i].type == c.type
+			&& curf->con[i].bits.i == c.bits.i
+			&& strcmp(curf->con[i].label, c.label) == 0)
 				return CON(i);
-		vgrow(&con, ++ncon);
-		con[i] = c;
+		vgrow(&curf->con, ++curf->ncon);
+		curf->con[i] = c;
 		return CON(i);
 	default:
 		return R;
@@ -648,29 +645,31 @@ DoOp:
 static Fn *
 parsefn(int export)
 {
+	int r;
 	PState ps;
-	Fn *fn;
 
-	ntmp = Tmp0;
-	ncon = 1; /* first constant must be 0 */
 	curb = 0;
 	nblk = 0;
 	curi = insb;
-	tmp = vnew(ntmp, sizeof tmp[0]);
-	con = vnew(ncon, sizeof con[0]);
+	curf = alloc(sizeof *curf);
+	curf->ntmp = 0;
+	curf->ncon = 1; /* first constant must be 0 */
+	curf->tmp = vnew(curf->ntmp, sizeof curf->tmp[0]);
+	curf->con = vnew(curf->ncon, sizeof curf->con[0]);
+	for (r=0; r<Tmp0; r++)
+		newtmp(0, r < XMM0 ? Kl : Kd, curf);
 	bmap = vnew(nblk, sizeof bmap[0]);
-	con[0].type = CBits;
-	fn = alloc(sizeof *fn);
-	fn->export = export;
-	blink = &fn->start;
-	fn->retty = -1;
+	curf->con[0].type = CBits;
+	curf->export = export;
+	blink = &curf->start;
+	curf->retty = -1;
 	if (peek() != TGlo)
-		rcls = parsecls(&fn->retty);
+		rcls = parsecls(&curf->retty);
 	else
 		rcls = 5;
 	if (next() != TGlo)
 		err("function name expected");
-	strcpy(fn->name, tokval.str);
+	strcpy(curf->name, tokval.str);
 	parserefl(0);
 	if (nextnl() != TLBrace)
 		err("function body must start with {");
@@ -682,15 +681,11 @@ parsefn(int export)
 		err("empty file");
 	if (curb->jmp.type == JXXX)
 		err("last block misses jump");
-	fn->tmp = tmp;
-	fn->con = con;
-	fn->mem = vnew(0, sizeof fn->mem[0]);
-	fn->ntmp = ntmp;
-	fn->ncon = ncon;
-	fn->nmem = 0;
-	fn->nblk = nblk;
-	fn->rpo = 0;
-	return fn;
+	curf->mem = vnew(0, sizeof curf->mem[0]);
+	curf->nmem = 0;
+	curf->nblk = nblk;
+	curf->rpo = 0;
+	return curf;
 }
 
 static void