X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fx86-64%2Fsubprim.lisp;h=a779d13d37d4a22ce1cf0d139eef011278899c41;hb=debae3c18d31b5222be4d5de8dcb2601336e24a4;hp=1e9e532888ad3c8ffb8de5fb99869700c0cf33ac;hpb=4ebdc81b1a9c6dbed6e98b112afc8dd32b17a2dd;p=sbcl.git diff --git a/src/compiler/x86-64/subprim.lisp b/src/compiler/x86-64/subprim.lisp index 1e9e532..a779d13 100644 --- a/src/compiler/x86-64/subprim.lisp +++ b/src/compiler/x86-64/subprim.lisp @@ -18,20 +18,21 @@ (:translate length) (:args (object :scs (descriptor-reg control-stack) :target ptr)) (:arg-types list) - (:temporary (:sc unsigned-reg :offset eax-offset) eax) + (:temporary (:sc dword-reg :offset eax-offset) eax) (:temporary (:sc descriptor-reg :from (:argument 0)) ptr) (:results (count :scs (any-reg))) (:result-types positive-fixnum) (:policy :fast-safe) (:vop-var vop) (:save-p :compute-only) + (:ignore eax) (:generator 40 ;; Move OBJECT into a temp we can bash on, and initialize the count. (move ptr object) - (inst xor count count) + (zeroize count) ;; If we are starting with NIL, then it's really easy. (inst cmp ptr nil-value) - (inst jmp :e done) + (inst jmp :e DONE) ;; Note: we don't have to test to see whether the original argument is a ;; list, because this is a :fast-safe vop. LOOP @@ -40,15 +41,12 @@ (inst add count (fixnumize 1)) ;; If we hit NIL, then we are done. (inst cmp ptr nil-value) - (inst jmp :e done) + (inst jmp :e DONE) ;; Otherwise, check to see whether we hit the end of a dotted list. If ;; not, loop back for more. - (move eax ptr) - (inst and al-tn lowtag-mask) - (inst cmp al-tn list-pointer-lowtag) - (inst jmp :e loop) + (%test-lowtag ptr LOOP nil list-pointer-lowtag) ;; It's dotted all right. Flame out. - (error-call vop object-not-list-error ptr) + (error-call vop 'object-not-list-error ptr) ;; We be done. DONE)) @@ -66,17 +64,19 @@ ;; Get a copy of OBJECT in a register we can bash on, and ;; initialize COUNT. (move ptr object) - (inst xor count count) + (zeroize count) ;; If we are starting with NIL, we be done. (inst cmp ptr nil-value) - (inst jmp :e done) + (inst jmp :e DONE) ;; Indirect the next cons cell, and boost the count. LOOP (loadw ptr ptr cons-cdr-slot list-pointer-lowtag) (inst add count (fixnumize 1)) ;; If we aren't done, go back for more. (inst cmp ptr nil-value) - (inst jmp :ne loop) + (inst jmp :ne LOOP) DONE)) (define-static-fun length (object) :translate length) +(define-static-fun %coerce-callable-to-fun (callable) + :translate %coerce-callable-to-fun)