Index: /trunk/ccl/compiler/X86/x862.lisp
===================================================================
--- /trunk/ccl/compiler/X86/x862.lisp	(revision 5194)
+++ /trunk/ccl/compiler/X86/x862.lisp	(revision 5195)
@@ -6373,12 +6373,91 @@
   (x862-binary-builtin seg vreg xfer 'logbitp bitnum int))
 
+(defun x862-inline-logior2 (seg vreg xfer form1 form2)
+  (with-x86-local-vinsn-macros (seg vreg xfer)
+    (let* ((fix1 (acode-fixnum-form-p form1))
+           (fix2 (acode-fixnum-form-p form2)))
+      (if (and fix1 fix2)
+        (x862-use-operator (%nx1-operator fixnum) seg vreg xfer (logior fix1 fix2))
+        (let* ((fixval (or fix1 fix2))
+               (fiximm (if fixval (<= (integer-length fixval)
+                                      (- 31 *x862-target-fixnum-shift*))))
+               (otherform (when fiximm (if fix1 form2 form1))))
+          (let* ((out-of-line (backend-get-next-label))
+                 (done (backend-get-next-label)))
+            (ensuring-node-target (target vreg)
+              (if otherform
+                (x862-one-targeted-reg-form seg otherform ($ x8664::arg_z))
+                (x862-two-targeted-reg-forms seg form1 ($ x8664::arg_y) form2 ($ x8664::arg_z)))
+              (if otherform
+                (unless (acode-fixnum-form-p otherform)
+                  (! branch-unless-arg-fixnum ($ x8664::arg_z) (aref *backend-labels* out-of-line)))
+                (if (acode-fixnum-form-p form1)
+                  (! branch-unless-arg-fixnum ($ x8664::arg_z) (aref *backend-labels* out-of-line))
+                  (if (acode-fixnum-form-p form2)
+                    (! branch-unless-arg-fixnum ($ x8664::arg_y) (aref *backend-labels* out-of-line))  
+                    (! branch-unless-both-args-fixnums ($ x8664::arg_y) ($ x8664::arg_z) (aref *backend-labels* out-of-line)))))
+              (if otherform
+                (! %logior-c ($ x8664::arg_z) ($ x8664::arg_z) (ash fixval x8664::fixnumshift))
+                (! %logior2 ($ x8664::arg_z) ($ x8664::arg_z) ($ x8664::arg_y)))
+              (-> done)
+              (@ out-of-line)
+              (if otherform
+                (x862-lri seg ($ x8664::arg_y) (ash fixval x8664::fixnumshift)))
+              (! call-subprim-2 ($ x8664::arg_z) (subprim-name->offset '.SPbuiltin-logior) ($ x8664::arg_y) ($ x8664::arg_z))
+              (@ done)
+              (x862-copy-register seg target ($ x8664::arg_z))
+              (^))))))))
+
 (defx862 x862-logior2 logior2 (seg vreg xfer form1 form2)
-  (x862-binary-builtin seg vreg xfer 'logior-2 form1 form2))
+  (if (or (x862-explicit-non-fixnum-type-p form1)
+          (x862-explicit-non-fixnum-type-p form2))
+    (x862-binary-builtin seg vreg xfer 'logior-2 form1 form2)
+    (x862-inline-logior2 seg vreg xfer form1 form2)))
 
 (defx862 x862-logxor2 logxor2 (seg vreg xfer form1 form2)
   (x862-binary-builtin seg vreg xfer 'logxor-2 form1 form2))
 
+(defun x862-inline-logand2 (seg vreg xfer form1 form2)
+  (with-x86-local-vinsn-macros (seg vreg xfer)
+    (let* ((fix1 (acode-fixnum-form-p form1))
+           (fix2 (acode-fixnum-form-p form2)))
+      (if (and fix1 fix2)
+        (x862-use-operator (%nx1-operator fixnum) seg vreg xfer (logand fix1 fix2))
+        (let* ((fixval (or fix1 fix2))
+               (fiximm (if fixval (<= (integer-length fixval)
+                                      (- 31 *x862-target-fixnum-shift*))))
+               (otherform (when fiximm (if fix1 form2 form1))))
+          (let* ((out-of-line (backend-get-next-label))
+                 (done (backend-get-next-label)))
+            (ensuring-node-target (target vreg)
+              (if otherform
+                (x862-one-targeted-reg-form seg otherform ($ x8664::arg_z))
+                (x862-two-targeted-reg-forms seg form1 ($ x8664::arg_y) form2 ($ x8664::arg_z)))
+              (if otherform
+                (unless (acode-fixnum-form-p otherform)
+                  (! branch-unless-arg-fixnum ($ x8664::arg_z) (aref *backend-labels* out-of-line)))
+                (if (acode-fixnum-form-p form1)
+                  (! branch-unless-arg-fixnum ($ x8664::arg_z) (aref *backend-labels* out-of-line))
+                  (if (acode-fixnum-form-p form2)
+                    (! branch-unless-arg-fixnum ($ x8664::arg_y) (aref *backend-labels* out-of-line))  
+                    (! branch-unless-both-args-fixnums ($ x8664::arg_y) ($ x8664::arg_z) (aref *backend-labels* out-of-line)))))
+              (if otherform
+                (! %logand-c ($ x8664::arg_z) ($ x8664::arg_z) (ash fixval x8664::fixnumshift))
+                (! %logand2 ($ x8664::arg_z) ($ x8664::arg_z) ($ x8664::arg_y)))
+              (-> done)
+              (@ out-of-line)
+              (if otherform
+                (x862-lri seg ($ x8664::arg_y) (ash fixval x8664::fixnumshift)))
+              (! call-subprim-2 ($ x8664::arg_z) (subprim-name->offset '.SPbuiltin-logand) ($ x8664::arg_y) ($ x8664::arg_z))
+              (@ done)
+              (x862-copy-register seg target ($ x8664::arg_z))
+              (^))))))))
+
 (defx862 x862-logand2 logand2 (seg vreg xfer form1 form2)
-  (x862-binary-builtin seg vreg xfer 'logand-2 form1 form2))
+
+  (if (or (x862-explicit-non-fixnum-type-p form1)
+          (x862-explicit-non-fixnum-type-p form2))
+    (x862-binary-builtin seg vreg xfer 'logand-2 form1 form2)
+    (x862-inline-logand2 seg vreg xfer form1 form2)))
 
 (defx862 x862-%quo2 %quo2 (seg vreg xfer form1 form2)
