X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fppc%2Fcell.lisp;h=2da18ed568221a969f3607ade8d9a7e1d7162752;hb=5d3a728a1d9a91e7218fe53f12f96ab63b846810;hp=5cbe4a52cb46f045f82f972796a5dd848be1034e;hpb=5745b5a5b2e3b967bf3876b4306f31b3c78495fa;p=sbcl.git diff --git a/src/compiler/ppc/cell.lisp b/src/compiler/ppc/cell.lisp index 5cbe4a5..2da18ed 100644 --- a/src/compiler/ppc/cell.lisp +++ b/src/compiler/ppc/cell.lisp @@ -31,6 +31,8 @@ (:generator 1 (storew value object offset lowtag))) +(define-vop (init-slot set-slot)) + #!+compare-and-swap-vops (define-vop (compare-and-swap-slot) (:args (object :scs (descriptor-reg)) @@ -435,6 +437,11 @@ (define-vop (closure-init slot-set) (:variant closure-info-offset fun-pointer-lowtag)) +(define-vop (closure-init-from-fp) + (:args (object :scs (descriptor-reg))) + (:info offset) + (:generator 4 + (storew cfp-tn object (+ closure-info-offset offset) fun-pointer-lowtag))) ;;;; Value Cell hackery. @@ -508,6 +515,38 @@ (:generator 4 (inst stw value object (offset-for-raw-slot instance-length index 1)))) +(define-vop (raw-instance-atomic-incf/word) + (:translate %raw-instance-atomic-incf/word) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg)) + (index :scs (any-reg)) + (diff :scs (unsigned-reg))) + (:arg-types * positive-fixnum unsigned-num) + (:temporary (:sc unsigned-reg) offset) + (:temporary (:sc non-descriptor-reg) sum) + (:results (result :scs (unsigned-reg) :from :load)) + (:result-types unsigned-num) + (:generator 4 + (loadw offset object 0 instance-pointer-lowtag) + ;; offset = (offset >> n-widetag-bits) << 2 + (inst rlwinm offset offset (- 32 (- n-widetag-bits 2)) (- n-widetag-bits 2) 29) + (inst subf offset index offset) + (inst addi + offset + offset + (- (* (1- instance-slots-offset) n-word-bytes) + instance-pointer-lowtag)) + ;; load the slot value, add DIFF, write the sum back, and return + ;; the original slot value, atomically, and include a memory + ;; barrier. + (inst sync) + LOOP + (inst lwarx result offset object) + (inst add sum result diff) + (inst stwcx. sum offset object) + (inst bne LOOP) + (inst isync))) + (define-vop (raw-instance-ref/word) (:translate %raw-instance-ref/word) (:policy :fast-safe)