summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorSigrid Solveig Haflínudóttir <sigrid@ftrv.se>2023-05-14 00:11:40 +0000
committerSigrid Solveig Haflínudóttir <sigrid@ftrv.se>2023-05-14 00:11:40 +0000
commitcbe4b116989c0bfec49b9ae7a1d9a85ead6648ae (patch)
tree02940a0aa4d41a5eb4ecc0768e697749695aaf69 /sys/src
parent3bb4169be1566faca886b232376e85b1ebf10fb3 (diff)
7l: allow paired SIMD load/store, correct a few comments
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/cmd/7l/asmout.c12
-rw-r--r--sys/src/cmd/7l/optab.c14
-rw-r--r--sys/src/cmd/7l/span.c18
3 files changed, 38 insertions, 6 deletions
diff --git a/sys/src/cmd/7l/asmout.c b/sys/src/cmd/7l/asmout.c
index 9c3997812..495a4b8e0 100644
--- a/sys/src/cmd/7l/asmout.c
+++ b/sys/src/cmd/7l/asmout.c
@@ -848,7 +848,7 @@ asmout(Prog *p, Optab *o)
o2 = olsr12u(opldr12(p->as), 0, REGTMP, p->to.reg);
break;
- case 66: /* movpT (R)O!,R; movpT O(R)!, R -> ldrT */
+ case 66: /* movpT (R)O!,R,R; movpT O(R)!,R,R; movpT (R)O,R,R -> ldpT */
o1 = opldrpp(p->as);
v = p->from.offset >> 2 + ((o1 & S64) != 0);
if(v < -128 || v > 127)
@@ -859,10 +859,10 @@ asmout(Prog *p, Optab *o)
o1 |= 3<<23;
else
o1 |= 2<<23;
- o1 |= ((v&0x7F)<<15) | (p->from.reg<<5) | p->reg | (p->to.reg<<10);
+ o1 |= (v&0x7F)<<15 | p->from.reg<<5 | p->reg | p->to.reg<<10;
break;
- case 67: /* movpT R,(R)O!; movpT O(R)!, R -> strT */
+ case 67: /* movpT R,R,(R)O!; movpT R,R,O(R)!; movpT R,R,O(R) -> stpT */
o1 = LD2STR(opldrpp(p->as));
v = p->to.offset >> 2 + ((o1 & S64) != 0);
if(v < -128 || v > 127)
@@ -873,7 +873,7 @@ asmout(Prog *p, Optab *o)
o1 |= 3<<23;
else
o1 |= 2<<23;
- o1 |= ((v&0x7F)<<15) | (p->to.reg<<5) | p->from.reg | (p->reg<<10);
+ o1 |= (v&0x7F)<<15 | p->to.reg<<5 | p->from.reg | p->reg<<10;
break;
}
@@ -1580,9 +1580,11 @@ opldrpp(int a)
case AMOVHU: return 1<<30 | 7<<27 | 0<<26 | 0<<24 | 1<<22;
case AMOVB: return 0<<30 | 7<<27 | 0<<26 | 0<<24 | 2<<22;
case AMOVBU: return 0<<30 | 7<<27 | 0<<26 | 0<<24 | 1<<22;
- case AMOVPW: return 0<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22;
+ case AMOVPW: return 0<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22; /* simm7<<15 | Rt2<<10 | Rn<<5 | Rt */
case AMOVPSW: return 1<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22;
case AMOVP: return 2<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22;
+ case AMOVPS: return 0<<30 | 5<<27 | 1<<26 | 0<<23 | 1<<22;
+ case AMOVPD: return 1<<30 | 5<<27 | 1<<26 | 0<<23 | 1<<22;
}
diag("bad opldr %A\n%P", a, curp);
return 0;
diff --git a/sys/src/cmd/7l/optab.c b/sys/src/cmd/7l/optab.c
index f59187b82..a05d8dd6e 100644
--- a/sys/src/cmd/7l/optab.c
+++ b/sys/src/cmd/7l/optab.c
@@ -323,6 +323,20 @@ Optab optab[] =
{ AMOVP, C_REG, C_REG, C_XPOST, 67, 4, 0 },
{ AMOVP, C_REG, C_REG, C_XPRE, 67, 4, 0 },
+ { AMOVPS, C_PPAUTO, C_FREG, C_FREG, 66, 4, 0 },
+ { AMOVPS, C_PPOREG, C_FREG, C_FREG, 66, 4, 0 },
+ { AMOVPS, C_NPAUTO, C_FREG, C_FREG, 66, 4, 0 },
+ { AMOVPS, C_NPOREG, C_FREG, C_FREG, 66, 4, 0 },
+ { AMOVPS, C_XPOST, C_FREG, C_FREG, 66, 4, 0 },
+ { AMOVPS, C_XPRE, C_FREG, C_FREG, 66, 4, 0 },
+
+ { AMOVPS, C_FREG, C_FREG, C_PPAUTO, 67, 4, 0 },
+ { AMOVPS, C_FREG, C_FREG, C_PPOREG, 67, 4, 0 },
+ { AMOVPS, C_FREG, C_FREG, C_NPAUTO, 67, 4, 0 },
+ { AMOVPS, C_FREG, C_FREG, C_NPOREG, 67, 4, 0 },
+ { AMOVPS, C_FREG, C_FREG, C_XPOST, 67, 4, 0 },
+ { AMOVPS, C_FREG, C_FREG, C_XPRE, 67, 4, 0 },
+
/* special */
{ AMOV, C_SPR, C_NONE, C_REG, 35, 4, 0 },
{ AMRS, C_SPR, C_NONE, C_REG, 35, 4, 0 },
diff --git a/sys/src/cmd/7l/span.c b/sys/src/cmd/7l/span.c
index 17f57d611..f37dc0930 100644
--- a/sys/src/cmd/7l/span.c
+++ b/sys/src/cmd/7l/span.c
@@ -692,6 +692,17 @@ aclass(Adr *a)
return C_GOK;
}
+static int
+asregclass(ushort as)
+{
+ switch(as){
+ case AMOVPS:
+ case AMOVPD:
+ case AMOVPQ: return C_FREG;
+ }
+ return C_REG;
+}
+
Optab*
oplook(Prog *p)
{
@@ -716,7 +727,7 @@ oplook(Prog *p)
a3--;
a2 = C_NONE;
if(p->reg != NREG)
- a2 = C_REG;
+ a2 = asregclass(p->as);
r = p->as;
o = oprange[r].start;
if(o == 0) {
@@ -1352,6 +1363,11 @@ buildop(void)
oprange[AMOVPW] = t;
oprange[AMOVPSW] = t;
break;
+
+ case AMOVPS:
+ oprange[AMOVPS] = t;
+ oprange[AMOVPD] = t;
+ break;
}
}
}