Commit 54023a94 authored by Rémy Oudompheng's avatar Rémy Oudompheng

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
parent af375cde
......@@ -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);
......
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment