From dffc2db23295e9d690ea9ac5e4a4081704586dba Mon Sep 17 00:00:00 2001
From: sof <unknown>
Date: Wed, 3 Sep 1997 23:49:16 +0000
Subject: [PATCH] [project @ 1997-09-03 23:49:16 by sof] When doing
 -monly-x-regs, fix up entry and exit from PerformGC_wrapper

---
 ghc/driver/ghc-asm.lprl | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/ghc/driver/ghc-asm.lprl b/ghc/driver/ghc-asm.lprl
index 65519e7dd488..06a641615d9f 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:
 
-- 
GitLab