(lambda-vars arg)
(cond ((and (alien-integer-type-p type)
(> (sb!alien::alien-integer-type-bits type) 64))
+ ;; CLH: FIXME! This should really be
+ ;; #xffffffffffffffff. nyef says: "Passing
+ ;; 128-bit integers to ALIEN functions on x86-64
+ ;; believed to be broken."
(new-args `(logand ,arg #xffffffff))
(new-args `(ash ,arg -64))
(new-arg-types (parse-alien-type '(unsigned 64) env))
;;; 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
: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)
(: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