FW: RE: x86_64 port

Duncan Coutts duncan.coutts at worcester.oxford.ac.uk
Mon Mar 7 12:37:33 EST 2005


In message <20050307171501.GA15936 at old.davidb.org> David Brown
<haskell at davidb.org> writes:
> On Mon, Mar 07, 2005 at 04:59:38PM -0000, Simon Marlow wrote:
> 
> > The mystery as to why this doesn't affect us on x86 is solved: on x86 we
> > generate slightly different C code, including a dummy function call:
> > 
> > extern void g(void);
> > static void f(void) {
> >   R1 = g;
> >   dummy();
> >   goto *R1;
> > }
> > 
> > the call to dummy() (which we filter out from the assembly later) is
> > enough to force gcc to emit the assignment to R1.  That dummy function
> > call has been there for ever, and the original reason for it has been
> > lost in the mists of time... comments in the source code seemed to
> > indicate that it was probably not necessary any more, so for x86_64 I
> > removed it.  It looks like I'll have to reinstate it to work around this
> > bug, though.

This all appears to be the same for Sparc. With:

register void * R1 __asm__("%g7");

extern void g(void);
static void f(void) {
 R1 = g;
 goto *R1;
}

(BTW I have no idea if register g7 is a sensible choice here! So this test may
be meaningless!)

We get:

sethi   %hi(g), %g1
jmp     %g1+%lo(g)
nop

While with the dummy() call inserted:

sethi   %hi(g), %g1
call    dummy, 0
or      %g1, %lo(g), %g7
jmp     %g7
nop

we actually get any mention of %g7 at all.

This is with gcc 3.3.5 on Sparc Linux (Gentoo).

Duncan


More information about the Glasgow-haskell-users mailing list