X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2FStgCRun.c;h=e28353c35332d72e558a03e9aaa007c4dc7bafd4;hp=16158bdeb7f5bd26b1c84c634349c3f3832890eb;hb=e5c3b478b3cd1707cf122833822f44b2ac09b8e9;hpb=79adecdb64e642f507e5113757ca69bc64df6bdc diff --git a/rts/StgCRun.c b/rts/StgCRun.c index 16158bd..e28353c 100644 --- a/rts/StgCRun.c +++ b/rts/StgCRun.c @@ -34,7 +34,6 @@ #include "PosixSource.h" - /* * We define the following (unused) global register variables, because for * some reason gcc generates sub-optimal code for StgRun() on the Alpha @@ -66,11 +65,12 @@ register double fake_f9 __asm__("$f9"); /* include Stg.h first because we want real machine regs in here: we * have to get the value of R1 back from Stg land to C land intact. */ +// yeuch +#define IN_STGCRUN 1 #include "Stg.h" #include "Rts.h" + #include "StgRun.h" -#include "RtsFlags.h" -#include "OSThreads.h" #include "Capability.h" #ifdef DEBUG @@ -87,13 +87,11 @@ register double fake_f9 __asm__("$f9"); StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg STG_UNUSED) { while (f) { - /* XXX Disabled due to RtsFlags[]/RtsFlags mismatch IF_DEBUG(interpreter, debugBelch("Jumping to "); printPtr((P_)f); fflush(stdout); debugBelch("\n"); ); - */ f = (StgFunPtr) (f)(); } return (StgRegTable *)R1.p; @@ -124,7 +122,7 @@ StgFunPtr StgReturn(void) #ifdef i386_HOST_ARCH -#ifdef darwin_TARGET_OS +#ifdef darwin_HOST_OS #define STG_GLOBAL ".globl " #else #define STG_GLOBAL ".global " @@ -854,7 +852,7 @@ StgRunIsImplementedInAssembler(void) loc32: saved ar.lc loc33: saved pr f2 - f5: preserved floating-point registers - f16 - f21: preserved floating-point registers + f16 - f23: preserved floating-point registers -------------------------------------------------------------------------- */ #ifdef ia64_HOST_ARCH @@ -865,7 +863,7 @@ StgRunIsImplementedInAssembler(void) /* We don't spill all the callee-save FP registers, only the ones that * gcc has been observed to use */ -#define PRESERVED_FP_REGISTERS 10 +#define PRESERVED_FP_REGISTERS 12 /* We always allocate 34 local and 8 output registers. As long as gcc used * fewer than 32 locals, the mangler will adjust the stack frame accordingly. */ @@ -890,7 +888,9 @@ StgRunIsImplementedInAssembler(void) "\tstf.spill [r17] = f19,32\n" "\tmov loc30 = b0 ;;\n" /* save return address */ "\tstf.spill [r16] = f20,32\n" - "\tstf.spill [r17] = f21,32\n" + "\tstf.spill [r17] = f21,32 ;;\n" + "\tstf.spill [r16] = f22,32\n" + "\tstf.spill [r17] = f23,32\n" "\tmov loc32 = ar.lc ;;\n" /* save loop counter */ "\tstf.spill [r16] = f2,32\n" "\tstf.spill [r17] = f3,32\n" @@ -912,9 +912,11 @@ StgRunIsImplementedInAssembler(void) "\tldf.fill f20 = [r16],32\n" "\tldf.fill f21 = [r17],32\n" "\tmov ar.lc = loc32 ;;\n" /* restore loop counter */ + "\tldf.fill f22 = [r16],32\n" + "\tldf.fill f23 = [r17],32\n" + "\tmov pr = loc33 ;;\n" /* restore predicate registers */ "\tldf.fill f2 = [r16],32\n" "\tldf.fill f3 = [r17],32\n" - "\tmov pr = loc33\n" /* restore predicate registers */ "\tadds sp = %0, sp ;;\n" /* restore stack */ "\tldf.fill f4 = [r16],32\n" "\tldf.fill f5 = [r17],32\n"