X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fvalues.lisp;h=0ea0535c1e05d6338a717463e5388a0fc0c3ff39;hb=f3491f128307938cc56367f739b8fbf9e5d503b6;hp=05b00d6fb97d6c9fcb1d22b0d566255d42fa5ae6;hpb=c6538bf61955a67d0145aa3e6c937f6dd03f9e51;p=sbcl.git diff --git a/src/compiler/x86-64/values.lisp b/src/compiler/x86-64/values.lisp index 05b00d6..0ea0535 100644 --- a/src/compiler/x86-64/values.lisp +++ b/src/compiler/x86-64/values.lisp @@ -97,7 +97,9 @@ 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. @@ -132,16 +134,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 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))