From: Rémy Oudompheng Date: Mon, 26 Nov 2012 20:31:42 +0000 (+0100) Subject: cmd/8l: fix data corruption for MULB SI, X-Git-Tag: go1.1rc2~1789 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=54023a94a6d7a282571ab18da7862a909d36d894;p=gostls13.git cmd/8l: fix data corruption for MULB SI, The 8l linker automatically inserts XCHG instructions to support otherwise impossible byte registers (only available on AX, BX, CX, DX). Sometimes AX or DX is needed (for MUL and DIV) so we need to avoid clobbering them. R=golang-dev, dave, iant, iant, rsc CC=golang-dev https://golang.org/cl/6846057 --- diff --git a/src/cmd/6l/span.c b/src/cmd/6l/span.c index abffc2935c..a181178680 100644 --- a/src/cmd/6l/span.c +++ b/src/cmd/6l/span.c @@ -1618,7 +1618,9 @@ bad: pp = *p; z = p->from.type; if(z >= D_BP && z <= D_DI) { - if(isax(&p->to)) { + if(isax(&p->to) || p->to.type == D_NONE) { + // We certainly don't want to exchange + // with AX if the op is MUL or DIV. *andptr++ = 0x87; /* xchg lhs,bx */ asmando(&p->from, reg[D_BX]); subreg(&pp, z, D_BX); diff --git a/src/cmd/8l/span.c b/src/cmd/8l/span.c index d90ddc2233..9e3447c2d2 100644 --- a/src/cmd/8l/span.c +++ b/src/cmd/8l/span.c @@ -1272,7 +1272,9 @@ bad: pp = *p; z = p->from.type; if(z >= D_BP && z <= D_DI) { - if(isax(&p->to)) { + if(isax(&p->to) || p->to.type == D_NONE) { + // We certainly don't want to exchange + // with AX if the op is MUL or DIV. *andptr++ = 0x87; /* xchg lhs,bx */ asmand(&p->from, reg[D_BX]); subreg(&pp, z, D_BX);