summaryrefslogtreecommitdiff
path: root/utils/ql
diff options
context:
space:
mode:
authorforsyth <forsyth@vitanuova.com>2010-04-27 12:51:13 +0100
committerforsyth <forsyth@vitanuova.com>2010-04-27 12:51:13 +0100
commitd67b7dad77bb8aa973dad1f7c3ab0c309b114278 (patch)
tree6794120fb327d6de19cf05eed53f80d877781a3e /utils/ql
parent09da2e137d5eb0c940df35d989e4c31ec0654fc4 (diff)
20100427-1251
Diffstat (limited to 'utils/ql')
-rw-r--r--utils/ql/asm.c70
-rw-r--r--utils/ql/asmout.c91
-rw-r--r--utils/ql/list.c5
-rw-r--r--utils/ql/mkfile7
-rw-r--r--utils/ql/noop.c2
-rw-r--r--utils/ql/obj.c35
-rw-r--r--utils/ql/optab.c10
-rw-r--r--utils/ql/span.c152
8 files changed, 336 insertions, 36 deletions
diff --git a/utils/ql/asm.c b/utils/ql/asm.c
index 0c546ee3..25d4c772 100644
--- a/utils/ql/asm.c
+++ b/utils/ql/asm.c
@@ -299,11 +299,21 @@ asmb(void)
lput(1L); /* version = CURRENT */
lput(entryvalue() & ~KMASK); /* entry vaddr */
lput(52L); /* offset to first phdr */
- lput(0L); /* offset to first shdr */
- lput(0L); /* flags = PPC */
- lput((52L<<16)|32L); /* Ehdr & Phdr sizes*/
- lput((3L<<16)|0L); /* # Phdrs & Shdr size */
- lput((0L<<16)|0L); /* # Shdrs & shdr string size */
+
+ if(debug['S']){
+ lput(HEADR+textsize+datsize+symsize); /* offset to first shdr */
+ lput(0L); /* flags = PPC */
+ lput((52L<<16)|32L); /* Ehdr & Phdr sizes*/
+ lput((3L<<16)|40L); /* # Phdrs & Shdr size */
+ lput((3L<<16)|2L); /* # Shdrs & shdr string size */
+ }
+ else{
+ lput(0L);
+ lput(0L); /* flags = PPC */
+ lput((52L<<16)|32L); /* Ehdr & Phdr sizes*/
+ lput((3L<<16)|0L); /* # Phdrs & Shdr size */
+ lput((3L<<16)|0L); /* # Shdrs & shdr string size */
+ }
lput(1L); /* text - type = PT_LOAD */
lput(HEADR); /* file offset */
@@ -331,6 +341,56 @@ asmb(void)
lput(lcsize); /* line number size */
lput(0x04L); /* protections = R */
lput(0x04L); /* alignment code?? */
+ cflush();
+
+ if(!debug['S'])
+ break;
+
+ seek(cout, HEADR+textsize+datsize+symsize, 0);
+ lput(1); /* Section name (string tbl index) */
+ lput(1); /* Section type */
+ lput(2|4); /* Section flags */
+ lput(INITTEXT & ~KMASK); /* Section virtual addr at execution */
+ lput(HEADR); /* Section file offset */
+ lput(textsize); /* Section size in bytes */
+ lput(0); /* Link to another section */
+ lput(0); /* Additional section information */
+ lput(0x10000L); /* Section alignment */
+ lput(0); /* Entry size if section holds table */
+
+ lput(7); /* Section name (string tbl index) */
+ lput(1); /* Section type */
+ lput(2|1); /* Section flags */
+ lput(INITDAT & ~KMASK); /* Section virtual addr at execution */
+ lput(HEADR+textsize); /* Section file offset */
+ lput(datsize); /* Section size in bytes */
+ lput(0); /* Link to another section */
+ lput(0); /* Additional section information */
+ lput(0x10000L); /* Section alignment */
+ lput(0); /* Entry size if section holds table */
+
+ /* string section header */
+ lput(12); /* Section name (string tbl index) */
+ lput(3); /* Section type */
+ lput(1 << 5); /* Section flags */
+ lput(0); /* Section virtual addr at execution */
+ lput(HEADR+textsize+datsize+symsize+3*40); /* Section file offset */
+ lput(14); /* Section size in bytes */
+ lput(0); /* Link to another section */
+ lput(0); /* Additional section information */
+ lput(1); /* Section alignment */
+ lput(0); /* Entry size if section holds table */
+
+ /* string table */
+ cput(0);
+ strnput(".text", 5);
+ cput(0);
+ strnput(".data", 5);
+ cput(0);
+ strnput(".strtab", 7);
+ cput(0);
+ cput(0);
+
break;
}
cflush();
diff --git a/utils/ql/asmout.c b/utils/ql/asmout.c
index e3d96694..96cb3df3 100644
--- a/utils/ql/asmout.c
+++ b/utils/ql/asmout.c
@@ -942,18 +942,80 @@ oprrr(int a)
case AFNMSUBCC: return OPVCC(63,30,0,1);
case AFNMSUBS: return OPVCC(59,30,0,0);
case AFNMSUBSCC: return OPVCC(59,30,0,1);
+ case AFRES: return OPVCC(59,24,0,0);
+ case AFRESCC: return OPVCC(59,24,0,1);
case AFRSP: return OPVCC(63,12,0,0);
case AFRSPCC: return OPVCC(63,12,0,1);
+ case AFRSQRTE: return OPVCC(63,26,0,0);
+ case AFRSQRTECC: return OPVCC(63,26,0,1);
+ case AFSEL: return OPVCC(63,23,0,0);
+ case AFSELCC: return OPVCC(63,23,0,1);
+ case AFSQRT: return OPVCC(63,22,0,0);
+ case AFSQRTCC: return OPVCC(63,22,0,1);
+ case AFSQRTS: return OPVCC(59,22,0,0);
+ case AFSQRTSCC: return OPVCC(59,22,0,1);
case AFSUB: return OPVCC(63,20,0,0);
case AFSUBCC: return OPVCC(63,20,0,1);
case AFSUBS: return OPVCC(59,20,0,0);
case AFSUBSCC: return OPVCC(59,20,0,1);
+ /* fp2 */
+ case AFPMUL: return OPVCC(0,8,0,0);
+ case AFXMUL: return OPVCC(0,9,0,0);
+ case AFXPMUL: return OPVCC(0,10,0,0);
+ case AFXSMUL: return OPVCC(0,11,0,0);
+ case AFPADD: return OPVCC(0,12,0,0);
+ case AFPSUB: return OPVCC(0,13,0,0);
+ case AFPRE: return OPVCC(0,14,0,0);
+ case AFPRSQRTE: return OPVCC(0,15,0,0);
+ case AFPMADD: return OPVCC(0,16,0,0);
+ case AFXMADD: return OPVCC(0,17,0,0);
+ case AFXCPMADD: return OPVCC(0,18,0,0);
+ case AFXCSMADD: return OPVCC(0,19,0,0);
+ case AFPNMADD: return OPVCC(0,20,0,0);
+ case AFXNMADD: return OPVCC(0,21,0,0);
+ case AFXCPNMADD: return OPVCC(0,22,0,0);
+ case AFXCSNMADD: return OPVCC(0,23,0,0);
+ case AFPMSUB: return OPVCC(0,24,0,0);
+ case AFXMSUB: return OPVCC(0,25,0,0);
+ case AFXCPMSUB: return OPVCC(0,26,0,0);
+ case AFXCSMSUB: return OPVCC(0,27,0,0);
+ case AFPNMSUB: return OPVCC(0,28,0,0);
+ case AFXNMSUB: return OPVCC(0,29,0,0);
+ case AFXCPNMSUB: return OPVCC(0,30,0,0);
+ case AFXCSNMSUB: return OPVCC(0,31,0,0);
+ case AFMOVPD: return OPVCC(0,32,0,0); /* fpmr, X form */
+ case AFPABS: return OPVCC(0,96,0,0);
+ case AFPNEG: return OPVCC(0,160,0,0);
+ case AFPRSP: return OPVCC(0,192,0,0);
+ case AFPNABS: return OPVCC(0,224,0,0);
+ case AFMOVSD: return OPVCC(0,288,0,0); /* fsmr */
+ case AFSCMP: return OPVCC(0,320,0,0)|(3<<21);
+ case AFSABS: return OPVCC(0,352,0,0);
+ case AFSNEG: return OPVCC(0,416,0,0);
+ case AFSNABS: return OPVCC(0,480,0,0);
+ case AFMOVXD: return OPVCC(0,544,0,0);
+ case AFPCTIW: return OPVCC(0,576,0,0);
+ case AFPCTIWZ: return OPVCC(0,704,0,0);
+
+ case AFPMOVD: return OPVCC(0,32,0,0); /* fpmr */
+ case AFSMOVD: return OPVCC(0,288,0,0); /* fsmr */
+ case AFXMOVD: return OPVCC(0,544,0,0); /* fxmr */
+ case AFSMOVP: return OPVCC(0,800,0,0); /* fsmtp */
+ case AFPMOVS: return OPVCC(0,928,0,0); /* fsmfp */
+
+ case AFXCPNPMA: return OPVCC(4,24,0,0);
+ case AFXCSNPMA: return OPVCC(4,25,0,0);
+ case AFXCPNSMA: return OPVCC(4,26,0,0);
+ case AFXCSNSMA: return OPVCC(4,27,0,0);
+ case AFXCXNPMA: return OPVCC(4,29,0,0);
+ case AFXCXNSMA: return OPVCC(4,30,0,0);
+ case AFXCXMA: return OPVCC(4,28,0,0);
+ case AFXCXNMS: return OPVCC(4,31,0,0);
+
case AICBI: return OPVCC(31,982,0,0);
case AISYNC: return OPVCC(19,150,0,0);
- /* lscb etc are not PowerPC instructions */
-
case AMTFSB0: return OPVCC(63,70,0,0);
case AMTFSB0CC: return OPVCC(63,70,0,1);
case AMTFSB1: return OPVCC(63,38,0,0);
@@ -1228,6 +1290,18 @@ oploadx(int a)
case AECIWX: return OPVCC(31,310,0,0); /* eciwx */
case ALWAR: return OPVCC(31,20,0,0); /* lwarx */
case ALSW: return OPVCC(31,533,0,0); /* lswx */
+ case AFMOVSS: return OPVCC(31,142,0,0); /* lfssx */
+ case AFMOVSSU: return OPVCC(31,174,0,0); /* lfssux */
+ case AFMOVSD: return OPVCC(31,206,0,0);
+ case AFMOVSDU: return OPVCC(31,238,0,0);
+ case AFMOVXS: return OPVCC(31,270,0,0);
+ case AFMOVSXU: return OPVCC(31,302,0,0);
+ case AFMOVXD: return OPVCC(31,334,0,0);
+ case AFMOVXDU: return OPVCC(31,366,0,0);
+ case AFMOVPS: return OPVCC(31,398,0,0);
+ case AFMOVPSU: return OPVCC(31,430,0,0);
+ case AFMOVPD: return OPVCC(31,462,0,0);
+ case AFMOVPDU: return OPVCC(31,494,0,0);
}
diag("bad loadx opcode %A", a);
return 0;
@@ -1287,6 +1361,19 @@ opstorex(int a)
case AMOVWBR: return OPVCC(31,662,0,0); /* stwbrx */
case ASTWCCC: return OPVCC(31,150,0,1); /* stwcx. */
case AECOWX: return OPVCC(31,438,0,0); /* ecowx */
+ case AFMOVSS: return OPVCC(31,654,0,0);
+/* case AFMOVSSU: return OPVCC(31,yy,0,0); */ /* stfssux not known */
+/* case AFMOVSD: return OPVCC(31,yy,0,0); */ /* stfsdx not known */
+ case AFMOVSDU: return OPVCC(31,750,0,0);
+ case AFMOVXS: return OPVCC(31,782,0,0);
+ case AFMOVSXU: return OPVCC(31,814,0,0);
+ case AFMOVXD: return OPVCC(31,846,0,0);
+ case AFMOVXDU: return OPVCC(31,878,0,0);
+ case AFMOVPS: return OPVCC(31,910,0,0);
+ case AFMOVPSU: return OPVCC(31,942,0,0);
+ case AFMOVPD: return OPVCC(31,974,0,0);
+ case AFMOVPDU: return OPVCC(31,1006,0,0);
+ case AFMOVPIW: return OPVCC(31,526,0,0); /* stfpiwx */
}
diag("unknown storex opcode %A", a);
return 0;
diff --git a/utils/ql/list.c b/utils/ql/list.c
index 28578779..04139dfc 100644
--- a/utils/ql/list.c
+++ b/utils/ql/list.c
@@ -141,7 +141,10 @@ Dconv(Fmt *fp)
case D_DCR:
if(a->name == D_NONE && a->sym == S) {
- sprint(str, "DCR(%ld)", a->offset);
+ if(a->reg == NREG)
+ sprint(str, "DCR(%ld)", a->offset);
+ else
+ sprint(str, "DCR(R%d)", a->reg);
break;
}
sprint(str, "DCR-GOK(%d)", a->reg);
diff --git a/utils/ql/mkfile b/utils/ql/mkfile
index 19391282..1296b005 100644
--- a/utils/ql/mkfile
+++ b/utils/ql/mkfile
@@ -4,14 +4,14 @@ TARG=ql
OFILES=\
asm.$O\
+ asmout.$O\
list.$O\
+ noop.$O\
obj.$O\
optab.$O\
pass.$O\
span.$O\
enam.$O\
- noop.$O\
- asmout.$O\
cnam.$O\
sched.$O\
$TARGMODEL.$O\
@@ -31,3 +31,6 @@ CFLAGS= $CFLAGS -I../include
enam.$O: ../qc/enam.c
$CC $CFLAGS ../qc/enam.c
+
+#cnam.c: l.h
+# rc mkcname
diff --git a/utils/ql/noop.c b/utils/ql/noop.c
index abb35057..bc17191e 100644
--- a/utils/ql/noop.c
+++ b/utils/ql/noop.c
@@ -501,7 +501,7 @@ addnop(Prog *p)
Prog *q;
q = prg();
- q->as = ANOR;
+ q->as = AOR;
q->line = p->line;
q->from.type = D_REG;
q->from.reg = REGZERO;
diff --git a/utils/ql/obj.c b/utils/ql/obj.c
index a4e76c1c..adff8dfd 100644
--- a/utils/ql/obj.c
+++ b/utils/ql/obj.c
@@ -6,6 +6,9 @@
#define DEFAULT '9'
#endif
+#define OANAME 229 /* old ANAME */
+
+
char *noname = "<none>";
char symname[] = SYMDEF;
char thechar = 'q';
@@ -718,35 +721,39 @@ loop:
bloc = buf.xbuf;
goto loop;
}
- o = bloc[0]; /* as */
+ o = bloc[0] | (bloc[1] << 8); /* as */
+ if(bloc[0] == OANAME && o != OANAME) {
+ diag("%s: probably old .q file\n", pn);
+ errorexit();
+ }
if(o <= 0 || o >= ALAST) {
diag("%s: opcode out of range %d", pn, o);
- print(" probably not a .q file\n");
+ print(" probably not a .%c file\n", thechar);
errorexit();
}
if(o == ANAME || o == ASIGNAME) {
sig = 0;
if(o == ASIGNAME) {
- sig = bloc[1] | (bloc[2]<<8) | (bloc[3]<<16) | (bloc[4]<<24);
+ sig = bloc[2] | (bloc[3]<<8) | (bloc[4]<<16) | (bloc[5]<<24);
bloc += 4;
c -= 4;
}
- stop = memchr(&bloc[3], 0, bsize-&bloc[3]);
+ stop = memchr(&bloc[4], 0, bsize-&bloc[4]);
if(stop == 0){
bsize = readsome(f, buf.xbuf, bloc, bsize, c);
if(bsize == 0)
goto eof;
bloc = buf.xbuf;
- stop = memchr(&bloc[3], 0, bsize-&bloc[3]);
+ stop = memchr(&bloc[4], 0, bsize-&bloc[4]);
if(stop == 0){
fprint(2, "%s: name too long\n", pn);
errorexit();
}
}
- v = bloc[1]; /* type */
- o = bloc[2]; /* sym */
- bloc += 3;
- c -= 3;
+ v = bloc[2]; /* type */
+ o = bloc[3]; /* sym */
+ bloc += 4;
+ c -= 4;
r = 0;
if(v == D_STATIC)
@@ -789,12 +796,12 @@ loop:
hunk += sizeof(Prog);
p->as = o;
- p->reg = bloc[1] & 0x3f;
- if(bloc[1] & 0x80)
+ p->reg = bloc[2] & 0x3f;
+ if(bloc[2] & 0x80)
p->mark = NOSCHED;
- p->line = bloc[2] | (bloc[3]<<8) | (bloc[4]<<16) | (bloc[5]<<24);
- r = zaddr(bloc+6, &p->from, h) + 6;
- if(bloc[1] & 0x40)
+ p->line = bloc[3] | (bloc[4]<<8) | (bloc[5]<<16) | (bloc[6]<<24);
+ r = zaddr(bloc+7, &p->from, h) + 7;
+ if(bloc[2] & 0x40)
r += zaddr(bloc+r, &p->from3, h);
else
p->from3 = zprg.from3;
diff --git a/utils/ql/optab.c b/utils/ql/optab.c
index 8a9de1bb..57813f7f 100644
--- a/utils/ql/optab.c
+++ b/utils/ql/optab.c
@@ -206,6 +206,8 @@ Optab optab[] =
{ AFMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, 7, 4, REGZERO },
{ AFMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, 74, 8, 0 },
+ { AFPMOVD, C_FREG, C_NONE, C_NONE, C_FREG, 33, 4, 0 },
+
{ ASYNC, C_NONE, C_NONE, C_NONE, C_NONE, 46, 4, 0 },
{ AWORD, C_LCON, C_NONE, C_NONE, C_NONE, 40, 4, 0 },
@@ -285,5 +287,13 @@ Optab optab[] =
{ AMACCHW, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0 }, /* op rb,ra,rt */
+ { AFMOVSS, C_ZOREG, C_REG, C_NONE, C_FREG, 45, 4, 0 },
+ { AFMOVSS, C_ZOREG, C_NONE, C_NONE, C_FREG, 45, 4, 0 },
+ { AFMOVSS, C_FREG, C_REG, C_NONE, C_ZOREG, 44, 4, 0 },
+ { AFMOVSS, C_FREG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0 },
+
+ { AFMOVPIW, C_FREG, C_REG, C_NONE, C_ZOREG, 44, 4, 0 },
+ { AFMOVPIW, C_FREG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0 },
+
{ AXXX, C_NONE, C_NONE, C_NONE, C_NONE, 0, 4, 0 },
};
diff --git a/utils/ql/span.c b/utils/ql/span.c
index b3ae1dd4..4a23f68f 100644
--- a/utils/ql/span.c
+++ b/utils/ql/span.c
@@ -4,16 +4,19 @@
void
span(void)
{
- Prog *p;
+ Prog *p, *q;
Sym *setext;
Optab *o;
- int m;
- long c;
+ int m, bflag;
+ long c, otxt;
if(debug['v'])
Bprint(&bso, "%5.2f span\n", cputime());
Bflush(&bso);
+
+ bflag = 0;
c = INITTEXT;
+ otxt = c;
for(p = firstp; p != P; p = p->link) {
p->pc = c;
o = oplook(p);
@@ -33,6 +36,10 @@ span(void)
}
if(p->from.sym != S)
p->from.sym->value = c;
+ /* need passes to resolve branches? */
+ if(c-otxt >= (1L<<15))
+ bflag = c;
+ otxt = c;
continue;
}
if(p->as != ANOP)
@@ -41,7 +48,60 @@ span(void)
}
c += m;
}
- c = rnd(c, 4);
+
+ /*
+ * if any procedure is large enough to
+ * generate a large SBRA branch, then
+ * generate extra passes putting branches
+ * around jmps to fix. this is rare.
+ */
+ while(bflag) {
+ if(debug['v'])
+ Bprint(&bso, "%5.2f span1\n", cputime());
+ bflag = 0;
+ c = INITTEXT;
+ for(p = firstp; p != P; p = p->link) {
+ p->pc = c;
+ o = oplook(p);
+ if((o->type == 16 || o->type == 17) && p->cond) {
+ otxt = p->cond->pc - c;
+ if(otxt < -(1L<<16)+10 || otxt >= (1L<<15)-10) {
+ q = prg();
+ q->link = p->link;
+ p->link = q;
+ q->as = ABR;
+ q->to.type = D_BRANCH;
+ q->cond = p->cond;
+ p->cond = q;
+ q = prg();
+ q->link = p->link;
+ p->link = q;
+ q->as = ABR;
+ q->to.type = D_BRANCH;
+ q->cond = q->link->link;
+ addnop(p->link);
+ addnop(p);
+ bflag = 1;
+ }
+ }
+ m = o->size;
+ if(m == 0) {
+ if(p->as == ATEXT) {
+ curtext = p;
+ autosize = p->to.offset + 4;
+ if(p->from.sym != S)
+ p->from.sym->value = c;
+ continue;
+ }
+ if(p->as != ANOP)
+ diag("zero-width instruction\n%P", p);
+ continue;
+ }
+ c += m;
+ }
+ }
+
+ c = rnd(c, 8);
setext = lookup("etext", 0);
if(setext != S) {
@@ -224,8 +284,9 @@ aclass(Adr *a)
instoffset = s->value + a->offset + INITDAT;
if(dlm)
return C_LCON;
-/* not sure why this barfs */
-return C_LCON;
+ /* not sure why this barfs */
+ return C_LCON;
+ /*
if(instoffset == 0)
return C_ZCON;
if(instoffset >= -0x8000 && instoffset <= 0xffff)
@@ -233,6 +294,7 @@ return C_LCON;
if((instoffset & 0xffff) == 0)
return C_UCON;
return C_LCON;
+ */
case D_AUTO:
instoffset = autosize + a->offset;
@@ -437,6 +499,8 @@ buildop(void)
case AECOWX: /* indexed store: op s,(b+a); op s,(b) */
oprange[ASTWCCC] = oprange[r];
break;
+ case AFMOVPIW: /* indexed floating store */
+ break;
case AREM: /* macro */
oprange[AREMCC] = oprange[r];
oprange[AREMV] = oprange[r];
@@ -564,11 +628,6 @@ buildop(void)
oprange[ANMACLHWV] = oprange[r];
oprange[ANMACLHWVCC] = oprange[r];
break;
-/* floating point move *//*
- oprange[AFMR] = oprange[r];
- oprange[AFMRCC] = oprange[r];
-*/
-/**/
case AMOVBZ: /* lbz, stz, rlwm(r/r), lhz, lha, stz, and x variants */
oprange[AMOVH] = oprange[r];
oprange[AMOVHZ] = oprange[r];
@@ -647,6 +706,25 @@ buildop(void)
oprange[AFCTIWCC] = oprange[r];
oprange[AFCTIWZ] = oprange[r];
oprange[AFCTIWZCC] = oprange[r];
+ oprange[AFRES] = oprange[r];
+ oprange[AFRESCC] = oprange[r];
+ oprange[AFRSQRTE] = oprange[r];
+ oprange[AFRSQRTECC] = oprange[r];
+ oprange[AFSQRT] = oprange[r];
+ oprange[AFSQRTCC] = oprange[r];
+ oprange[AFSQRTS] = oprange[r];
+ oprange[AFSQRTSCC] = oprange[r];
+ oprange[AFPRE] = oprange[r];
+ oprange[AFPRSQRTE] = oprange[r];
+ oprange[AFPABS] = oprange[r];
+ oprange[AFPNEG] = oprange[r];
+ oprange[AFPRSP] = oprange[r];
+ oprange[AFPNABS] = oprange[r];
+ oprange[AFSABS] = oprange[r];
+ oprange[AFSNEG] = oprange[r];
+ oprange[AFSNABS] = oprange[r];
+ oprange[AFPCTIW] = oprange[r];
+ oprange[AFPCTIWZ] = oprange[r];
break;
case AFADD:
oprange[AFADDS] = oprange[r];
@@ -660,6 +738,8 @@ buildop(void)
oprange[AFSUBS] = oprange[r];
oprange[AFSUBCC] = oprange[r];
oprange[AFSUBSCC] = oprange[r];
+ oprange[AFPADD] = oprange[r];
+ oprange[AFPSUB] = oprange[r];
break;
case AFMADD:
oprange[AFMADDCC] = oprange[r];
@@ -677,11 +757,42 @@ buildop(void)
oprange[AFNMSUBCC] = oprange[r];
oprange[AFNMSUBS] = oprange[r];
oprange[AFNMSUBSCC] = oprange[r];
+ oprange[AFSEL] = oprange[r];
+ oprange[AFSELCC] = oprange[r];
+ oprange[AFPSEL] = oprange[r];
+ oprange[AFPMADD] = oprange[r];
+ oprange[AFXMADD] = oprange[r];
+ oprange[AFXCPMADD] = oprange[r];
+ oprange[AFXCSMADD] = oprange[r];
+ oprange[AFPNMADD] = oprange[r];
+ oprange[AFXNMADD] = oprange[r];
+ oprange[AFXCPNMADD] = oprange[r];
+ oprange[AFXCSNMADD] = oprange[r];
+ oprange[AFPMSUB] = oprange[r];
+ oprange[AFXMSUB] = oprange[r];
+ oprange[AFXCPMSUB] = oprange[r];
+ oprange[AFXCSMSUB] = oprange[r];
+ oprange[AFPNMSUB] = oprange[r];
+ oprange[AFXNMSUB] = oprange[r];
+ oprange[AFXCPNMSUB] = oprange[r];
+ oprange[AFXCSNMSUB] = oprange[r];
+ oprange[AFXCPNPMA] = oprange[r];
+ oprange[AFXCSNPMA] = oprange[r];
+ oprange[AFXCPNSMA] = oprange[r];
+ oprange[AFXCSNSMA] = oprange[r];
+ oprange[AFXCXNPMA] = oprange[r];
+ oprange[AFXCXNSMA] = oprange[r];
+ oprange[AFXCXMA] = oprange[r];
+ oprange[AFXCXNMS] = oprange[r];
break;
case AFMUL:
oprange[AFMULS] = oprange[r];
oprange[AFMULCC] = oprange[r];
oprange[AFMULSCC] = oprange[r];
+ oprange[AFPMUL] = oprange[r];
+ oprange[AFXMUL] = oprange[r];
+ oprange[AFXPMUL] = oprange[r];
+ oprange[AFXSMUL] = oprange[r];
break;
case AFCMPO:
oprange[AFCMPU] = oprange[r];
@@ -734,6 +845,12 @@ buildop(void)
oprange[AFMOVS] = oprange[r];
oprange[AFMOVSU] = oprange[r];
break;
+ case AFPMOVD:
+ oprange[AFSMOVD] = oprange[r];
+ oprange[AFXMOVD] = oprange[r];
+ oprange[AFSMOVP] = oprange[r];
+ oprange[AFPMOVS] = oprange[r];
+ break;
case AECIWX:
oprange[ALWAR] = oprange[r];
break;
@@ -744,6 +861,19 @@ buildop(void)
case AMOVHBR:
oprange[AMOVWBR] = oprange[r];
break;
+ case AFMOVSS: /* indexed floating loads and stores (fp2) */
+ oprange[AFMOVSSU] = oprange[r];
+ oprange[AFMOVSD] = oprange[r];
+ oprange[AFMOVSDU] = oprange[r];
+ oprange[AFMOVXS] = oprange[r];
+ oprange[AFMOVSXU] = oprange[r];
+ oprange[AFMOVXD] = oprange[r];
+ oprange[AFMOVXDU] = oprange[r];
+ oprange[AFMOVPS] = oprange[r];
+ oprange[AFMOVPSU] = oprange[r];
+ oprange[AFMOVPD] = oprange[r];
+ oprange[AFMOVPDU] = oprange[r];
+ break;
case AADD:
case AANDCC: /* and. Rb,Rs,Ra; andi. $uimm,Rs,Ra; andis. $uimm,Rs,Ra */
case ACMP: