Date: Sat, 21 Dec 2002 14:57:41 +1100 From: Tim Robbins <tjr@FreeBSD.ORG> To: Joe Marcus Clarke <marcus@marcuscom.com> Cc: current@FreeBSD.ORG Subject: Re: WEIRD! div() broken on -CURRENT? Message-ID: <20021221145741.A14018@dilbert.robbins.dropbear.id.au> In-Reply-To: <1040437478.29101.23.camel@shumai.marcuscom.com>; from marcus@marcuscom.com on Fri, Dec 20, 2002 at 09:24:39PM -0500 References: <1040437478.29101.23.camel@shumai.marcuscom.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Dec 20, 2002 at 09:24:39PM -0500, Joe Marcus Clarke wrote: > Okay, I must be losing my mind. Does anyone know why the following > program compiled with stock gcc-3.2.1, stock CFLAGS, and no CPUTYPE > produces: > > ddy.quot = 1 > ddy.rem = -1077937744 > > on -CURRENT, and: > > ddy.quot = 8 > ddy.rem = 0 > > On -stable? > > #include <stdlib.h> > #include <stdio.h> > > main(void) { > div_t ddy; > int dy, dy_frac; > > ddy = div (768, 96); > dy = ddy.quot; > dy_frac = ddy.rem; > > printf("ddy.quot = %d\n", dy); > printf("ddy.rem = %d\n", dy_frac); > > return 0; > } > > > cc -O -pipe -o xxx xxx.c > > I'm doing something wrong, right? I mean, this can't be right. I've > verified this now on a P4 running: [...] I can reproduce it here. It looks like gcc is using a strange calling convention that the i386 div.S does not understand (MI div.c seems to, though). It's generating the following code: 0x8048541 <main+9>: mov $0x0,%eax 0x8048546 <main+14>: sub %eax,%esp 0x8048548 <main+16>: lea 0xfffffff8(%ebp),%eax 0x804854b <main+19>: sub $0x4,%esp 0x804854e <main+22>: push $0x60 0x8048550 <main+24>: push $0x300 0x8048555 <main+29>: push %eax 0x8048556 <main+30>: call 0x80483ec <div> 0x804855b <main+35>: add $0xc,%esp At the time of the call to div(): (gdb) x/4w $esp 0xbfbffbbc: 0x0804855b 0xbfbffbe8 0x00000300 0x00000060 It looks like gcc might be pushing the address of "ddy" and expecting div() to put the result in there. Microsoft C 12 generates this code: sub esp, 8 push 96 ; 00000060H push 768 ; 00000300H call _div add esp, 8 mov DWORD PTR [ebp], eax mov DWORD PTR [ebp+4], edx Tim To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021221145741.A14018>