shithub: front

Download patch

ref: 605c0df143e172cff18162738ea142a2268e6aab
parent: b5344401da6ab27d87a5b6e6defc65d73dfdf31e
author: mia soweli <mia@soweli.net>
date: Sun Aug 10 14:58:19 EDT 2025

vl: LL operand order and scheduling

LL should use AT&T syntax. LL and SC must be known to sched() so they
are not re-ordered. introduce a clumsy special case for SC because it
both reads from and writes to it's first register argument.

--- a/sys/src/cmd/vl/asm.c
+++ b/sys/src/cmd/vl/asm.c
@@ -1253,6 +1253,23 @@
 			v = p->cond->pc;
 		o1 = v;
 		break;
+
+
+	case 47:	/* sc r, soreg */
+		r = p->to.reg;
+		if(r == NREG)
+			r = o->param;
+		v = regoff(&p->to);
+		o1 = OP_IRR(opirr(p->as), v, r, p->from.reg);
+		break;
+
+	case 48:	/* ll soreg, r */
+		r = p->from.reg;
+		if(r == NREG)
+			r = o->param;
+		v = regoff(&p->from);
+		o1 = OP_IRR(opirr(p->as), v, r, p->to.reg);
+		break;
 	}
 	if(aflag)
 		return o1;
@@ -1472,8 +1489,8 @@
 	case AADDV:		return SP(3,0);
 	case AADDVU:		return SP(3,1);
 
-	case ALL:		return SP(6,0);
-	case ASC:		return SP(7,0);
+	case ALL:	return SP(6,0);
+	case ASC:	return SP(7,0);
 	}
 	diag("bad irr %d", a);
 	return 0;
--- a/sys/src/cmd/vl/optab.c
+++ b/sys/src/cmd/vl/optab.c
@@ -228,8 +228,8 @@
 	{ ACASE,	C_REG,	C_NONE,	C_NONE,		 45, 28, 0 },
 	{ ABCASE,	C_LCON,	C_NONE,	C_LBRA,		 46, 4, 0 },
 
-	{ ALL,		C_REG,	C_NONE,	C_SOREG,	 7, 4, REGZERO },
-	{ ASC,		C_REG,	C_NONE,	C_SOREG,	 7, 4, REGZERO },
+	{ ASC,		C_REG,	C_NONE,	C_SOREG,	 47, 4, 0 },
+	{ ALL,		C_SOREG,	C_NONE,	C_REG,	 48, 4, 0 },
 
 	{ AXXX,		C_NONE,	C_NONE,	C_NONE,		 0, 4, 0 },
 };
--- a/sys/src/cmd/vl/sched.c
+++ b/sys/src/cmd/vl/sched.c
@@ -341,6 +341,12 @@
 				print("botch %P\n", p);
 		}
 		break;
+
+	case ASC:
+	case ALL:
+		sz = 4;
+		ld = 1;
+		break;
 	}
 
 /*
@@ -516,6 +522,10 @@
 		s->used.ireg |= 1<<REGSB;
 		break;
 	case C_REG:
+		/* special case -- SC writes result to p->from.reg */
+		if (p->as == ASC)
+			s->set.ireg |= 1<<p->from.reg;
+
 		s->used.ireg |= 1<<p->from.reg;
 		break;
 	case C_FREG:
--