0.9.1.64:
[sbcl.git] / src / compiler / x86-64 / memory.lisp
index ca8c2e2..bd529b2 100644 (file)
 (define-vop (slot-set)
   (:args (object :scs (descriptor-reg))
         (value :scs (descriptor-reg any-reg immediate)))
+  (:temporary (:sc unsigned-reg) temp)
   (:variant-vars base lowtag)
   (:info offset)
   (:generator 4
      (if (sc-is value immediate)
         (let ((val (tn-value value)))
-          (etypecase val
-            (integer
-             (inst mov
-                   (make-ea :dword :base object
-                            :disp (- (* (+ base offset) n-word-bytes) lowtag))
-                   (fixnumize val)))
-            (symbol
-             (inst mov
-                   (make-ea :dword :base object
-                            :disp (- (* (+ base offset) n-word-bytes) lowtag))
-                   (+ nil-value (static-symbol-offset val))))
-            (character
-             (inst mov
-                   (make-ea :dword :base object
-                            :disp (- (* (+ base offset) n-word-bytes) lowtag))
-                   (logior (ash (char-code val) n-widetag-bits)
-                           base-char-widetag)))))
+          (move-immediate (make-ea :qword :base object
+                                   :disp (- (* (+ base offset) n-word-bytes)
+                                            lowtag))
+                          (etypecase val
+                            (integer
+                             (fixnumize val))
+                            (symbol
+                             (+ nil-value (static-symbol-offset val)))
+                            (character
+                             (logior (ash (char-code val) n-widetag-bits)
+                                     character-widetag)))
+                          temp))
         ;; Else, value not immediate.
         (storew value object (+ base offset) lowtag))))