diff options
author | R?my Oudompheng <oudomphe@phare.normalesup.org> | 2014-04-04 08:42:35 +0200 |
---|---|---|
committer | R?my Oudompheng <oudomphe@phare.normalesup.org> | 2014-04-04 08:42:35 +0200 |
commit | 90f5d533900f77edad7ba64cc2a3b5e6e35c87e1 (patch) | |
tree | 2cca046c6ca6a4cc269c6a4f11e2a9c5f502e432 /src/cmd/6g | |
parent | ba0dbd9ff61b18bb63d4cee85ffe701c0c334088 (diff) | |
download | go-90f5d533900f77edad7ba64cc2a3b5e6e35c87e1.tar.gz |
cmd/6g, cmd/8g: disable Duff's device on NaCl.
Native Client forbids jumps/calls to arbitrary locations and
enforces a particular alignement, which makes the Duff's device
ineffective.
LGTM=khr
R=rsc, dave, khr
CC=golang-codereviews
https://codereview.appspot.com/84400043
Diffstat (limited to 'src/cmd/6g')
-rw-r--r-- | src/cmd/6g/cgen.c | 2 | ||||
-rw-r--r-- | src/cmd/6g/ggen.c | 4 |
2 files changed, 3 insertions, 3 deletions
diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c index 9509232dc..eb45b29ea 100644 --- a/src/cmd/6g/cgen.c +++ b/src/cmd/6g/cgen.c @@ -1448,7 +1448,7 @@ sgen(Node *n, Node *ns, int64 w) gins(ACLD, N, N); } else { // normal direction - if(q > 128) { + if(q > 128 || (nacl && q >= 4)) { gconreg(movptr, q, D_CX); gins(AREP, N, N); // repeat gins(AMOVSQ, N, N); // MOVQ *(SI)+,*(DI)+ diff --git a/src/cmd/6g/ggen.c b/src/cmd/6g/ggen.c index b980a78c2..2633b19e4 100644 --- a/src/cmd/6g/ggen.c +++ b/src/cmd/6g/ggen.c @@ -77,7 +77,7 @@ zerorange(Prog *p, vlong frame, vlong lo, vlong hi, uint32 *ax) for(i = 0; i < cnt; i += widthreg) { p = appendpp(p, AMOVQ, D_AX, 0, D_SP+D_INDIR, frame+lo+i); } - } else if(cnt <= 128*widthreg) { + } else if(!nacl && (cnt <= 128*widthreg)) { p = appendpp(p, leaptr, D_SP+D_INDIR, frame+lo, D_DI, 0); p = appendpp(p, ADUFFZERO, D_NONE, 0, D_ADDR, 2*(128-cnt/widthreg)); p->to.sym = linksym(pkglookup("duffzero", runtimepkg)); @@ -1119,7 +1119,7 @@ clearfat(Node *nl) savex(D_AX, &ax, &oldax, N, types[tptr]); gconreg(AMOVL, 0, D_AX); - if(q > 128) { + if(q > 128 || (q >= 4 && nacl)) { gconreg(movptr, q, D_CX); gins(AREP, N, N); // repeat gins(ASTOSQ, N, N); // STOQ AL,*(DI)+ |