* fixed cross-compiler leakages that prevented building a 32-bit
target with a 64-bit host compiler.
* contrib improvement: implement SB-POSIX:MKSTEMP (Yannick Gingras)
+ * optimization: There's now a fast-path for fixnum arguments in the
+ generic subtraction routines on x86/x86-64. (Thanks to Lutz Euler)
* fixed some bugs revealed by Paul Dietz' test suite:
** the type-error signalled from WARN has a filled-in DATUM slot.
** the type-error required when a stream is not associated with
a file has the stream as its datum.
+ ** type-errors on single-floats on x86-64 no longer have
+ :INVALID-OBJECT as the datum
changes in sbcl-0.9.0 relative to sbcl-0.8.21:
* incompatible change: the --noprogrammer option, deprecated since
(values target not-target))
;; Is it a fixnum?
(generate-fixnum-test value)
- (move eax-tn value)
+ (move rax-tn value)
(inst jmp :e fixnum)
;; If not, is it an other pointer?
- (inst and eax-tn lowtag-mask)
- (inst cmp eax-tn other-pointer-lowtag)
+ (inst and rax-tn lowtag-mask)
+ (inst cmp rax-tn other-pointer-lowtag)
(inst jmp :ne nope)
;; Get the header.
- (loadw eax-tn value 0 other-pointer-lowtag)
+ (loadw rax-tn value 0 other-pointer-lowtag)
;; Is it one?
- (inst cmp eax-tn (+ (ash 1 n-widetag-bits) bignum-widetag))
+ (inst cmp rax-tn (+ (ash 1 n-widetag-bits) bignum-widetag))
(inst jmp :e single-word)
;; If it's other than two, we can't be an (unsigned-byte 64)
- (inst cmp eax-tn (+ (ash 2 n-widetag-bits) bignum-widetag))
+ (inst cmp rax-tn (+ (ash 2 n-widetag-bits) bignum-widetag))
(inst jmp :ne nope)
;; Get the second digit.
- (loadw eax-tn value (1+ bignum-digits-offset) other-pointer-lowtag)
+ (loadw rax-tn value (1+ bignum-digits-offset) other-pointer-lowtag)
;; All zeros, its an (unsigned-byte 64).
- (inst or eax-tn eax-tn)
+ (inst or rax-tn rax-tn)
(inst jmp :z yep)
(inst jmp nope)
(emit-label single-word)
;; Get the single digit.
- (loadw eax-tn value bignum-digits-offset other-pointer-lowtag)
+ (loadw rax-tn value bignum-digits-offset other-pointer-lowtag)
;; positive implies (unsigned-byte 64).
(emit-label fixnum)
- (inst or eax-tn eax-tn)
+ (inst or rax-tn rax-tn)
(inst jmp (if not-p :s :ns) target)
(emit-label not-target)))))
;; Is it a fixnum?
(generate-fixnum-test value)
- (move eax-tn value)
+ (move rax-tn value)
(inst jmp :e fixnum)
;; If not, is it an other pointer?
- (inst and eax-tn lowtag-mask)
- (inst cmp eax-tn other-pointer-lowtag)
+ (inst and rax-tn lowtag-mask)
+ (inst cmp rax-tn other-pointer-lowtag)
(inst jmp :ne nope)
;; Get the header.
- (loadw eax-tn value 0 other-pointer-lowtag)
+ (loadw rax-tn value 0 other-pointer-lowtag)
;; Is it one?
- (inst cmp eax-tn (+ (ash 1 n-widetag-bits) bignum-widetag))
+ (inst cmp rax-tn (+ (ash 1 n-widetag-bits) bignum-widetag))
(inst jmp :e single-word)
;; If it's other than two, we can't be an (unsigned-byte 64)
- (inst cmp eax-tn (+ (ash 2 n-widetag-bits) bignum-widetag))
+ (inst cmp rax-tn (+ (ash 2 n-widetag-bits) bignum-widetag))
(inst jmp :ne nope)
;; Get the second digit.
- (loadw eax-tn value (1+ bignum-digits-offset) other-pointer-lowtag)
+ (loadw rax-tn value (1+ bignum-digits-offset) other-pointer-lowtag)
;; All zeros, its an (unsigned-byte 64).
- (inst or eax-tn eax-tn)
+ (inst or rax-tn rax-tn)
(inst jmp :z yep)
(inst jmp nope)
(emit-label single-word)
;; Get the single digit.
- (loadw eax-tn value bignum-digits-offset other-pointer-lowtag)
+ (loadw rax-tn value bignum-digits-offset other-pointer-lowtag)
;; positive implies (unsigned-byte 64).
(emit-label fixnum)
- (inst or eax-tn eax-tn)
+ (inst or rax-tn rax-tn)
(inst jmp :s nope)
(emit-label yep)