ref: e7d099ac43c22f4c38399694c5bc81086b89f1f6
parent: 855889f281575f1984197f35fadc9b59d124d525
	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:
--
⑨