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
# 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
# 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: