summary refs log tree commit diff
path: root/lisc
diff options
context:
space:
mode:
Diffstat (limited to 'lisc')
-rw-r--r--lisc/emit.c18
-rw-r--r--lisc/test/max.ssa5
2 files changed, 12 insertions, 11 deletions
diff --git a/lisc/emit.c b/lisc/emit.c
index b8b65d6..59b439b 100644
--- a/lisc/emit.c
+++ b/lisc/emit.c
@@ -195,14 +195,16 @@ eins(Ins i, Fn *fn, FILE *f)
 	case OCopy:
 		if (req(i.to, R))
 			break;
-		if (i.to.val < EAX && rtype(i.arg[0]) == RCon) {
-			val = fn->con[i.arg[0].val].val;
-			if (0 <= val && val <= UINT32_MAX) {
-				fprintf(f, "\tmov $%"PRId64", %%%s\n",
-					val, rsub[i.to.val][SWord]);
-				break;
-			}
-		} else if (!req(i.arg[0], i.to))
+		if (i.to.val < EAX
+		&& rtype(i.arg[0]) == RCon
+		&& fn->con[i.arg[0].val].type == CNum
+		&& (val = fn->con[i.arg[0].val].val) >= 0
+		&& val <= UINT32_MAX) {
+			fprintf(f, "\tmov $%"PRId64", %%%s\n",
+				val, rsub[i.to.val][SWord]);
+			break;
+		}
+		if (!req(i.arg[0], i.to))
 			eop("mov", i.arg[0], i.to, fn, f);
 		break;
 	case OStorel:
diff --git a/lisc/test/max.ssa b/lisc/test/max.ssa
index f054a6a..7f97de0 100644
--- a/lisc/test/max.ssa
+++ b/lisc/test/max.ssa
@@ -8,10 +8,9 @@
 @start
 @loop
 	%max =w phi @start -1, @new %byt, @old %max
-	%id0 =l phi @start 0,  @new %id1, @old %id1
-	%loc =l add $b, %id0
+	%loc =l phi @start $b,  @new %loc1, @old %loc1
 	%byt =w loadub %loc
-	%id1 =l add 1, %id0
+	%loc1 =l add 1, %loc
 	jnz %byt, @iter, @end
 @iter
 	%cmp =w csle %max, %byt