X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fcell.lisp;h=501bb4dbea40600ddcb082a6637f2f8fb2382087;hb=880a863592743d82835e0fb4395301d6ab1f5127;hp=5a4b846ede97ee9f1baa0186718affbdd222d2fd;hpb=db9c81e7b9a67ebd26b87bf2c1686d1b4968f097;p=sbcl.git diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 5a4b846..501bb4d 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -624,6 +624,27 @@ (:generator 4 (inst mov (make-ea-for-raw-slot object index instance-length) value))) +(define-vop (raw-instance-atomic-incf-c/word) + (:translate %raw-instance-atomic-incf/word) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg)) + (diff :scs (signed-reg) :target result)) + (:arg-types * (:constant (load/store-index #.n-word-bytes + #.instance-pointer-lowtag + #.instance-slots-offset)) + signed-num) + (:info index) + (:temporary (:sc unsigned-reg) tmp) + (:results (result :scs (unsigned-reg))) + (:result-types unsigned-num) + (:generator 4 + (loadw tmp object 0 instance-pointer-lowtag) + (inst shr tmp n-widetag-bits) + #!+sb-thread + (inst lock) + (inst xadd (make-ea-for-raw-slot object index tmp) diff) + (move result diff))) + (define-vop (raw-instance-ref/single) (:translate %raw-instance-ref/single) (:policy :fast-safe)