Index: /trunk/ccl/compiler/PPC/PPC32/ppc32-vinsns.lisp
===================================================================
--- /trunk/ccl/compiler/PPC/PPC32/ppc32-vinsns.lisp	(revision 5348)
+++ /trunk/ccl/compiler/PPC/PPC32/ppc32-vinsns.lisp	(revision 5349)
@@ -2855,4 +2855,25 @@
   (stw unboxed ppc32::misc-data-offset dest)
   :done)
+
+(define-ppc32-vinsn fixnum-sub-overflow-inline-skip (((dest :lisp))
+                                                     ((x :imm)
+                                                      (y :imm)
+                                                      (target :label))
+                                                     ((cr0 (:crf 0))
+                                                      (unboxed :s32)
+                                                      (header :u32)))
+  (subo. dest x y)
+  (bns+ cr0 target)
+  (mtxer ppc::rzero)
+  (srawi unboxed dest ppc32::fixnumshift)
+  (li header ppc32::one-digit-bignum-header)
+  (xoris unboxed unboxed (logand #xffff (ash #xffff (- 32 16 ppc32::fixnumshift))))
+  (la ppc::allocptr (- ppc32::fulltag-misc 8) ppc::allocptr)
+  (twllt ppc::allocptr ppc::allocbase)
+  (stw header ppc32::misc-header-offset ppc::allocptr)
+  (mr dest ppc::allocptr)
+  (clrrwi ppc::allocptr ppc::allocptr ppc32::ntagbits)
+  (stw unboxed ppc32::misc-data-offset dest)
+  (b target))
 
 ;;; This is, of course, also "subtract-immediate."
Index: /trunk/ccl/compiler/PPC/PPC64/ppc64-vinsns.lisp
===================================================================
--- /trunk/ccl/compiler/PPC/PPC64/ppc64-vinsns.lisp	(revision 5348)
+++ /trunk/ccl/compiler/PPC/PPC64/ppc64-vinsns.lisp	(revision 5349)
@@ -2792,4 +2792,26 @@
   (std unboxed ppc64::misc-data-offset dest)
   :done)
+
+(define-ppc64-vinsn fixnum-sub-overflow-inline-skip (((dest :lisp))
+                                                     ((x :imm)
+                                                      (y :imm)
+                                                      (done :label))
+                                                     ((cr0 (:crf 0))
+                                                      (unboxed :s64)
+                                                      (header :u64)))
+  (subo. dest x y)
+  (bns+ cr0 done)
+  (mtxer ppc::rzero)
+  (sradi unboxed dest ppc64::fixnumshift)
+  (li header ppc64::two-digit-bignum-header)
+  (rotldi unboxed unboxed 32)
+  (xoris unboxed unboxed (logand #xffff (ash #xffff (- 32 16 ppc64::fixnumshift))))
+  (la ppc::allocptr (- ppc64::fulltag-misc 16) ppc::allocptr)
+  (tdlt ppc::allocptr ppc::allocbase)
+  (std header ppc64::misc-header-offset ppc::allocptr)
+  (mr dest ppc::allocptr)
+  (clrrdi ppc::allocptr ppc::allocptr ppc64::ntagbits)
+  (std unboxed ppc64::misc-data-offset dest)
+  (b done))
 
 ;;; This is, of course, also "subtract-immediate."
