Index: /branches/ia32/compiler/X86/X8632/x8632-vinsns.lisp
===================================================================
--- /branches/ia32/compiler/X86/X8632/x8632-vinsns.lisp	(revision 7771)
+++ /branches/ia32/compiler/X86/X8632/x8632-vinsns.lisp	(revision 7772)
@@ -1810,4 +1810,42 @@
   (movzwl (:@ (:%l src) (:%l index)) (:%l dest)))
 
+(define-x8632-vinsn mem-ref-c-u8 (((dest :u8))
+				  ((src :address)
+				   (index :s16const)))
+  ((:pred = index 0)
+   (movzbl (:@  (:%l src)) (:%l dest)))
+  ((:not (:pred = index 0))
+   (movzbl (:@ index (:%l src)) (:%l dest))))
+
+(define-x8632-vinsn mem-ref-u8 (((dest :u8))
+				((src :address)
+				 (index :s32)))
+  (movzbl (:@ (:%l src) (:%l index)) (:%l dest)))
+
+(define-x8632-vinsn mem-ref-c-s8 (((dest :s8))
+				  ((src :address)
+				   (index :s16const)))
+  ((:pred = index 0)
+   (movsbl (:@ (:%l src)) (:%l dest)))
+  ((:not (:pred = index 0))
+   (movsbl (:@ index (:%l src)) (:%l dest))))
+
+(define-x8632-vinsn misc-set-c-s8  (((val :s8))
+				    ((v :lisp)
+				     (idx :u32const))
+				    ())
+  (movb (:%b val) (:@ (:apply + x8632::misc-data-offset idx) (:%l v))))
+
+(define-x8632-vinsn misc-set-s8  (((val :s8))
+				  ((v :lisp)
+				   (scaled-idx :s32))
+				  ())
+  (movb (:%b val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
+
+(define-x8632-vinsn mem-ref-s8 (((dest :s8))
+				((src :address)
+				 (index :s32)))
+  (movsbl (:@ (:%l src) (:%l index)) (:%l dest)))
+
 (define-x8632-vinsn mem-set-constant-fullword (()
                                                ((val :s32const)
@@ -2507,4 +2545,9 @@
   (movd (:%mmx x8632::mm1) (:@ x8632::macptr.address (:%l ptr))))
 
+(define-x8632-vinsn mem-ref-natural (((dest :u32))
+				     ((src :address)
+				      (index :s32)))
+  (movl (:@ (:%l src) (:%l index)) (:%l dest)))
+
 (define-x8632-vinsn mem-ref-c-fullword (((dest :u32))
 					((src :address)
@@ -2522,4 +2565,30 @@
   ((:not (:pred = index 0))
    (movl (:@ index (:%l src)) (:%l dest))))
+
+(define-x8632-vinsn mem-ref-c-single-float (((dest :single-float))
+					    ((src :address)
+					     (index :s32const)))
+  ((:pred = index 0)
+   (movss (:@ (:%l src)) (:%xmm dest)))
+  ((:not (:pred = index 0))
+   (movss (:@ index (:%l src)) (:%xmm dest))))
+
+(define-x8632-vinsn mem-set-c-single-float (()
+					    ((val :single-float)
+					     (src :address)
+					     (index :s16const)))
+  ((:pred = index 0)
+   (movss (:%xmm val) (:@ (:%l src))))
+  ((:not (:pred = index 0))
+   (movss (:%xmm val) (:@ index (:%l src)))))
+
+(define-x8632-vinsn mem-ref-c-natural (((dest :u32))
+                                       ((src :address)
+                                        (index :s32const)))
+  ((:pred = index 0)
+   (movl (:@ (:%l src)) (:%l dest)))
+  ((:not (:pred = index 0))
+   (movl (:@ index (:%l src)) (:%l dest))))
+
 
 (define-x8632-vinsn mem-ref-fullword (((dest :u32))
@@ -2583,6 +2652,6 @@
 
 (define-x8632-vinsn %natural-  (((result :u32))
-                               ((result :u32)
-                                (other :u32)))
+				((result :u32)
+				 (other :u32)))
   (subl (:%l other) (:%l result)))
 
@@ -2799,4 +2868,10 @@
   :done)
 
+(define-x8632-vinsn ref-interrupt-level (((dest :imm))
+                                         ()
+                                         ((temp :u32)))
+  (movl (:@ (:%seg :rcontext) x8632::tcr.tlb-pointer) (:%l temp))
+  (movl (:@ x8632::interrupt-level-binding-index (:%l temp)) (:%l dest)))
+
 (define-x8632-subprim-lea-jmp-vinsn (bind-nil)  .SPbind-nil)
 
@@ -2921,4 +2996,29 @@
 (define-x8632-subprim-lea-jmp-vinsn (spread-lexpr)  .SPspread-lexpr-z)
 
+(define-x8632-vinsn mem-ref-double-float (((dest :double-float))
+					  ((src :address)
+					   (index :s32)))
+  (movsd (:@ (:%l src) (:%l index)) (:%xmm dest)))
+
+(define-x8632-vinsn mem-ref-single-float (((dest :single-float))
+					  ((src :address)
+					   (index :s32)))
+  (movss (:@ (:%l src) (:%l index)) (:%xmm dest)))
+
+(define-x8632-vinsn zero-extend-nargs (()
+                                       ())
+  (movzwl (:%w x8632::nargs) (:%l x8632::nargs)))
+
+(define-x8632-vinsn load-adl (()
+			      ((n :u32const)))
+  (movl (:$l n) (:%l x8632::nargs)))
+
+(define-x8632-subprim-lea-jmp-vinsn (macro-bind) .SPmacro-bind)
+
+(define-x8632-subprim-lea-jmp-vinsn (destructuring-bind-inner) .SPdestructuring-bind-inner)
+
+(define-x8632-subprim-lea-jmp-vinsn  (destructuring-bind) .SPdestructuring-bind)
+
+
 (define-x8632-vinsn symbol-function (((val :lisp))
                                      ((sym (:lisp (:ne val))))
@@ -3019,4 +3119,9 @@
   :done)
 
+(define-x8632-vinsn sign-extend-halfword (((dest :imm))
+					  ((src :imm)))
+  (movl (:%l src ) (:%l dest))
+  (shll (:$ub (- 48 x8632::fixnumshift)) (:%l dest))
+  (sarl (:$ub (- 48 x8632::fixnumshift)) (:%l dest)))
 
 (define-x8632-subprim-jump-vinsn (tail-funcall-gen) .SPtfuncallgen)
@@ -3103,4 +3208,13 @@
 
 (define-x8632-subprim-lea-jmp-vinsn (make-stack-vector)  .SPmkstackv)
+
+(define-x8632-vinsn %current-frame-ptr (((dest :imm))
+					())
+  (movl (:%l x8632::ebp) (:%l dest)))
+
+(define-x8632-vinsn %foreign-stack-pointer (((dest :imm))
+                                            ())
+  (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l dest)))
+
 
 (define-x8632-vinsn  %slot-ref (((dest :lisp))
@@ -3191,4 +3305,43 @@
   (btl (:$ub bit) (:%l int)))
 
+(define-x8632-vinsn multiply-immediate (((dest :imm))
+                                        ((src :imm)
+                                         (const :s32const)))
+  ((:and (:pred >= const -128) (:pred <= const 127))
+   (imull (:$b const) (:%l src) (:%l dest)))
+  ((:not (:and (:pred >= const -128) (:pred <= const 127)))
+   (imull (:$l const) (:%l src) (:%l dest))))
+
+(define-x8632-vinsn multiply-fixnums (((dest :imm))
+                                      ((x :imm)
+                                       (y :imm))
+                                      ((unboxed :s32)))
+  ((:pred =
+          (:apply %hard-regspec-value x)
+          (:apply %hard-regspec-value dest))
+   (movl (:%l y) (:%l unboxed))
+   (sarl (:$ub x8632::fixnumshift) (:%l unboxed))
+   (imull (:%l unboxed) (:%l dest)))
+  ((:and (: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 unboxed))
+   (sarl (:$ub x8632::fixnumshift) (:%l unboxed))
+   (imull (:%l unboxed) (:%l dest)))
+  ((:and (:not (:pred =
+                      (:apply %hard-regspec-value x)
+                      (:apply %hard-regspec-value dest)))
+         (:not (:pred =
+                      (:apply %hard-regspec-value y)
+                      (:apply %hard-regspec-value dest))))
+   (movl (:%l y) (:%l dest))
+   (movl (:%l x) (:%l unboxed))
+   (sarl (:$ub x8632::fixnumshift) (:%l unboxed))
+   (imull (:%l unboxed) (:%l dest))))
+
+
 (define-x8632-vinsn mark-as-imm (()
 				 ((reg :imm)))
