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 sbcl-0.9.12-x86-two-arg-passing-regs/src/compiler/x86/cell.lisp sbcl-0.9.12-x86-reserve-ebx/src/compiler/x86/cell.lisp
--- sbcl-0.9.12-x86-two-arg-passing-regs/src/compiler/x86/cell.lisp	2006-03-20 11:37:52.000000000 -0500
+++ sbcl-0.9.12-x86-reserve-ebx/src/compiler/x86/cell.lisp	2006-04-30 10:22:08.000000000 -0400
@@ -284,7 +284,8 @@
 
 #!+sb-thread
 (define-vop (bind)
-  (:args (val :scs (any-reg descriptor-reg))
+  (:args (val :scs #!-x86-reserve-ebx (any-reg descriptor-reg)
+              #!+x86-reserve-ebx (control-stack))
          (symbol :scs (descriptor-reg)))
   (:temporary (:sc descriptor-reg :offset eax-offset) eax)
   (:temporary (:sc unsigned-reg) tls-index temp bsp)
@@ -325,8 +326,14 @@
       (inst mov temp (make-ea :dword :base tls-index))
       (storew temp bsp (- binding-value-slot binding-size))
       (storew symbol bsp (- binding-symbol-slot binding-size))
-      (inst fs-segment-prefix)
-      (inst mov (make-ea :dword :base tls-index) val))))
+      (if (sc-is val control-stack)
+          (progn
+            (inst push val)
+            (inst fs-segment-prefix)
+            (inst pop (make-ea :dword :base tls-index)))
+          (progn
+            (inst fs-segment-prefix)
+            (inst mov (make-ea :dword :base tls-index) val))))))
 
 #!-sb-thread
 (define-vop (bind)
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 sbcl-0.9.12-x86-two-arg-passing-regs/src/compiler/x86/vm.lisp sbcl-0.9.12-x86-reserve-ebx/src/compiler/x86/vm.lisp
--- sbcl-0.9.12-x86-two-arg-passing-regs/src/compiler/x86/vm.lisp	2006-04-28 07:30:56.000000000 -0400
+++ sbcl-0.9.12-x86-reserve-ebx/src/compiler/x86/vm.lisp	2006-04-30 09:51:27.000000000 -0400
@@ -56,7 +56,7 @@
   (defreg dh 5 :byte)
   (defreg bl 6 :byte)
   (defreg bh 7 :byte)
-  (defregset *byte-regs* al ah cl ch dl dh bl bh)
+  (defregset *byte-regs* al ah cl ch dl dh #!-x86-reserve-ebx bl #!-x86-reserve-ebx bh)
 
   ;; word registers
   (defreg ax 0 :word)
@@ -67,7 +67,7 @@
   (defreg bp 10 :word)
   (defreg si 12 :word)
   (defreg di 14 :word)
-  (defregset *word-regs* ax cx dx bx si di)
+  (defregset *word-regs* ax cx dx #!-x86-reserve-ebx bx si di)
 
   ;; double word registers
   (defreg eax 0 :dword)
@@ -78,7 +78,7 @@
   (defreg ebp 10 :dword)
   (defreg esi 12 :dword)
   (defreg edi 14 :dword)
-  (defregset *dword-regs* eax ecx edx ebx esi edi)
+  (defregset *dword-regs* eax ecx edx #!-x86-reserve-ebx ebx esi edi)
 
   ;; floating point registers
   (defreg fr0 0 :float)
