summaryrefslogtreecommitdiff
path: root/src/cmd/6g
diff options
context:
space:
mode:
authorR?my Oudompheng <oudomphe@phare.normalesup.org>2014-04-04 08:42:35 +0200
committerR?my Oudompheng <oudomphe@phare.normalesup.org>2014-04-04 08:42:35 +0200
commit90f5d533900f77edad7ba64cc2a3b5e6e35c87e1 (patch)
tree2cca046c6ca6a4cc269c6a4f11e2a9c5f502e432 /src/cmd/6g
parentba0dbd9ff61b18bb63d4cee85ffe701c0c334088 (diff)
downloadgo-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.c2
-rw-r--r--src/cmd/6g/ggen.c4
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)+