path: root/
diff options
authorDavid S. Miller <>2009-02-26 05:35:15 -0800
committerBrian Paul <>2009-02-26 18:29:48 -0700
commit857ac1e817808f4b6bf985679162d0e3d709e5b5 (patch)
treed023570b1faaa91088d05111aaebe98e7c424d27 /
parentb12dc74f86c611483465c08504dc8a564f927b15 (diff)
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 <>
Diffstat (limited to '')
1 files changed, 13 insertions, 0 deletions
diff --git a/ b/
index a57e5b3ea7a..2f3f0beff10 100644
--- a/
+++ b/
@@ -307,6 +307,13 @@ if test "x$enable_asm" = xyes; then
+ sparc*)
+ case "$host_os" in
+ linux*)
+ asm_arch=sparc
+ ;;
+ esac
+ ;;
case "$asm_arch" in
@@ -327,6 +334,12 @@ if test "x$enable_asm" = xyes; then
AC_MSG_RESULT([yes, ppc])
+ sparc)
+ AC_MSG_RESULT([yes, sparc])
+ ;;
AC_MSG_RESULT([no, platform not supported])