Index: /trunk/source/compiler/X86/X8632/x8632-vinsns.lisp
===================================================================
--- /trunk/source/compiler/X86/X8632/x8632-vinsns.lisp	(revision 15346)
+++ /trunk/source/compiler/X86/X8632/x8632-vinsns.lisp	(revision 15347)
@@ -1054,9 +1054,4 @@
   (movl (:$self 0) (:% x8632::fn)))
 
-(define-x8632-vinsn fixnum-subtract-from (((dest t)
-                                           (y t))
-                                          ((y t)
-                                           (x t)))
-  (subl (:%l y) (:%l x)))
 
 (define-x8632-vinsn %ilognot (((dest :imm)
@@ -1296,7 +1291,14 @@
                                    (y :imm))
                                   ((temp :imm)))
-  (movl (:%l x) (:%l temp))
-  (subl (:%l y) (:%l temp))
-  (movl (:%l temp) (:%l dest)))
+  ((:pred = (:apply %hard-regspec-value x) (:apply %hard-regspec-value dest))
+   (subl (:%l y) (:%l dest)))
+  ((:not (:pred = (:apply %hard-regspec-value x) (:apply %hard-regspec-value dest)))
+   ((:pred = (:apply %hard-regspec-value y) (:apply %hard-regspec-value dest)) 
+    (movl (:%l x) (:%l temp))
+    (subl (:%l y) (:%l temp))
+    (movl (:%l temp) (:%l dest)))
+   ((:not (:pred = (:apply %hard-regspec-value y) (:apply %hard-regspec-value dest)))
+    (movl (:%l x) (:%l dest))
+    (subl (:%l y) (:%l dest)))))
 
 (define-x8632-vinsn fixnum-add3 (((dest :imm))
Index: /trunk/source/compiler/X86/X8664/x8664-vinsns.lisp
===================================================================
--- /trunk/source/compiler/X86/X8664/x8664-vinsns.lisp	(revision 15346)
+++ /trunk/source/compiler/X86/X8664/x8664-vinsns.lisp	(revision 15347)
@@ -1201,9 +1201,4 @@
   (leaq (:@ (:^ entry) (:% x8664::rip)) (:%q x8664::fn)))
 
-(define-x8664-vinsn fixnum-subtract-from (((dest t)
-                                           (y t))
-                                          ((y t)
-                                           (x t)))
-  (subq (:%q y) (:%q x)))
 
 (define-x8664-vinsn %logand-c (((dest t)
@@ -1429,7 +1424,14 @@
                                    (y :imm))
                                   ((temp :imm)))
-  (movq (:%q x) (:%q temp))
-  (subq (:%q y) (:%q temp))
-  (movq (:%q temp) (:%q dest)))
+  ((:pred = (:apply %hard-regspec-value x) (:apply %hard-regspec-value dest))
+   (subq (:%q y) (:%q dest)))
+  ((:not (:pred = (:apply %hard-regspec-value x) (:apply %hard-regspec-value dest)))
+   ((:pred = (:apply %hard-regspec-value y) (:apply %hard-regspec-value dest)) 
+    (movq (:%q x) (:%q temp))
+    (subq (:%q y) (:%q temp))
+    (movq (:%q temp) (:%q dest)))
+   ((:not (:pred = (:apply %hard-regspec-value y) (:apply %hard-regspec-value dest)))
+    (movq (:%q x) (:%q dest))
+    (subq (:%q y) (:%q dest)))))
 
 
