X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fc-call.lisp;h=32fb566f0d3a5a22f398c7574984cada9b97016c;hb=0e7a9105ae992fc4befa37846c42f298e12918c0;hp=c067972fa89597e62521b274f74b92cce0176ae1;hpb=e36329167e5f536e3d33a2407c9bc74008581a0d;p=sbcl.git diff --git a/src/compiler/x86-64/c-call.lisp b/src/compiler/x86-64/c-call.lisp index c067972..32fb566 100644 --- a/src/compiler/x86-64/c-call.lisp +++ b/src/compiler/x86-64/c-call.lisp @@ -190,16 +190,16 @@ ;;; The ABI specifies that signed short/int's are returned as 32-bit ;;; values. Negative values need to be sign-extended to 64-bits (done ;;; in a :NATURALIZE-GEN alien-type-method). -(defknown sign-extend ((signed-byte 64)) (signed-byte 64) +(defknown sign-extend ((signed-byte 32)) fixnum (foldable flushable movable)) (define-vop (sign-extend) (:translate sign-extend) (:policy :fast-safe) (:args (val :scs (signed-reg))) - (:arg-types signed-byte-64) + (:arg-types fixnum) (:results (res :scs (signed-reg))) - (:result-types signed-byte-64) + (:result-types fixnum) (:generator 1 (inst movsxd res (make-random-tn :kind :normal @@ -207,9 +207,8 @@ :offset (tn-offset val))))) (defun sign-extend (x) - (if (logbitp 31 x) - (dpb x (byte 32 0) -1) - (ldb (byte 32 0) x))) + (declare (type (signed-byte 32) x)) + (sign-extend x)) (define-vop (foreign-symbol-sap) (:translate foreign-symbol-sap) @@ -243,6 +242,8 @@ (:vop-var vop) (:save-p t) (:generator 0 + ;; ABI: Direction flag must be clear on function entry. -- JES, 2006-01-20 + (inst cld) ;; ABI: AL contains amount of arguments passed in XMM registers ;; for vararg calls. (move-immediate rax