From: sof Date: Wed, 3 Sep 1997 23:49:16 +0000 (+0000) Subject: [project @ 1997-09-03 23:49:16 by sof] X-Git-Tag: Approximately_1000_patches_recorded~48 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=dffc2db23295e9d690ea9ac5e4a4081704586dba [project @ 1997-09-03 23:49:16 by sof] When doing -monly-x-regs, fix up entry and exit from PerformGC_wrapper --- diff --git a/ghc/driver/ghc-asm.lprl b/ghc/driver/ghc-asm.lprl index 65519e7..06a6416 100644 --- a/ghc/driver/ghc-asm.lprl +++ b/ghc/driver/ghc-asm.lprl @@ -1149,6 +1149,8 @@ sub print_doctored { local($exit_patch) = ''; local($call_entry_patch)= ''; local($call_exit_patch) = ''; + local($gc_call_entry_patch)= ''; # Patches before and after calls to Perform_GC_wrapper + local($gc_call_exit_patch) = ''; #OLD: # first, convert calls to *very magic form*: (ToDo: document # for real!) from @@ -1238,16 +1240,26 @@ sub print_doctored { # OK, now we can decide what our patch-up code is going to # be: + + # Note funky ".=" stuff; we're *adding* to these _patch guys if ( $StolenX86Regs <= 2 && ( /32\(\%ebx\)/ || /\%esi/ || /^\tcmps/ ) ) { # R1 (esi) $entry_patch .= "\tmovl \%esi,32(\%ebx)\n"; $exit_patch .= "\tmovl 32(\%ebx),\%esi\n"; + + $gc_call_entry_patch .= "\tmovl \%esi,32(\%ebx)\n"; + $gc_call_exit_patch .= "\tmovl 32(\%ebx),\%esi\n"; + # nothing for call_{entry,exit} because %esi is callee-save } if ( $StolenX86Regs <= 3 && ( /64\(\%ebx\)/ || /\%edi/ || /^\t(scas|cmps)/ ) ) { # SpA (edi) $entry_patch .= "\tmovl \%edi,64(\%ebx)\n"; $exit_patch .= "\tmovl 64(\%ebx),\%edi\n"; + + $gc_call_entry_patch .= "\tmovl \%edi,64(\%ebx)\n"; + $gc_call_exit_patch .= "\tmovl 64(\%ebx),\%edi\n"; + # nothing for call_{entry,exit} because %edi is callee-save } #= if ( $StolenX86Regs <= 4 @@ -1265,7 +1277,14 @@ sub print_doctored { # next, here we go with non-%esp patching! # s/^(\t[a-z])/$entry_patch$1/; # before first instruction - s/^(\tcall .*\n(\taddl \$\d+,\%esp\n)?)/$call_exit_patch$1$call_entry_patch/g; # _all_ calls + +# Actually, call_entry_patch and call_exit_patch never get set, +# so let's nuke this one +# s/^(\tcall .*\n(\taddl \$\d+,\%esp\n)?)/$call_exit_patch$1$call_entry_patch/g; # _all_ calls + +# Before calling GC we must set up the exit condition before the call +# and entry condition when we come back + s/^(\tcall ${T_DO_GC}\n(\taddl \$\d+,\%esp\n)?)/$gc_call_exit_patch$1$gc_call_entry_patch/g; # _all_ calls # fix _all_ non-local jumps: