Index: /trunk/source/compiler/X86/X8664/x8664-vinsns.lisp
===================================================================
--- /trunk/source/compiler/X86/X8664/x8664-vinsns.lisp	(revision 8548)
+++ /trunk/source/compiler/X86/X8664/x8664-vinsns.lisp	(revision 8549)
@@ -50,4 +50,11 @@
   (shrq (:$ub 3) (:%q dest)))
 
+;;; same as above, but looks better in bit vector contexts
+(define-x8664-vinsn scale-1bit-misc-index (((dest :u64))
+					    ((idx :imm)	; A fixnum
+					     )
+					    ())
+  (movq (:%q idx) (:%q dest))
+  (shrq (:$ub 3) (:%q dest)))
 
 (define-x8664-vinsn misc-ref-u64  (((dest :u64))
@@ -2142,5 +2149,15 @@
   (andl (:$l x8664::fixnumone) (:%l bitnum))
   (movl (:%l bitnum) (:%l dest)))
-                                            
+
+(define-x8664-vinsn nref-bit-vector-fixnum (((dest :imm)
+					     (bitnum :s64))
+					    ((bitnum :s64)
+					     (bitvector :lisp))
+					    ())
+  (btq (:%q bitnum) (:@ x8664::misc-data-offset (:%q bitvector)))
+  (setb (:%b bitnum))
+  (negb (:%b bitnum))
+  (andl (:$l x8664::fixnumone) (:%l bitnum))
+  (movl (:%l bitnum) (:%l dest)))                                        
                                                       
 (define-x8664-vinsn misc-ref-c-bit-fixnum (((dest :imm))
@@ -2740,4 +2757,28 @@
                                                (bitnum :u8)))
   (btsq (:%q bitnum) (:@ x8664::misc-data-offset (:%q vec) (:%q word-index) 8)))
+
+;;; In safe code, something else has ensured that the value is of type
+;;; BIT.
+(define-x8664-vinsn nset-variable-bit-to-variable-value (()
+                                                        ((vec :lisp)
+                                                         (index :s64)
+                                                         (value :lisp)))
+  (testb (:%b value) (:%b value))
+  (je :clr)
+  (btsq (:%q index) (:@ x8664::misc-data-offset (:%q vec)))
+  (jmp :done)
+  :clr
+  (btrq (:%q index) (:@ x8664::misc-data-offset (:%q vec)))
+  :done)
+
+(define-x8664-vinsn nset-variable-bit-to-zero (()
+                                              ((vec :lisp)
+                                               (index :s64)))
+  (btrq (:%q index) (:@ x8664::misc-data-offset (:%q vec))))
+
+(define-x8664-vinsn nset-variable-bit-to-one (()
+                                              ((vec :lisp)
+                                               (index :s64)))
+  (btsq (:%q index) (:@ x8664::misc-data-offset (:%q vec))))
 
 (define-x8664-vinsn set-constant-bit-to-zero (()
Index: /trunk/source/compiler/X86/x862.lisp
===================================================================
--- /trunk/source/compiler/X86/x862.lisp	(revision 8548)
+++ /trunk/source/compiler/X86/x862.lisp	(revision 8549)
@@ -1600,12 +1600,9 @@
              (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-1-bit-constant-index arch)))
                (! misc-ref-c-bit-fixnum target src index-known-fixnum)
-               (with-imm-temps
-                   () (word-index bitnum)
-                 (if index-known-fixnum
-                   (progn
-                     (x862-lri seg word-index (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum -6)))
-                     (x862-lri seg bitnum (logand index-known-fixnum #x63)))
-                   (! word-index-and-bitnum-from-index word-index bitnum unscaled-idx))
-                 (! ref-bit-vector-fixnum target bitnum src word-index))))))))
+	       (with-imm-target () bitnum
+		 (if index-known-fixnum
+		   (x862-lri seg bitnum index-known-fixnum)
+		   (! scale-1bit-misc-index bitnum unscaled-idx))
+                 (! nref-bit-vector-fixnum target bitnum src))))))))
     (^)))
 
@@ -2265,16 +2262,14 @@
                       (progn
                         (! set-constant-bit-to-variable-value src index-known-fixnum val-reg)))
-                    (with-imm-temps () (word-index bit-number)
-                      (if index-known-fixnum
-                        (progn
-                          (x862-lri seg word-index (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum -6)))
-                          (x862-lri seg bit-number (logand index-known-fixnum #x63)))
-                        (! word-index-and-bitnum-from-index word-index bit-number unscaled-idx))
-                      (if constval
-                        (if (zerop constval)
-                          (! set-variable-bit-to-zero src word-index bit-number)
-                          (! set-variable-bit-to-one src word-index bit-number))
-                        (progn
-                          (! set-variable-bit-to-variable-value src word-index bit-number val-reg))))))))))
+		    (progn
+		      (if index-known-fixnum
+			(x862-lri seg scaled-idx index-known-fixnum)
+			(! scale-1bit-misc-index scaled-idx unscaled-idx))
+		      (if constval
+			(if (zerop constval)
+			  (! nset-variable-bit-to-zero src scaled-idx)
+			  (! nset-variable-bit-to-one src scaled-idx))
+			(progn
+			  (! nset-variable-bit-to-variable-value src scaled-idx val-reg))))))))))
       (when (and vreg val-reg) (<- val-reg))
       (^))))
