X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fmacros.lisp;h=002f7de19994ed6de590d48a48679ef18da44b79;hb=673234cb910923d41badca51b383e3188f375691;hp=4a6a36bf5cb1f1aa09e944163d77ce5cf579dd90;hpb=939275c1bc2f18ef93cd1dd4ab35a18f6008cfd9;p=sbcl.git diff --git a/src/compiler/x86-64/macros.lisp b/src/compiler/x86-64/macros.lisp index 4a6a36b..002f7de 100644 --- a/src/compiler/x86-64/macros.lisp +++ b/src/compiler/x86-64/macros.lisp @@ -130,9 +130,9 @@ (defun allocation-tramp (alloc-tn size &optional ignored) (declare (ignore ignored)) (inst push size) - (inst lea r13-tn (make-ea :qword + (inst lea temp-reg-tn (make-ea :qword :disp (make-fixup "alloc_tramp" :foreign))) - (inst call r13-tn) + (inst call temp-reg-tn) (inst pop alloc-tn) (values)) @@ -168,12 +168,18 @@ (cond (in-elsewhere (allocation-tramp alloc-tn size)) (t - (unless (and (tn-p size) (location= alloc-tn size)) - (inst mov alloc-tn size)) - (inst add alloc-tn free-pointer) + (inst mov temp-reg-tn free-pointer) + (if (tn-p size) + (if (location= alloc-tn size) + (inst add alloc-tn temp-reg-tn) + (inst lea alloc-tn + (make-ea :qword :base temp-reg-tn :index size))) + (inst lea alloc-tn + (make-ea :qword :base temp-reg-tn :disp size))) (inst cmp end-addr alloc-tn) (inst jmp :be NOT-INLINE) - (inst xchg free-pointer alloc-tn) + (inst mov free-pointer alloc-tn) + (inst mov alloc-tn temp-reg-tn) (emit-label DONE) (assemble (*elsewhere*) (emit-label NOT-INLINE) @@ -189,9 +195,9 @@ (defun allocation (alloc-tn size &optional ignored) (declare (ignore ignored)) (inst push size) - (inst lea r13-tn (make-ea :qword + (inst lea temp-reg-tn (make-ea :qword :disp (make-fixup "alloc_tramp" :foreign))) - (inst call r13-tn) + (inst call temp-reg-tn) (inst pop alloc-tn) (values))