X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fvalues.lisp;h=05b00d6fb97d6c9fcb1d22b0d566255d42fa5ae6;hb=9b1fade83db8453b75b8c7380eb12ce41b5b889c;hp=4f5f5ae45bac1bc0025a0fbbef234e22b6463cef;hpb=0d871fd7a98fc4af92a8b942a1154761466ad8c9;p=sbcl.git diff --git a/src/compiler/x86-64/values.lisp b/src/compiler/x86-64/values.lisp index 4f5f5ae..05b00d6 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) @@ -92,7 +93,7 @@ (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 @@ -113,7 +114,7 @@ (:arg-types * positive-fixnum positive-fixnum) (:temporary (:sc any-reg :offset rsi-offset :from (:argument 0)) src) (:temporary (:sc descriptor-reg :offset rax-offset) temp) - (:temporary (:sc unsigned-reg :offset rcx-offset) temp1) + (:temporary (:sc unsigned-reg :offset rcx-offset) loop-index) (:results (start :scs (any-reg)) (count :scs (any-reg))) (:generator 20 @@ -135,17 +136,18 @@ (move count num) (inst sub count skip))) - (move temp1 count) + (move loop-index count) (inst mov start rsp-tn) - (inst jecxz DONE) ; check for 0 count? + (inst jrcxz DONE) ; check for 0 count? - (inst shr temp1 word-shift) ; convert the fixnum to a count. + (inst sub rsp-tn count) + (inst sub src count) - (inst std) ; move down the stack as more value are copied to the bottom. LOOP - (inst lods temp) - (inst push temp) - (inst loop LOOP) + (inst mov temp (make-ea :qword :base src :index loop-index)) + (inst sub loop-index n-word-bytes) + (inst mov (make-ea :qword :base rsp-tn :index loop-index) temp) + (inst jmp :nz LOOP) DONE))