📄 cell.lisp
字号:
(inst lea temp-reg-tn (make-ea :qword :disp (make-fixup (ecase (tn-offset tls-index) (#.rax-offset 'alloc-tls-index-in-rax) (#.rcx-offset 'alloc-tls-index-in-rcx) (#.rdx-offset 'alloc-tls-index-in-rdx) (#.rbx-offset 'alloc-tls-index-in-rbx) (#.rsi-offset 'alloc-tls-index-in-rsi) (#.rdi-offset 'alloc-tls-index-in-rdi) (#.r8-offset 'alloc-tls-index-in-r8) (#.r9-offset 'alloc-tls-index-in-r9) (#.r10-offset 'alloc-tls-index-in-r10) (#.r12-offset 'alloc-tls-index-in-r12) (#.r13-offset 'alloc-tls-index-in-r13) (#.r14-offset 'alloc-tls-index-in-r14) (#.r15-offset 'alloc-tls-index-in-r15)) :assembly-routine))) (inst call temp-reg-tn) (emit-label tls-index-valid) (inst push (make-ea :qword :base thread-base-tn :scale 1 :index tls-index)) (popw bsp (- binding-value-slot binding-size)) (storew symbol bsp (- binding-symbol-slot binding-size)) (inst mov (make-ea :qword :base thread-base-tn :scale 1 :index tls-index) val))))#!-sb-thread(define-vop (bind) (:args (val :scs (any-reg descriptor-reg)) (symbol :scs (descriptor-reg))) (:temporary (:sc unsigned-reg) temp bsp) (:generator 5 (load-symbol-value bsp *binding-stack-pointer*) (loadw temp symbol symbol-value-slot other-pointer-lowtag) (inst add bsp (* binding-size n-word-bytes)) (store-symbol-value bsp *binding-stack-pointer*) (storew temp bsp (- binding-value-slot binding-size)) (storew symbol bsp (- binding-symbol-slot binding-size)) (storew val symbol symbol-value-slot other-pointer-lowtag)))#!+sb-thread(define-vop (unbind) (:temporary (:sc unsigned-reg) temp bsp tls-index) (:generator 0 (load-binding-stack-pointer bsp) ;; Load SYMBOL from stack, and get the TLS-INDEX (loadw temp bsp (- binding-symbol-slot binding-size)) (loadw tls-index temp symbol-tls-index-slot other-pointer-lowtag) ;; Load VALUE from stack, the restore it to the TLS area. (loadw temp bsp (- binding-value-slot binding-size)) (inst mov (make-ea :qword :base thread-base-tn :scale 1 :index tls-index) temp) ;; Zero out the stack. (storew 0 bsp (- binding-symbol-slot binding-size)) (storew 0 bsp (- binding-value-slot binding-size)) (inst sub bsp (* binding-size n-word-bytes)) (store-binding-stack-pointer bsp)))#!-sb-thread(define-vop (unbind) (:temporary (:sc unsigned-reg) symbol value bsp) (:generator 0 (load-symbol-value bsp *binding-stack-pointer*) (loadw symbol bsp (- binding-symbol-slot binding-size)) (loadw value bsp (- binding-value-slot binding-size)) (storew value symbol symbol-value-slot other-pointer-lowtag) (storew 0 bsp (- binding-symbol-slot binding-size)) (storew 0 bsp (- binding-value-slot binding-size)) (inst sub bsp (* binding-size n-word-bytes)) (store-symbol-value bsp *binding-stack-pointer*)))(define-vop (unbind-to-here) (:args (where :scs (descriptor-reg any-reg))) (:temporary (:sc unsigned-reg) symbol value bsp #!+sb-thread tls-index) (:generator 0 (load-binding-stack-pointer bsp) (inst cmp where bsp) (inst jmp :e DONE) LOOP (loadw symbol bsp (- binding-symbol-slot binding-size)) (inst or symbol symbol) (inst jmp :z SKIP) ;; Bind stack debug sentinels have the unbound marker in the symbol slot (inst cmp symbol unbound-marker-widetag) (inst jmp :eq SKIP) (loadw value bsp (- binding-value-slot binding-size)) #!-sb-thread (storew value symbol symbol-value-slot other-pointer-lowtag) #!+sb-thread (loadw tls-index symbol symbol-tls-index-slot other-pointer-lowtag) #!+sb-thread (inst mov (make-ea :qword :base thread-base-tn :scale 1 :index tls-index) value) (storew 0 bsp (- binding-symbol-slot binding-size)) SKIP (storew 0 bsp (- binding-value-slot binding-size)) (inst sub bsp (* binding-size n-word-bytes)) (inst cmp where bsp) (inst jmp :ne LOOP) (store-binding-stack-pointer bsp) DONE))(define-vop (bind-sentinel) (:temporary (:sc unsigned-reg) bsp) (:generator 1 (load-binding-stack-pointer bsp) (inst add bsp (* binding-size n-word-bytes)) (storew unbound-marker-widetag bsp (- binding-symbol-slot binding-size)) (storew rbp-tn bsp (- binding-value-slot binding-size)) (store-binding-stack-pointer bsp)))(define-vop (unbind-sentinel) (:temporary (:sc unsigned-reg) bsp) (:generator 1 (load-binding-stack-pointer bsp) (storew 0 bsp (- binding-value-slot binding-size)) (storew 0 bsp (- binding-symbol-slot binding-size)) (inst sub bsp (* binding-size n-word-bytes)) (store-binding-stack-pointer bsp)));;;; closure indexing(define-full-reffer closure-index-ref * closure-info-offset fun-pointer-lowtag (any-reg descriptor-reg) * %closure-index-ref)(define-full-setter set-funcallable-instance-info * funcallable-instance-info-offset fun-pointer-lowtag (any-reg descriptor-reg) * %set-funcallable-instance-info)(define-full-reffer funcallable-instance-info * funcallable-instance-info-offset fun-pointer-lowtag (descriptor-reg any-reg) * %funcallable-instance-info)(define-vop (closure-ref slot-ref) (:variant closure-info-offset fun-pointer-lowtag))(define-vop (closure-init slot-set) (:variant closure-info-offset fun-pointer-lowtag));;;; value cell hackery(define-vop (value-cell-ref cell-ref) (:variant value-cell-value-slot other-pointer-lowtag))(define-vop (value-cell-set cell-set) (:variant value-cell-value-slot other-pointer-lowtag));;;; structure hackery(define-vop (instance-length) (:policy :fast-safe) (:translate %instance-length) (:args (struct :scs (descriptor-reg))) (:results (res :scs (unsigned-reg))) (:result-types positive-fixnum) (:generator 4 (loadw res struct 0 instance-pointer-lowtag) (inst shr res n-widetag-bits)))(define-full-reffer instance-index-ref * instance-slots-offset instance-pointer-lowtag (any-reg descriptor-reg) * %instance-ref)(define-full-setter instance-index-set * instance-slots-offset instance-pointer-lowtag (any-reg descriptor-reg) * %instance-set)(define-full-compare-and-swap %compare-and-swap-instance-ref instance instance-slots-offset instance-pointer-lowtag (any-reg descriptor-reg) * %compare-and-swap-instance-ref);;;; code object frobbing(define-full-reffer code-header-ref * 0 other-pointer-lowtag (any-reg descriptor-reg) * code-header-ref)(define-full-setter code-header-set * 0 other-pointer-lowtag (any-reg descriptor-reg) * code-header-set);;;; raw instance slot accessors(defun make-ea-for-raw-slot (object index instance-length &optional (adjustment 0)) (if (integerp instance-length) ;; For RAW-INSTANCE-INIT/* VOPs, which know the exact instance length ;; at compile time. (make-ea :qword :base object :disp (+ (* (- instance-length instance-slots-offset index) n-word-bytes) (- instance-pointer-lowtag) adjustment)) (etypecase index (tn (make-ea :qword :base object :index instance-length :disp (+ (* (1- instance-slots-offset) n-word-bytes) (- instance-pointer-lowtag) adjustment))) (integer (make-ea :qword :base object :index instance-length :scale 8 :disp (+ (* (1- instance-slots-offset) n-word-bytes) (- instance-pointer-lowtag) adjustment (* index (- n-word-bytes))))))))(define-vop (raw-instance-ref/word) (:translate %raw-instance-ref/word) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (index :scs (any-reg))) (:arg-types * tagged-num) (:temporary (:sc unsigned-reg) tmp) (:results (value :scs (unsigned-reg))) (:result-types unsigned-num) (:generator 5 (loadw tmp object 0 instance-pointer-lowtag) (inst shr tmp n-widetag-bits) (inst shl tmp 3) (inst sub tmp index) (inst mov value (make-ea-for-raw-slot object index tmp))))(define-vop (raw-instance-ref-c/word) (:translate %raw-instance-ref/word) (:policy :fast-safe) (:args (object :scs (descriptor-reg))) (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes #.instance-pointer-lowtag #.instance-slots-offset))) (:info index) (:temporary (:sc unsigned-reg) tmp) (:results (value :scs (unsigned-reg))) (:result-types unsigned-num) (:generator 4 (loadw tmp object 0 instance-pointer-lowtag) (inst shr tmp n-widetag-bits) (inst mov value (make-ea-for-raw-slot object index tmp))))(define-vop (raw-instance-set/word) (:translate %raw-instance-set/word) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (index :scs (any-reg)) (value :scs (unsigned-reg) :target result)) (:arg-types * tagged-num unsigned-num) (:temporary (:sc unsigned-reg) tmp) (:results (result :scs (unsigned-reg))) (:result-types unsigned-num) (:generator 5 (loadw tmp object 0 instance-pointer-lowtag) (inst shr tmp n-widetag-bits) (inst shl tmp 3) (inst sub tmp index) (inst mov (make-ea-for-raw-slot object index tmp) value) (move result value)))(define-vop (raw-instance-set-c/word) (:translate %raw-instance-set/word) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (value :scs (unsigned-reg) :target result)) (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes #.instance-pointer-lowtag #.instance-slots-offset)) unsigned-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) (inst mov (make-ea-for-raw-slot object index tmp) value) (move result value)))(define-vop (raw-instance-init/word) (:args (object :scs (descriptor-reg)) (value :scs (unsigned-reg))) (:arg-types * unsigned-num) (:info instance-length index) (: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) (inst xadd (make-ea-for-raw-slot object index tmp) diff :lock) (move result diff)))(define-vop (raw-instance-ref/single) (:translate %raw-instance-ref/single) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (index :scs (any-reg))) (:arg-types * positive-fixnum) (:temporary (:sc unsigned-reg) tmp) (:results (value :scs (single-reg))) (:result-types single-float) (:generator 5 (loadw tmp object 0 instance-pointer-lowtag) (inst shr tmp n-widetag-bits) (inst shl tmp 3) (inst sub tmp index) (inst movss value (make-ea-for-raw-slot object index tmp))))(define-vop (raw-instance-ref-c/single) (:translate %raw-instance-ref/single) (:policy :fast-safe) (:args (object :scs (descriptor-reg))) (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes #.instance-pointer-lowtag #.instance-slots-offset))) (:info index) (:temporary (:sc unsigned-reg) tmp) (:results (value :scs (single-reg))) (:result-types single-float) (:generator 4 (loadw tmp object 0 instance-pointer-lowtag)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -