X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGCThread.h;h=1b5c5d429182f897d3db4249c4f5a68468b109e5;hb=4f4dd70fd10ab13e41cb0f541bbfee2330d149da;hp=42d20bb2649050fd39b15a4d0d79c889db55a6a6;hpb=c1123a7dab90a0621db4f7f7e254614a6f3423a9;p=ghc-hetmet.git diff --git a/rts/sm/GCThread.h b/rts/sm/GCThread.h index 42d20bb..1b5c5d4 100644 --- a/rts/sm/GCThread.h +++ b/rts/sm/GCThread.h @@ -105,7 +105,7 @@ typedef struct step_workspace_ { GC thread object Every GC thread has one of these. It contains all the step specific - workspaces and other GC thread loacl information. At some later + workspaces and other GC thread local information. At some later point it maybe useful to move this other into the TLS store of the GC threads ------------------------------------------------------------------------- */ @@ -185,12 +185,20 @@ extern gc_thread **gc_threads; /* ----------------------------------------------------------------------------- The gct variable is thread-local and points to the current thread's gc_thread structure. It is heavily accessed, so we try to put gct - into a global register variable if possible. + into a global register variable if possible; if we don't have a + register then use gcc's __thread extension to create a thread-local + variable. + + Even on x86 where registers are scarce, it is worthwhile using a + register variable here: I measured about a 2-5% slowdown with the + __thread version. -------------------------------------------------------------------------- */ #define GLOBAL_REG_DECL(type,name,reg) register type name REG(reg); -#if defined(REG_Base) +#if defined(REG_Base) && !defined(i386_HOST_ARCH) +// on i386, REG_Base is %ebx which is also used for PIC, so we don't +// want to steal it GLOBAL_REG_DECL(gc_thread*, gct, REG_Base) #define DECLARE_GCT /* nothing */