summaryrefslogtreecommitdiff
path: root/src/liblink
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-08-14 11:57:10 -0400
committerRuss Cox <rsc@golang.org>2014-08-14 11:57:10 -0400
commita7d370d73398dc75e8191e7eccf7b9398b0dadf1 (patch)
tree35ded135a10198dad125c7b17e56e047c1854f67 /src/liblink
parente456ae86a6951a4c367019c2387cf4c9615f132a (diff)
downloadgo-a7d370d73398dc75e8191e7eccf7b9398b0dadf1.tar.gz
[dev.power64] liblink: fix $large(SP) for floating point load/store
Fixes test/cmplxdivide. LGTM=minux R=minux CC=golang-codereviews https://codereview.appspot.com/128190045
Diffstat (limited to 'src/liblink')
-rw-r--r--src/liblink/asm9.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/liblink/asm9.c b/src/liblink/asm9.c
index 352fba915..56582fe27 100644
--- a/src/liblink/asm9.c
+++ b/src/liblink/asm9.c
@@ -320,18 +320,18 @@ static Optab optab[] = {
{ AFMOVD, C_SAUTO,C_NONE, C_NONE, C_FREG, 8, 4, REGSP },
{ AFMOVD, C_SOREG,C_NONE, C_NONE, C_FREG, 8, 4, REGZERO },
- { AFMOVD, C_LEXT, C_NONE, C_NONE, C_FREG, 8, 4, REGSB },
- { AFMOVD, C_LAUTO,C_NONE, C_NONE, C_FREG, 8, 4, REGSP },
- { AFMOVD, C_LOREG,C_NONE, C_NONE, C_FREG, 8, 4, REGZERO },
+ { AFMOVD, C_LEXT, C_NONE, C_NONE, C_FREG, 36, 8, REGSB },
+ { AFMOVD, C_LAUTO,C_NONE, C_NONE, C_FREG, 36, 8, REGSP },
+ { AFMOVD, C_LOREG,C_NONE, C_NONE, C_FREG, 36, 8, REGZERO },
{ AFMOVD, C_ADDR, C_NONE, C_NONE, C_FREG, 75, 8, 0 },
{ AFMOVD, C_FREG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB },
{ AFMOVD, C_FREG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP },
{ AFMOVD, C_FREG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO },
- { AFMOVD, C_FREG, C_NONE, C_NONE, C_LEXT, 7, 4, REGSB },
- { AFMOVD, C_FREG, C_NONE, C_NONE, C_LAUTO, 7, 4, REGSP },
- { AFMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, 7, 4, REGZERO },
+ { AFMOVD, C_FREG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB },
+ { AFMOVD, C_FREG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP },
+ { AFMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO },
{ AFMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, 74, 8, 0 },
{ ASYNC, C_NONE, C_NONE, C_NONE, C_NONE, 46, 4, 0 },
@@ -1491,6 +1491,8 @@ asmout(Link *ctxt, Prog *p, Optab *o, int32 *out)
r = p->to.reg;
if(r0iszero && p->to.reg == 0)
ctxt->diag("literal operation on R0\n%P", p);
+ if((int16)v != v)
+ sysfatal("mishandled instruction %P", p);
o1 = AOP_IRR(opirr(ctxt, p->as), p->to.reg, r, v);
break;
@@ -1514,8 +1516,11 @@ asmout(Link *ctxt, Prog *p, Optab *o, int32 *out)
if(v)
ctxt->diag("illegal indexed instruction\n%P", p);
o1 = AOP_RRR(opstorex(ctxt, p->as), p->from.reg, p->reg, r);
- } else
+ } else {
+ if((int16)v != v)
+ sysfatal("mishandled instruction %P", p);
o1 = AOP_IRR(opstore(ctxt, p->as), p->from.reg, r, v);
+ }
break;
case 8: /* mov soreg, r ==> lbz/lhz/lwz o(r) */
@@ -1527,8 +1532,11 @@ asmout(Link *ctxt, Prog *p, Optab *o, int32 *out)
if(v)
ctxt->diag("illegal indexed instruction\n%P", p);
o1 = AOP_RRR(oploadx(ctxt, p->as), p->to.reg, p->reg, r);
- } else
+ } else {
+ if((int16)v != v)
+ sysfatal("mishandled instruction %P", p);
o1 = AOP_IRR(opload(ctxt, p->as), p->to.reg, r, v);
+ }
break;
case 9: /* movb soreg, r ==> lbz o(r),r2; extsb r2,r2 */