summary refs log tree commit diff
path: root/lisc/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'lisc/parse.c')
-rw-r--r--lisc/parse.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/lisc/parse.c b/lisc/parse.c
index 50e5d0a..d504113 100644
--- a/lisc/parse.c
+++ b/lisc/parse.c
@@ -23,6 +23,12 @@ OpDesc opdesc[OLast] = {
 	[OSwap]   = { "swap",  2, T },
 	[OSign]   = { "sign",  1, U },
 	[OXDiv]   = { "xdiv",  1, U },
+	[OXCmp]   = { "xcmp",  2, U },
+
+	[OCmp+Ceq]   = { "ceq",    2, U },
+	[OCmp+Csle]  = { "csle",   2, U },
+	[OXSet+Ceq]  = { "xsete",  0, U },
+	[OXSet+Csle] = { "xsetle", 0, U },
 };
 
 typedef enum {
@@ -40,6 +46,8 @@ typedef enum {
 	TSub,
 	TDiv,
 	TRem,
+	TCeq,
+	TCsle,
 	TPhi,
 	TJmp,
 	TJez,
@@ -123,6 +131,8 @@ lex()
 		{ "sub", TSub },
 		{ "div", TDiv },
 		{ "rem", TRem },
+		{ "ceq", TCeq },
+		{ "csle", TCsle },
 		{ "phi", TPhi },
 		{ "jmp", TJmp },
 		{ "jez", TJez },
@@ -242,7 +252,7 @@ blocka()
 }
 
 static Ref
-tmpref(char *v)
+tmpref(char *v, int use)
 {
 	int t;
 
@@ -252,6 +262,8 @@ tmpref(char *v)
 	if (ntmp++ >= NTmp)
 		err("too many temporaries");
 	strcpy(tmp[t].name, v);
+	tmp[t].ndef += !use;
+	tmp[t].nuse += use;
 	return TMP(t);
 }
 
@@ -263,7 +275,7 @@ parseref()
 
 	switch (next()) {
 	case TTmp:
-		return tmpref(tokval.str);
+		return tmpref(tokval.str, 1);
 	case TNum:
 		c = (Con){.type = CNum, .val = tokval.num};
 		strcpy(c.label, "");
@@ -400,7 +412,7 @@ parseline(PState ps)
 		closeblk();
 		return PLbl;
 	}
-	r = tmpref(tokval.str);
+	r = tmpref(tokval.str, 0);
 	expect(TEq);
 	switch (next()) {
 	case TW:
@@ -428,6 +440,12 @@ parseline(PState ps)
 	case TRem:
 		op = ORem;
 		break;
+	case TCeq:
+		op = OCmp+Ceq;
+		break;
+	case TCsle:
+		op = OCmp+Csle;
+		break;
 	case TPhi:
 		if (ps != PPhi)
 			err("unexpected phi instruction");