diff -Nur -x '*.trace' -x '*.rej' -x '*.orig' -x sbcl.h -x ldso-stubs.S -x Config -x target -x CVS -x 'target-*.h' -x output -x genesis -x '*.o' -x '*.nm' -x '*.core' -x '*.map' -x '*.d' -x '*~' -x '*.lisp-obj' -x '*.fasl' -x '*.lisp-temp' -x systems -x '*.tmp' -x local-target-features.lisp-expr -x a.out -x '*.so' -x foo.c -x sbcl -x grovel-headers -x customize-target-features.lisp -x external-format-test.txt -x test-status.lisp-expr sbcl-1.0.18-reserve-ebx/src/assembly/x86/arith.lisp sbcl-1.0.18-reserve-ebx-2/src/assembly/x86/arith.lisp
--- sbcl-1.0.18-reserve-ebx/src/assembly/x86/arith.lisp	2007-05-06 09:51:19.000000000 -0400
+++ sbcl-1.0.18-reserve-ebx-2/src/assembly/x86/arith.lisp	2008-07-01 09:48:50.536413200 -0400
@@ -28,7 +28,7 @@
                  (:res res (descriptor-reg any-reg) edx-offset)
 
                  (:temp eax unsigned-reg eax-offset)
-                 (:temp ebx unsigned-reg ebx-offset)
+                 (:temp ebx unsigned-reg #!-x86-reserve-ebx ebx-offset #!+x86-reserve-ebx esi-offset)
                  (:temp ecx unsigned-reg ecx-offset))
 
                 (declare (ignorable ebx))
diff -Nur -x '*.trace' -x '*.rej' -x '*.orig' -x sbcl.h -x ldso-stubs.S -x Config -x target -x CVS -x 'target-*.h' -x output -x genesis -x '*.o' -x '*.nm' -x '*.core' -x '*.map' -x '*.d' -x '*~' -x '*.lisp-obj' -x '*.fasl' -x '*.lisp-temp' -x systems -x '*.tmp' -x local-target-features.lisp-expr -x a.out -x '*.so' -x foo.c -x sbcl -x grovel-headers -x customize-target-features.lisp -x external-format-test.txt -x test-status.lisp-expr sbcl-1.0.18-reserve-ebx/src/assembly/x86/assem-rtns.lisp sbcl-1.0.18-reserve-ebx-2/src/assembly/x86/assem-rtns.lisp
--- sbcl-1.0.18-reserve-ebx/src/assembly/x86/assem-rtns.lisp	2008-06-29 17:56:13.000000000 -0400
+++ sbcl-1.0.18-reserve-ebx-2/src/assembly/x86/assem-rtns.lisp	2008-07-01 09:48:50.537416200 -0400
@@ -69,6 +69,8 @@
   (loadw edi ebx -2)
   #!-x86-two-arg-passing-regs
   (loadw esi ebx -3)
+  #!+x86-reserve-ebx
+  (inst mov esi ebx)
 
   ;; And back we go.
   (inst stc)
@@ -81,6 +83,8 @@
   (inst mov edi edx)
   #!-x86-two-arg-passing-regs
   (inst mov esi edx)
+  #!+x86-reserve-ebx
+  (inst mov esi ebx)
   (inst stc)
   (inst jmp eax)
 
@@ -96,6 +100,8 @@
   (loadw edi esi -2)
   #!-x86-two-arg-passing-regs
   (inst mov esi nil-value)
+  #!+x86-reserve-ebx
+  (inst mov esi ebx)
   (inst lea esp-tn (make-ea :dword :base ebx :disp (* -2 n-word-bytes)))
   (inst stc)
   (inst jmp eax)
diff -Nur -x '*.trace' -x '*.rej' -x '*.orig' -x sbcl.h -x ldso-stubs.S -x Config -x target -x CVS -x 'target-*.h' -x output -x genesis -x '*.o' -x '*.nm' -x '*.core' -x '*.map' -x '*.d' -x '*~' -x '*.lisp-obj' -x '*.fasl' -x '*.lisp-temp' -x systems -x '*.tmp' -x local-target-features.lisp-expr -x a.out -x '*.so' -x foo.c -x sbcl -x grovel-headers -x customize-target-features.lisp -x external-format-test.txt -x test-status.lisp-expr sbcl-1.0.18-reserve-ebx/src/assembly/x86/support.lisp sbcl-1.0.18-reserve-ebx-2/src/assembly/x86/support.lisp
--- sbcl-1.0.18-reserve-ebx/src/assembly/x86/support.lisp	2006-03-07 13:47:38.000000000 -0500
+++ sbcl-1.0.18-reserve-ebx-2/src/assembly/x86/support.lisp	2008-07-01 09:48:50.537416200 -0400
@@ -36,11 +36,11 @@
         (note-this-location ,vop :single-value-return)
         (cond
           ((member :cmov *backend-subfeatures*)
-           (inst cmov :c esp-tn ebx-tn))
+           (inst cmov :c esp-tn #!-x86-reserve-ebx ebx-tn #!+x86-reserve-ebx esi-tn))
           (t
            (let ((single-value (gen-label)))
              (inst jmp :nc single-value)
-             (move esp-tn ebx-tn)
+             (move esp-tn #!-x86-reserve-ebx ebx-tn #!+x86-reserve-ebx esi-tn)
              (emit-label single-value)))))
       '((:save-p :compute-only))))))
 
diff -Nur -x '*.trace' -x '*.rej' -x '*.orig' -x sbcl.h -x ldso-stubs.S -x Config -x target -x CVS -x 'target-*.h' -x output -x genesis -x '*.o' -x '*.nm' -x '*.core' -x '*.map' -x '*.d' -x '*~' -x '*.lisp-obj' -x '*.fasl' -x '*.lisp-temp' -x systems -x '*.tmp' -x local-target-features.lisp-expr -x a.out -x '*.so' -x foo.c -x sbcl -x grovel-headers -x customize-target-features.lisp -x external-format-test.txt -x test-status.lisp-expr sbcl-1.0.18-reserve-ebx/src/compiler/assembly/alpha/alloc.lisp sbcl-1.0.18-reserve-ebx-2/src/compiler/assembly/alpha/alloc.lisp
--- sbcl-1.0.18-reserve-ebx/src/compiler/x86/call.lisp	2008-06-29 18:01:15.000000000 -0400
+++ sbcl-1.0.18-reserve-ebx-2/src/compiler/x86/call.lisp	2008-07-01 10:56:22.889312280 -0400
@@ -197,178 +197,184 @@
 (defun default-unknown-values (vop values nvals)
   (declare (type (or tn-ref null) values)
            (type unsigned-byte nvals))
-  (cond
-   ((<= nvals 1)
-    (note-this-location vop :single-value-return)
-    (let ((single-value (gen-label)))
-      (cond
-       ((member :cmov *backend-subfeatures*)
-        (inst cmov :c esp-tn ebx-tn))
-       (t
-        (inst jmp :nc single-value)
-        (inst mov esp-tn ebx-tn)
-        (emit-label single-value)))))
-   ((<= nvals register-arg-count)
-    (let ((regs-defaulted (gen-label)))
-      (note-this-location vop :unknown-return)
-      (inst jmp :c regs-defaulted)
-      ;; Default the unsuppled registers.
-      (let* ((2nd-tn-ref (tn-ref-across values))
-             (2nd-tn (tn-ref-tn 2nd-tn-ref)))
-        (inst mov 2nd-tn nil-value)
-        (when (> nvals 2)
-          (loop
-            for tn-ref = (tn-ref-across 2nd-tn-ref)
-            then (tn-ref-across tn-ref)
-            for count from 2 below register-arg-count
-            do (inst mov (tn-ref-tn tn-ref) 2nd-tn))))
-      (inst mov ebx-tn esp-tn)
-      (emit-label regs-defaulted)
-      (inst mov esp-tn ebx-tn)))
-   ((<= nvals 7)
-    ;; The number of bytes depends on the relative jump instructions.
-    ;; Best case is 31+(n-3)*14, worst case is 35+(n-3)*18. For
-    ;; NVALS=6 that is 73/89 bytes, and for NVALS=7 that is 87/107
-    ;; bytes which is likely better than using the blt below.
-    (let ((regs-defaulted (gen-label))
-          (defaulting-done (gen-label))
-          (default-stack-slots (gen-label)))
-      (note-this-location vop :unknown-return)
-      ;; Branch off to the MV case.
-      (inst jmp :c regs-defaulted)
-      ;; Do the single value case.
-      ;; Default the register args
-      (inst mov eax-tn nil-value)
-      (do ((i 1 (1+ i))
-           (val (tn-ref-across values) (tn-ref-across val)))
-          ((= i (min nvals register-arg-count)))
-        (inst mov (tn-ref-tn val) eax-tn))
-
-      ;; Fake other registers so it looks like we returned with all the
-      ;; registers filled in.
-      (move ebx-tn esp-tn)
-      (inst push edx-tn)
-      (inst jmp default-stack-slots)
-
-      (emit-label regs-defaulted)
-
-      (inst mov eax-tn nil-value)
-      (storew edx-tn ebx-tn -1)
-      (collect ((defaults))
-        (do ((i register-arg-count (1+ i))
-             (val (do ((i 0 (1+ i))
-                       (val values (tn-ref-across val)))
-                      ((= i register-arg-count) val))
-                  (tn-ref-across val)))
-            ((null val))
-          (let ((default-lab (gen-label))
-                (tn (tn-ref-tn val)))
-            (defaults (cons default-lab tn))
-
-            (inst cmp ecx-tn (fixnumize i))
-            (inst jmp :be default-lab)
-            (loadw edx-tn ebx-tn (frame-word-offset i))
-            (inst mov tn edx-tn)))
-
-        (emit-label defaulting-done)
-        (loadw edx-tn ebx-tn -1)
-        (move esp-tn ebx-tn)
-
-        (let ((defaults (defaults)))
-          (when defaults
-            (assemble (*elsewhere*)
-              (trace-table-entry trace-table-fun-prologue)
-              (emit-label default-stack-slots)
-              (dolist (default defaults)
-                (emit-label (car default))
-                (inst mov (cdr default) eax-tn))
-              (inst jmp defaulting-done)
-              (trace-table-entry trace-table-normal)))))))
-   (t
-    ;; 91 bytes for this branch.
-    (let ((regs-defaulted (gen-label))
-          (restore-edi (gen-label))
-          (no-stack-args (gen-label))
-          (default-stack-vals (gen-label))
-          (count-okay (gen-label)))
-      (note-this-location vop :unknown-return)
-      ;; Branch off to the MV case.
-      (inst jmp :c regs-defaulted)
-
-      ;; Default the register args, and set up the stack as if we
-      ;; entered the MV return point.
-      (inst mov ebx-tn esp-tn)
-      (inst push edx-tn)
-      (inst mov edi-tn nil-value)
-      (inst push edi-tn)
-      #!-x86-two-arg-passing-regs
-      (inst mov esi-tn edi-tn)
-      ;; Compute a pointer to where to put the [defaulted] stack values.
-      (emit-label no-stack-args)
-      (inst lea edi-tn
-            (make-ea :dword :base ebp-tn
-                     :disp (frame-byte-offset register-arg-count)))
-      ;; Load EAX with NIL so we can quickly store it, and set up
-      ;; stuff for the loop.
-      (inst mov eax-tn nil-value)
-      (inst std)
-      (inst mov ecx-tn (- nvals register-arg-count))
-      ;; Jump into the default loop.
-      (inst jmp default-stack-vals)
-
-      ;; The regs are defaulted. We need to copy any stack arguments,
-      ;; and then default the remaining stack arguments.
-      (emit-label regs-defaulted)
-      ;; Save EDI.
-      (storew edi-tn ebx-tn (frame-word-offset 1))
-      ;; Compute the number of stack arguments, and if it's zero or
-      ;; less, don't copy any stack arguments.
-      (inst sub ecx-tn (fixnumize register-arg-count))
-      (inst jmp :le no-stack-args)
-
-      ;; Throw away any unwanted args.
-      (inst cmp ecx-tn (fixnumize (- nvals register-arg-count)))
-      (inst jmp :be count-okay)
-      (inst mov ecx-tn (fixnumize (- nvals register-arg-count)))
-      (emit-label count-okay)
-      ;; Save the number of stack values.
-      (inst mov eax-tn ecx-tn)
-      ;; Compute a pointer to where the stack args go.
-      (inst lea edi-tn
-            (make-ea :dword :base ebp-tn
-                     :disp (frame-byte-offset register-arg-count)))
-      ;; Save ESI, and compute a pointer to where the args come from.
-      #!-x86-two-arg-passing-regs
-      (storew esi-tn ebx-tn (frame-word-offset 2))
-      (inst lea esi-tn
-            (make-ea :dword :base ebx-tn
-                     :disp (frame-byte-offset register-arg-count)))
-      ;; Do the copy.
-      (inst shr ecx-tn word-shift)              ; make word count
-      (inst std)
-      (inst rep)
-      (inst movs :dword)
-      ;; Restore ESI.
-      #!-x86-two-arg-passing-regs
-      (loadw esi-tn ebx-tn (frame-word-offset 2))
-      ;; Now we have to default the remaining args. Find out how many.
-      (inst sub eax-tn (fixnumize (- nvals register-arg-count)))
-      (inst neg eax-tn)
-      ;; If none, then just blow out of here.
-      (inst jmp :le restore-edi)
-      (inst mov ecx-tn eax-tn)
-      (inst shr ecx-tn word-shift)      ; word count
-      ;; Load EAX with NIL for fast storing.
-      (inst mov eax-tn nil-value)
-      ;; Do the store.
-      (emit-label default-stack-vals)
-      (inst rep)
-      (inst stos eax-tn)
-      ;; Restore EDI, and reset the stack.
-      (emit-label restore-edi)
-      (loadw edi-tn ebx-tn (frame-word-offset 1))
-      (inst mov esp-tn ebx-tn)
-      (inst cld))))
+  (let ((values-start #!-x86-reserve-ebx ebx-tn #!+x86-reserve-ebx esi-tn))
+    (cond
+      ((<= nvals 1)
+       (note-this-location vop :single-value-return)
+       (let ((single-value (gen-label)))
+         (cond
+           ((member :cmov *backend-subfeatures*)
+            (inst cmov :c esp-tn values-start))
+           (t
+            (inst jmp :nc single-value)
+            (inst mov esp-tn values-start)
+            (emit-label single-value)))))
+      ((<= nvals register-arg-count)
+       (let ((regs-defaulted (gen-label)))
+         (note-this-location vop :unknown-return)
+         (inst jmp :c regs-defaulted)
+         ;; Default the unsuppled registers.
+         (let* ((2nd-tn-ref (tn-ref-across values))
+                (2nd-tn (tn-ref-tn 2nd-tn-ref)))
+           (inst mov 2nd-tn nil-value)
+           (when (> nvals 2)
+             (loop
+                for tn-ref = (tn-ref-across 2nd-tn-ref)
+                then (tn-ref-across tn-ref)
+                for count from 2 below register-arg-count
+                do (inst mov (tn-ref-tn tn-ref) 2nd-tn))))
+         (inst mov values-start esp-tn)
+         (emit-label regs-defaulted)
+         (inst mov esp-tn values-start)))
+      ((<= nvals 7)
+       ;; The number of bytes depends on the relative jump instructions.
+       ;; Best case is 31+(n-3)*14, worst case is 35+(n-3)*18. For
+       ;; NVALS=6 that is 73/89 bytes, and for NVALS=7 that is 87/107
+       ;; bytes which is likely better than using the blt below.
+       (let ((regs-defaulted (gen-label))
+             (defaulting-done (gen-label))
+             (default-stack-slots (gen-label)))
+         (note-this-location vop :unknown-return)
+         ;; Branch off to the MV case.
+         (inst jmp :c regs-defaulted)
+         ;; Do the single value case.
+         ;; Default the register args
+         (inst mov eax-tn nil-value)
+         (do ((i 1 (1+ i))
+              (val (tn-ref-across values) (tn-ref-across val)))
+             ((= i (min nvals register-arg-count)))
+           (inst mov (tn-ref-tn val) eax-tn))
+
+         ;; Fake other registers so it looks like we returned with all the
+         ;; registers filled in.
+         (move values-start esp-tn)
+         (inst push edx-tn)
+         (inst jmp default-stack-slots)
+
+         (emit-label regs-defaulted)
+
+         (inst mov eax-tn nil-value)
+         (storew edx-tn values-start -1)
+         (collect ((defaults))
+           (do ((i register-arg-count (1+ i))
+                (val (do ((i 0 (1+ i))
+                          (val values (tn-ref-across val)))
+                         ((= i register-arg-count) val))
+                     (tn-ref-across val)))
+               ((null val))
+             (let ((default-lab (gen-label))
+                   (tn (tn-ref-tn val)))
+               (defaults (cons default-lab tn))
+
+               (inst cmp ecx-tn (fixnumize i))
+               (inst jmp :be default-lab)
+               (loadw edx-tn values-start (frame-word-offset i))
+               (inst mov tn edx-tn)))
+
+           (emit-label defaulting-done)
+           (loadw edx-tn values-start -1)
+           (move esp-tn values-start)
+
+           (let ((defaults (defaults)))
+             (when defaults
+               (assemble (*elsewhere*)
+                 (trace-table-entry trace-table-fun-prologue)
+                 (emit-label default-stack-slots)
+                 (dolist (default defaults)
+                   (emit-label (car default))
+                   (inst mov (cdr default) eax-tn))
+                 (inst jmp defaulting-done)
+                 (trace-table-entry trace-table-normal)))))))
+      (t
+       ;; 91 bytes for this branch.
+       (let ((regs-defaulted (gen-label))
+             (restore-edi (gen-label))
+             (no-stack-args (gen-label))
+             (default-stack-vals (gen-label))
+             (count-okay (gen-label)))
+         (note-this-location vop :unknown-return)
+
+         ;; Hack so we can test the rest.
+         #!+x86-reserve-ebx
+         (inst mov ebx-tn esi-tn)
+
+         ;; Branch off to the MV case.
+         (inst jmp :c regs-defaulted)
+
+         ;; Default the register args, and set up the stack as if we
+         ;; entered the MV return point.
+         (inst mov ebx-tn esp-tn)
+         (inst push edx-tn)
+         (inst mov edi-tn nil-value)
+         (inst push edi-tn)
+         #!-x86-two-arg-passing-regs
+         (inst mov esi-tn edi-tn)
+         ;; Compute a pointer to where to put the [defaulted] stack values.
+         (emit-label no-stack-args)
+         (inst lea edi-tn
+               (make-ea :dword :base ebp-tn
+                        :disp (frame-byte-offset register-arg-count)))
+         ;; Load EAX with NIL so we can quickly store it, and set up
+         ;; stuff for the loop.
+         (inst mov eax-tn nil-value)
+         (inst std)
+         (inst mov ecx-tn (- nvals register-arg-count))
+         ;; Jump into the default loop.
+         (inst jmp default-stack-vals)
+
+         ;; The regs are defaulted. We need to copy any stack arguments,
+         ;; and then default the remaining stack arguments.
+         (emit-label regs-defaulted)
+         ;; Save EDI.
+         (storew edi-tn ebx-tn (frame-word-offset 1))
+         ;; Compute the number of stack arguments, and if it's zero or
+         ;; less, don't copy any stack arguments.
+         (inst sub ecx-tn (fixnumize register-arg-count))
+         (inst jmp :le no-stack-args)
+
+         ;; Throw away any unwanted args.
+         (inst cmp ecx-tn (fixnumize (- nvals register-arg-count)))
+         (inst jmp :be count-okay)
+         (inst mov ecx-tn (fixnumize (- nvals register-arg-count)))
+         (emit-label count-okay)
+         ;; Save the number of stack values.
+         (inst mov eax-tn ecx-tn)
+         ;; Compute a pointer to where the stack args go.
+         (inst lea edi-tn
+               (make-ea :dword :base ebp-tn
+                        :disp (frame-byte-offset register-arg-count)))
+         ;; Save ESI, and compute a pointer to where the args come from.
+         #!-x86-two-arg-passing-regs
+         (storew esi-tn ebx-tn (frame-word-offset 2))
+         (inst lea esi-tn
+               (make-ea :dword :base ebx-tn
+                        :disp (frame-byte-offset register-arg-count)))
+         ;; Do the copy.
+         (inst shr ecx-tn word-shift)   ; make word count
+         (inst std)
+         (inst rep)
+         (inst movs :dword)
+         ;; Restore ESI.
+         #!-x86-two-arg-passing-regs
+         (loadw esi-tn ebx-tn (frame-word-offset 2))
+         ;; Now we have to default the remaining args. Find out how many.
+         (inst sub eax-tn (fixnumize (- nvals register-arg-count)))
+         (inst neg eax-tn)
+         ;; If none, then just blow out of here.
+         (inst jmp :le restore-edi)
+         (inst mov ecx-tn eax-tn)
+         (inst shr ecx-tn word-shift)   ; word count
+         ;; Load EAX with NIL for fast storing.
+         (inst mov eax-tn nil-value)
+         ;; Do the store.
+         (emit-label default-stack-vals)
+         (inst rep)
+         (inst stos eax-tn)
+         ;; Restore EDI, and reset the stack.
+         (emit-label restore-edi)
+         (loadw edi-tn ebx-tn (frame-word-offset 1))
+         (inst mov esp-tn ebx-tn)
+         (inst cld)))))
   (values))
 
 ;;;; unknown values receiving
@@ -421,7 +427,7 @@
 ;;; VOP that can be inherited by unknown values receivers. The main thing this
 ;;; handles is allocation of the result temporaries.
 (define-vop (unknown-values-receiver)
-  (:temporary (:sc descriptor-reg :offset ebx-offset
+  (:temporary (:sc descriptor-reg :offset #!-x86-reserve-ebx ebx-offset #!+x86-reserve-ebx esi-offset
                    :from :eval :to (:result 0))
               values-start)
   (:temporary (:sc any-reg :offset ecx-offset
@@ -1042,7 +1048,7 @@
 
   ;; In the case of other than one value, we need these registers to
   ;; tell the caller where they are and how many there are.
-  (:temporary (:sc unsigned-reg :offset ebx-offset) ebx)
+  (:temporary (:sc unsigned-reg :offset #!-x86-reserve-ebx ebx-offset #!+x86-reserve-ebx esi-offset) argptr)
   (:temporary (:sc unsigned-reg :offset ecx-offset) ecx)
 
   ;; We need to stretch the lifetime of return-pc past the argument
@@ -1059,7 +1065,7 @@
   (:generator 6
     (trace-table-entry trace-table-fun-epilogue)
     ;; Establish the values pointer and values count.
-    (move ebx ebp-tn)
+    (move argptr ebp-tn)
     (if (zerop nvals)
         (inst xor ecx ecx) ; smaller
       (inst mov ecx (fixnumize nvals)))
@@ -1067,7 +1073,7 @@
     (move ebp-tn old-fp)
     ;; Clear as much of the stack as possible, but not past the return
     ;; address.
-    (inst lea esp-tn (make-ea :dword :base ebx
+    (inst lea esp-tn (make-ea :dword :base argptr
                               :disp (- (* (max nvals 2) n-word-bytes))))
     ;; Pre-default any argument register that need it.
     (when (< nvals register-arg-count)
@@ -1081,7 +1087,7 @@
     (inst stc)
     ;; And away we go. Except that return-pc is still on the
     ;; stack and we've changed the stack pointer. So we have to
-    ;; tell it to index off of EBX instead of EBP.
+    ;; tell it to index off of EBX (or ESI) instead of EBP.
     (cond ((zerop nvals)
            ;; Return popping the return address and the OCFP.
            (inst ret n-word-bytes))
@@ -1090,7 +1096,7 @@
            ;; happen, or is a single value return handled elsewhere?
            (inst ret))
           (t
-           (inst jmp (make-ea :dword :base ebx
+           (inst jmp (make-ea :dword :base argptr
                               :disp (frame-byte-offset (tn-offset return-pc))))))
 
     (trace-table-entry trace-table-normal)))
diff -Nur -x '*.trace' -x '*.rej' -x '*.orig' -x sbcl.h -x ldso-stubs.S -x Config -x target -x CVS -x 'target-*.h' -x output -x genesis -x '*.o' -x '*.nm' -x '*.core' -x '*.map' -x '*.d' -x '*~' -x '*.lisp-obj' -x '*.fasl' -x '*.lisp-temp' -x systems -x '*.tmp' -x local-target-features.lisp-expr -x a.out -x '*.so' -x foo.c -x sbcl -x grovel-headers -x customize-target-features.lisp -x external-format-test.txt -x test-status.lisp-expr sbcl-1.0.18-reserve-ebx/src/runtime/x86-assem.S sbcl-1.0.18-reserve-ebx-2/src/runtime/x86-assem.S
--- sbcl-1.0.18-reserve-ebx/src/runtime/x86-assem.S	2008-06-29 17:56:13.000000000 -0400
+++ sbcl-1.0.18-reserve-ebx-2/src/runtime/x86-assem.S	2008-07-01 09:48:50.541415160 -0400
@@ -288,7 +288,11 @@
 	/* If the function returned multiple values, it will return to
 	   this point.  Lose them */
 	jnc	LsingleValue
+#ifdef LISP_FEATURE_X86_RESERVE_EBX
+	mov	%esi, %esp
+#else
 	mov	%ebx, %esp
+#endif
 LsingleValue:
 	/* A singled value function returns here */
 
@@ -394,7 +398,11 @@
 	/* Single value return: The eventual return will now use the
 	   multiple values return convention but with a return values
 	   count of one. */
+#ifdef LISP_FEATURE_X86_RESERVE_EBX
+	movl	%esp,%esi	# Setup esi - the ofp.
+#else
 	movl	%esp,%ebx	# Setup ebx - the ofp.
+#endif
 	subl	$4,%esp		# Allocate one stack slot for the return value
 	movl	$4,%ecx		# Setup ecx for one return value.
 	movl	$(NIL),%edi	# default second value
