From d169dcee3b89753ea50189e4f5a00689d524c231 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 4 Aug 2009 17:59:10 -0700 Subject: [PATCH] fix division bug R=ken OCL=32760 CL=32760 --- src/cmd/6g/ggen.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) 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); + } + } /* -- 2.48.1