]> git.lizzy.rs Git - plan9front.git/commitdiff
7l: implement MOVP instruction
authorcinap_lenrek <cinap_lenrek@felloff.net>
Thu, 9 May 2019 08:23:23 +0000 (10:23 +0200)
committercinap_lenrek <cinap_lenrek@felloff.net>
Thu, 9 May 2019 08:23:23 +0000 (10:23 +0200)
sys/src/cmd/7l/asmout.c
sys/src/cmd/7l/optab.c
sys/src/cmd/7l/span.c

index 5a30d13d4554d4f582bc85cf208c4ffdb49d7d8c..52b59f25308f4be6b39890d2e4d22044d20b3d04 100644 (file)
@@ -847,6 +847,34 @@ asmout(Prog *p, Optab *o)
                o1 = omovlit(AMOV, p, &p->from, REGTMP);
                o2 = olsr12u(opldr12(p->as), 0, REGTMP, p->to.reg);
                break;
+
+       case 66:        /* movpT (R)O!,R; movpT O(R)!, R -> ldrT */
+               o1 = opldrpp(p->as);
+               v = p->from.offset >> 2 + ((o1 & S64) != 0);
+               if(v < -128 || v > 127)
+                       diag("offset out of range\n%P", p);
+               if(p->from.type == D_XPOST)
+                       o1 |= 1<<23;
+               else if(p->from.type == D_XPRE)
+                       o1 |= 3<<23;
+               else
+                       o1 |= 2<<23;
+               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 */
+               o1 = LD2STR(opldrpp(p->as));
+               v = p->to.offset >> 2 + ((o1 & S64) != 0);
+               if(v < -128 || v > 127)
+                       diag("offset out of range\n%P", p);
+               if(p->to.type == D_XPOST)
+                       o1 |= 1<<23;
+               else if(p->to.type == D_XPRE)
+                       o1 |= 3<<23;
+               else
+                       o1 |= 2<<23;
+               o1 |= ((v&0x7F)<<15) | (p->to.reg<<5) | p->from.reg | (p->reg<<10);
+               break;
        }
 
        if(debug['a'] > 1)
@@ -1552,6 +1580,9 @@ 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 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;
        }
        diag("bad opldr %A\n%P", a, curp);
        return 0;
index b72c5de0ce39428441a8abc70509ffc139589759..f59187b82b4cd101d6104f404013f3cfdb47c1bb 100644 (file)
@@ -309,6 +309,20 @@ Optab      optab[] =
        { AFMOVS,       C_FREG, C_NONE, C_XPRE,         23, 4, 0 },
        { AFMOVD,       C_FREG, C_NONE, C_XPRE,         23, 4, 0 },
 
+       { AMOVP,        C_PPAUTO,       C_REG,  C_REG,          66, 4, 0 },
+       { AMOVP,        C_PPOREG,       C_REG,  C_REG,          66, 4, 0 },
+       { AMOVP,        C_NPAUTO,       C_REG,  C_REG,          66, 4, 0 },
+       { AMOVP,        C_NPOREG,       C_REG,  C_REG,          66, 4, 0 },
+       { AMOVP,        C_XPOST,        C_REG,  C_REG,          66, 4, 0 },
+       { AMOVP,        C_XPRE,         C_REG,  C_REG,          66, 4, 0 },
+
+       { AMOVP,        C_REG,          C_REG, C_PPAUTO,        67, 4, 0 },
+       { AMOVP,        C_REG,          C_REG, C_PPOREG,        67, 4, 0 },
+       { AMOVP,        C_REG,          C_REG, C_NPAUTO,        67, 4, 0 },
+       { AMOVP,        C_REG,          C_REG, C_NPOREG,        67, 4, 0 },
+       { AMOVP,        C_REG,          C_REG, C_XPOST,         67, 4, 0 },
+       { AMOVP,        C_REG,          C_REG, 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 },
index fe4244099c4f6071305ced2c26e8135964b7a717..17f57d611c2bb55707a7470a3e8a373effd628be 100644 (file)
@@ -1347,6 +1347,11 @@ buildop(void)
                        oprange[ASHA256H2] = t;
                        oprange[ASHA256SU1] = t;
                        break;
+
+               case AMOVP:
+                       oprange[AMOVPW] = t;
+                       oprange[AMOVPSW] = t;
+                       break;
                }
        }
 }