Index: /branches/working-0711-perf/ccl/compiler/X86/X8664/x8664-vinsns.lisp
===================================================================
--- /branches/working-0711-perf/ccl/compiler/X86/X8664/x8664-vinsns.lisp	(revision 9411)
+++ /branches/working-0711-perf/ccl/compiler/X86/X8664/x8664-vinsns.lisp	(revision 9412)
@@ -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))
@@ -2097,6 +2104,22 @@
   (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)))
+  (setc (:%b bitnum))
+  (movzbl (:%b bitnum) (:%l bitnum))
+  (imull (:$b x8664::fixnumone) (:%l bitnum) (:%l dest)))                                     
+
+(define-x8664-vinsn nref-bit-vector-flags (()
+					    ((bitnum :s64)
+					     (bitvector :lisp))
+					    ())
+  (btq (:%q bitnum) (:@ x8664::misc-data-offset (:%q bitvector))))
+
 (define-x8664-vinsn misc-ref-c-bit-fixnum (((dest :imm))
                                            ((src :lisp)
@@ -2109,4 +2132,11 @@
   (andl (:$l x8664::fixnumone) (:%l temp))
   (movl (:%l temp) (:%l dest)))
+
+(define-x8664-vinsn misc-ref-c-bit-flags (()
+                                           ((src :lisp)
+                                            (idx :u64const))
+                                          )
+  (btq (:$ub (:apply logand 63 idx))
+       (:@ (:apply + x8664::misc-data-offset (:apply ash (:apply ash idx -6) x8664::word-shift)) (:%q src))))
 
 (define-x8664-vinsn deref-macptr (((addr :address))
@@ -2695,4 +2725,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 (()
