From 5d5e9f74cb365bcfc6fc14703d1b2e526233b679 Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Mon, 15 Sep 2008 15:03:10 -0700 Subject: [PATCH] bug - divide and mod of a byte R=r OCL=15370 CL=15370 --- src/cmd/6g/gen.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/cmd/6g/gen.c b/src/cmd/6g/gen.c index fcd070c478..34b14ec652 100644 --- a/src/cmd/6g/gen.c +++ b/src/cmd/6g/gen.c @@ -1001,26 +1001,34 @@ dodiv(int op, Node *nl, Node *nr, Node *res, Node *ax, Node *dx) { int a; Node n3; + Type *t; - a = optoas(op, nl->type); + t = nl->type; + if(t->width == 1) { + if(issigned[t->etype]) + t = types[TINT32]; + else + t = types[TUINT32]; + } + a = optoas(op, t); - if(!issigned[nl->type->etype]) { - nodconst(&n3, nl->type, 0); + if(!issigned[t->etype]) { + nodconst(&n3, t, 0); gmove(&n3, dx); } regalloc(&n3, nr->type, N); if(nl->ullman >= nr->ullman) { cgen(nl, ax); - if(issigned[nl->type->etype]) - gins(optoas(OFOR, nl->type), N, N); + if(issigned[t->etype]) + gins(optoas(OFOR, t), N, N); cgen(nr, &n3); gins(a, &n3, N); } else { cgen(nr, &n3); cgen(nl, ax); - if(issigned[nl->type->etype]) - gins(optoas(OFOR, nl->type), N, N); + if(issigned[t->etype]) + gins(optoas(OFOR, t), N, N); gins(a, &n3, N); } regfree(&n3); -- 2.48.1