X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fvalues.lisp;h=bea46f93f5b0c5a6e10e338f134fbb4d84d7929d;hb=3fe9cb03ffeed767e9d795b5bfcd70eb71aedde9;hp=0c3f4e71a04d581a5ffbd3a43ac5bab4ade8e66b;hpb=462b946eaf95cdba2648a67ad2bc3b06b7c7a4f2;p=sbcl.git diff --git a/src/compiler/x86-64/values.lisp b/src/compiler/x86-64/values.lisp index 0c3f4e7..bea46f9 100644 --- a/src/compiler/x86-64/values.lisp +++ b/src/compiler/x86-64/values.lisp @@ -38,6 +38,7 @@ (inst movs :qword) (inst cmp rsp-tn rsi) (inst jmp :be LOOP) + (inst cld) DONE (inst lea rsp-tn (make-ea :qword :base rdi :disp n-word-bytes)) (inst sub rdi rsi) @@ -74,29 +75,29 @@ (:results (start :scs (any-reg)) (count :scs (any-reg))) (:temporary (:sc descriptor-reg :from (:argument 0) :to (:result 1)) list) - (:temporary (:sc descriptor-reg :to (:result 1)) nil-temp) - (:temporary (:sc unsigned-reg :offset rax-offset :to (:result 1)) rax) + (:temporary (:sc dword-reg :offset eax-offset :to (:result 1)) eax) (:vop-var vop) (:save-p :compute-only) (:generator 0 (move list arg) (move start rsp-tn) ; WARN pointing 1 below - (inst mov nil-temp nil-value) LOOP - (inst cmp list nil-temp) + (inst cmp list nil-value) (inst jmp :e DONE) (pushw list cons-car-slot list-pointer-lowtag) (loadw list list cons-cdr-slot list-pointer-lowtag) - (inst mov rax list) + (inst mov eax (make-dword-tn list)) (inst and al-tn lowtag-mask) (inst cmp al-tn list-pointer-lowtag) (inst jmp :e LOOP) - (error-call vop bogus-arg-to-values-list-error list) + (error-call vop 'bogus-arg-to-values-list-error list) DONE (inst mov count start) ; start is high address - (inst sub count rsp-tn))) ; stackp is low address + (inst sub count rsp-tn) ; stackp is low address + #!-#.(cl:if (cl:= sb!vm:word-shift sb!vm:n-fixnum-tag-bits) '(and) '(or)) + (inst shr count (- word-shift n-fixnum-tag-bits)))) ;;; Copy the more arg block to the top of the stack so we can use them ;;; as function arguments. @@ -131,16 +132,25 @@ (any-reg (move src context) + #!+#.(cl:if (cl:= sb!vm:word-shift sb!vm:n-fixnum-tag-bits) '(and) '(or)) (inst sub src skip) + #!-#.(cl:if (cl:= sb!vm:word-shift sb!vm:n-fixnum-tag-bits) '(and) '(or)) + (progn + ;; FIXME: This can't be efficient, but LEA (my first choice) + ;; doesn't do subtraction. + (inst shl skip (- word-shift n-fixnum-tag-bits)) + (inst sub src skip) + (inst shr skip (- word-shift n-fixnum-tag-bits))) (move count num) (inst sub count skip))) - (move loop-index count) + (inst lea loop-index (make-ea :byte :index count + :scale (ash 1 (- word-shift n-fixnum-tag-bits)))) (inst mov start rsp-tn) - (inst jecxz DONE) ; check for 0 count? + (inst jrcxz DONE) ; check for 0 count? - (inst sub rsp-tn count) - (inst sub src count) + (inst sub rsp-tn loop-index) + (inst sub src loop-index) LOOP (inst mov temp (make-ea :qword :base src :index loop-index))