1.0.15.15: reset DF on x86 and x86-64 after every STD instead of when calling out
[sbcl.git] / src / assembly / x86-64 / assem-rtns.lisp
index bd70889..9083075 100644 (file)
@@ -31,7 +31,7 @@
      (:temp edi unsigned-reg rdi-offset))
 
   ;; Pick off the cases where everything fits in register args.
-  (inst jecxz ZERO-VALUES)
+  (inst jrcxz ZERO-VALUES)
   (inst cmp ecx (fixnumize 1))
   (inst jmp :e ONE-VALUE)
   (inst cmp ecx (fixnumize 2))
@@ -54,6 +54,7 @@
   (inst lea edi (make-ea :qword :base ebx :disp (- n-word-bytes)))
   (inst rep)
   (inst movs :qword)
+  (inst cld)
 
   ;; Restore the count.
   (inst mov ecx edx)
@@ -67,6 +68,7 @@
   (loadw esi ebx -3)
 
   ;; And back we go.
+  (inst stc)
   (inst jmp eax)
 
   ;; Handle the register arg cases.
   (inst mov edx nil-value)
   (inst mov edi edx)
   (inst mov esi edx)
+  (inst stc)
   (inst jmp eax)
 
   ONE-VALUE ; Note: we can get this, because the return-multiple vop
             ; doesn't check for this case when size > speed.
   (loadw edx esi -1)
   (inst mov rsp-tn ebx)
-  (inst add eax 3)
+  (inst clc)
   (inst jmp eax)
 
   TWO-VALUES
@@ -89,6 +92,7 @@
   (loadw edi esi -2)
   (inst mov esi nil-value)
   (inst lea rsp-tn (make-ea :qword :base ebx :disp (* -2 n-word-bytes)))
+  (inst stc)
   (inst jmp eax)
 
   THREE-VALUES
   (loadw edi esi -2)
   (loadw esi esi -3)
   (inst lea rsp-tn (make-ea :qword :base ebx :disp (* -3 n-word-bytes)))
+  (inst stc)
   (inst jmp eax))
 \f
 ;;;; TAIL-CALL-VARIABLE
   (move ecx esi)
   (inst sub ecx rsp-tn)
 
-  ;; Check for all the args fitting the the registers.
+  ;; Check for all the args fitting the registers.
   (inst cmp ecx (fixnumize 3))
   (inst jmp :le REGISTER-ARGS)
 
   (inst sub esi (fixnumize 1))
   (inst rep)
   (inst movs :qword)
+  (inst cld)
 
   ;; Load the register arguments carefully.
   (loadw edx rbp-tn -1)
   (inst push ebx)
 
   ;; And jump into the function.
-    (inst jmp
-          (make-ea :byte :base eax
-                   :disp (- (* closure-fun-slot n-word-bytes)
-                            fun-pointer-lowtag)))
+  (inst jmp
+        (make-ea :byte :base eax
+                 :disp (- (* closure-fun-slot n-word-bytes)
+                          fun-pointer-lowtag)))
 
   ;; All the arguments fit in registers, so load them.
   REGISTER-ARGS