diff options
| author | forsyth <forsyth@vitanuova.com> | 2010-04-27 12:51:13 +0100 |
|---|---|---|
| committer | forsyth <forsyth@vitanuova.com> | 2010-04-27 12:51:13 +0100 |
| commit | d67b7dad77bb8aa973dad1f7c3ab0c309b114278 (patch) | |
| tree | 6794120fb327d6de19cf05eed53f80d877781a3e /utils/ql | |
| parent | 09da2e137d5eb0c940df35d989e4c31ec0654fc4 (diff) | |
20100427-1251
Diffstat (limited to 'utils/ql')
| -rw-r--r-- | utils/ql/asm.c | 70 | ||||
| -rw-r--r-- | utils/ql/asmout.c | 91 | ||||
| -rw-r--r-- | utils/ql/list.c | 5 | ||||
| -rw-r--r-- | utils/ql/mkfile | 7 | ||||
| -rw-r--r-- | utils/ql/noop.c | 2 | ||||
| -rw-r--r-- | utils/ql/obj.c | 35 | ||||
| -rw-r--r-- | utils/ql/optab.c | 10 | ||||
| -rw-r--r-- | utils/ql/span.c | 152 |
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: |
