From: Russ Cox Date: Wed, 5 Aug 2009 00:59:10 +0000 (-0700) Subject: fix division bug X-Git-Tag: weekly.2009-11-06~974 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d169dcee3b89753ea50189e4f5a00689d524c231;p=gostls13.git fix division bug R=ken OCL=32760 CL=32760 --- diff --git a/src/cmd/6g/ggen.c b/src/cmd/6g/ggen.c index d0f9ab3f91..f51839f49b 100644 --- a/src/cmd/6g/ggen.c +++ b/src/cmd/6g/ggen.c @@ -534,21 +534,46 @@ dodiv(int op, Node *nl, Node *nr, Node *res, Node *ax, Node *dx) void cgen_div(int op, Node *nl, Node *nr, Node *res) { - Node ax, dx; + Node ax, dx, oldax, olddx; int rax, rdx; + if(nl->ullman >= UINF || nr->ullman >= UINF) + fatal("cgen_div UINF"); + rax = reg[D_AX]; rdx = reg[D_DX]; - + nodreg(&ax, types[TINT64], D_AX); nodreg(&dx, types[TINT64], D_DX); regalloc(&ax, nl->type, &ax); regalloc(&dx, nl->type, &dx); + // save current ax and dx if they are live + memset(&oldax, 0, sizeof oldax); + memset(&olddx, 0, sizeof olddx); + if(rax > 0) { + regalloc(&oldax, nl->type, N); + gmove(&ax, &oldax); + } + if(rdx > 0) { + regalloc(&olddx, nl->type, N); + gmove(&dx, &olddx); + } + dodiv(op, nl, nr, res, &ax, &dx); regfree(&ax); regfree(&dx); + + if(rax > 0) { + gmove(&oldax, &ax); + regfree(&oldax); + } + if(rdx > 0) { + gmove(&olddx, &dx); + regfree(&olddx); + } + } /*