summaryrefslogtreecommitdiff
path: root/utils/ql/asmout.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/ql/asmout.c')
-rw-r--r--utils/ql/asmout.c77
1 files changed, 41 insertions, 36 deletions
diff --git a/utils/ql/asmout.c b/utils/ql/asmout.c
index 96cb3df3..4e685a9c 100644
--- a/utils/ql/asmout.c
+++ b/utils/ql/asmout.c
@@ -672,16 +672,24 @@ asmout(Prog *p, Optab *o, int aflag)
if(p->from.type == D_REG) {
r = p->from.reg;
v = p->to.offset;
- if(p->to.type == D_DCR)
- o1 = OPVCC(31,451,0,0); /* mtdcr */
- else
+ if(p->to.type == D_DCR) {
+ if(p->to.reg != NREG) {
+ o1 = OPVCC(31,387,0,0); /* mtdcrx */
+ v = p->to.reg;
+ }else
+ o1 = OPVCC(31,451,0,0); /* mtdcr */
+ }else
o1 = OPVCC(31,467,0,0); /* mtspr */
} else {
r = p->to.reg;
v = p->from.offset;
- if(p->from.type == D_DCR)
- o1 = OPVCC(31,323,0,0); /* mfdcr */
- else
+ if(p->from.type == D_DCR) {
+ if(p->from.reg != NREG) {
+ o1 = OPVCC(31,259,0,0); /* mfdcrx */
+ v = p->from.reg;
+ }else
+ o1 = OPVCC(31,323,0,0); /* mfdcr */
+ }else
o1 = OPVCC(31,339,0,0); /* mfspr */
}
o1 = AOP_RRR(o1, r, 0, 0) | ((v&0x1f)<<16) | (((v>>5)&0x1f)<<11);
@@ -984,25 +992,22 @@ oprrr(int a)
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 AFMOVSPD: return OPVCC(0,800,0,0); /* fsmtp */
+ case AFMOVPSD: return OPVCC(0,928,0,0); /* fsmfp */
case AFXCPNPMA: return OPVCC(4,24,0,0);
case AFXCSNPMA: return OPVCC(4,25,0,0);
@@ -1290,18 +1295,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);
+ case AFSMOVS: return OPVCC(31,142,0,0); /* lfssx */
+ case AFSMOVSU: return OPVCC(31,174,0,0); /* lfssux */
+ case AFSMOVD: return OPVCC(31,206,0,0); /* lfsdx */
+ case AFSMOVDU: return OPVCC(31,238,0,0); /* lfsdux */
+ case AFXMOVS: return OPVCC(31,270,0,0); /* lfxsx */
+ case AFXMOVSU: return OPVCC(31,302,0,0); /* lfxsux */
+ case AFXMOVD: return OPVCC(31,334,0,0); /* lfxdx */
+ case AFXMOVDU: return OPVCC(31,366,0,0); /* lfxdux */
+ case AFPMOVS: return OPVCC(31,398,0,0); /* lfpsx */
+ case AFPMOVSU: return OPVCC(31,430,0,0); /* lfpsux */
+ case AFPMOVD: return OPVCC(31,462,0,0); /* lfpdx */
+ case AFPMOVDU: return OPVCC(31,494,0,0); /* lfpdux */
}
diag("bad loadx opcode %A", a);
return 0;
@@ -1361,19 +1366,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 */
+ case AFSMOVS: return OPVCC(31,654,0,0); /* stfssx */
+/* case AFSMOVSU: return OPVCC(31,yy,0,0); */ /* stfssux not known */
+/* case AFSMOVD: return OPVCC(31,yy,0,0); */ /* stfsdx not known */
+ case AFSMOVDU: return OPVCC(31,750,0,0); /* stfsdux */
+ case AFXMOVS: return OPVCC(31,782,0,0); /* stfxsx */
+ case AFXMOVSU: return OPVCC(31,814,0,0); /* stfxsux */
+ case AFXMOVD: return OPVCC(31,846,0,0); /* stfxdx */
+ case AFXMOVDU: return OPVCC(31,878,0,0); /* stfxdux */
+ case AFPMOVS: return OPVCC(31,910,0,0); /* stfpsx */
+ case AFPMOVSU: return OPVCC(31,942,0,0); /* stfpsux */
+ case AFPMOVD: return OPVCC(31,974,0,0); /* stfpdx */
+ case AFPMOVDU: return OPVCC(31,1006,0,0); /* stfpdux */
+ case AFPMOVIW: return OPVCC(31,526,0,0); /* stfpiwx */
}
diag("unknown storex opcode %A", a);
return 0;