1.0.15.15: reset DF on x86 and x86-64 after every STD instead of when calling out
[sbcl.git] / src / compiler / x86 / values.lisp
index 74c33c3..f6b4df8 100644 (file)
@@ -38,6 +38,7 @@
     (inst movs :dword)
     (inst cmp esp-tn esi)
     (inst jmp :be loop)
+    (inst cld)
     DONE
     (inst lea esp-tn (make-ea :dword :base edi :disp n-word-bytes))
     (inst sub edi esi)
   (:arg-types * positive-fixnum positive-fixnum)
   (:temporary (:sc any-reg :offset esi-offset :from (:argument 0)) src)
   (:temporary (:sc descriptor-reg :offset eax-offset) temp)
-  (:temporary (:sc unsigned-reg :offset ecx-offset) temp1)
+  (:temporary (:sc unsigned-reg :offset ecx-offset) loop-index)
   (:results (start :scs (any-reg))
             (count :scs (any-reg)))
   (:generator 20
        (move count num)
        (inst sub count skip)))
 
-    (move temp1 count)
+    (move loop-index count)
     (inst mov start esp-tn)
     (inst jecxz done)  ; check for 0 count?
 
-    (inst shr temp1 word-shift) ; convert the fixnum to a count.
+    (inst sub esp-tn count)
+    (inst sub src count)
 
-    (inst std) ; move down the stack as more value are copied to the bottom.
     LOOP
-    (inst lods temp)
-    (inst push temp)
-    (inst loop loop)
+    (inst mov temp (make-ea :dword :base src :index loop-index))
+    (inst sub loop-index n-word-bytes)
+    (inst mov (make-ea :dword :base esp-tn :index loop-index) temp)
+    (inst jmp :nz LOOP)
 
-    DONE))
+    DONE
+    ))