X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fassembly%2Fx86-64%2Fassem-rtns.lisp;h=9083075d6c085a01d877c226b68ae602a3cddb76;hb=9fd95117be995b9e15a19aa182fafe4a489a4ac7;hp=bd708897ff279b329da9c151791a251528d7a1ce;hpb=4898ef32c639b1c7f4ee13a5ba566ce6debd03e6;p=sbcl.git diff --git a/src/assembly/x86-64/assem-rtns.lisp b/src/assembly/x86-64/assem-rtns.lisp index bd70889..9083075 100644 --- a/src/assembly/x86-64/assem-rtns.lisp +++ b/src/assembly/x86-64/assem-rtns.lisp @@ -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. @@ -75,13 +77,14 @@ (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 @@ -96,6 +100,7 @@ (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)) ;;;; TAIL-CALL-VARIABLE @@ -126,7 +131,7 @@ (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) @@ -146,6 +151,7 @@ (inst sub esi (fixnumize 1)) (inst rep) (inst movs :qword) + (inst cld) ;; Load the register arguments carefully. (loadw edx rbp-tn -1) @@ -165,10 +171,10 @@ (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