mesa: Resurrect SPARC asm code.
authorDavid S. Miller <davem@davemloft.net>
Thu, 26 Feb 2009 13:35:15 +0000 (05:35 -0800)
committerBrian Paul <brianp@vmware.com>
Fri, 27 Feb 2009 01:29:48 +0000 (18:29 -0700)
commit857ac1e817808f4b6bf985679162d0e3d709e5b5
treed023570b1faaa91088d05111aaebe98e7c424d27
parentb12dc74f86c611483465c08504dc8a564f927b15
mesa: Resurrect SPARC asm code.

This rewrites the sparc GLAPI code so that it's PIC friendly and works
with all of the TLS/PTHREADS/64-bit/32-bit combinations properly.

As a result we can turn SPARC asm back on.  Currently it's only
enabled on Linux, as that's the only place where I can test this
stuff out.

For the moment the cliptest SPARC asm routines are disabled as they
are non-working.  The problem is that they use register %g7 as a
temporary which is where the threading libraries store the thread
pointer on SPARC.  I will fix that code up in a future change as it's
a pretty important routine to optimize.

Like x86 we do the runtime patch as a pthread once-invoked initializer
in init_glapi_relocs().

Unlike x86, however, our GLAPI stubs on SPARC are just two instruction
sequences that branch to a trampoline and put the GLAPI offset into a
register.  The trampoline is what we run-time patch.  The stubs thus
all look like:

glFoo:
ba __glapi_sparc_foo_stub
 sethi GLAPI_OFFSET(glFOO) * PTR_SIZE, %g3

This actually makes generate_entrypoint() a lot simpler on SPARC.  For
this case in generate_entrypoint() we generate stubs using a 'call'
instead of the 'ba' above to make sure it can reach.

In order to get a proper tail call going here, in the unpatched case,
we do several tricks.  To get the current PC, for example, we save the
return address register into a temporary, do a call, save the return
address register written by the call to another temporary, then
restore the original return address register value.  This is to
avoid having to allocate a stack frame.

This is necessary for PIC address formation.

This new GLAPI scheme lets us get rid of the ugly SPARC GLAPI hacks in
__glXInitialize() and one_time_init().

Signed-off-by: David S. Miller <davem@davemloft.net>
configure.ac
src/glx/x11/glxext.c
src/mesa/glapi/gl_SPARC_asm.py
src/mesa/glapi/glapi.c
src/mesa/glapi/glapi_getproc.c
src/mesa/main/context.c
src/mesa/sparc/glapi_sparc.S
src/mesa/sparc/sparc.c
src/mesa/sparc/sparc.h