📄 cell.lisp
字号:
(storew (make-fixup "undefined_tramp" :foreign) fdefn fdefn-raw-addr-slot other-pointer-lowtag) (move result fdefn)));;;; binding and unbinding;;; BIND -- Establish VAL as a binding for SYMBOL. Save the old value and;;; the symbol on the binding stack and stuff the new value into the;;; symbol.;;; FIXME: Split into DYNBIND and BIND: DYNBIND needs to ensure;;; TLS-INDEX, whereas BIND should assume it is already in place. Make;;; LET &co compile into BIND, and PROGV into DYNBIND, plus ensure;;; TLS-INDEX at compile-time, and make loader and dumper preserve;;; the existence of a TLS-INDEX.#!+sb-thread(define-vop (bind) (:args (val :scs (any-reg descriptor-reg)) (symbol :scs (descriptor-reg))) (:temporary (:sc unsigned-reg) tls-index bsp) (:generator 10 (let ((tls-index-valid (gen-label))) (load-binding-stack-pointer bsp) (loadw tls-index symbol symbol-tls-index-slot other-pointer-lowtag) (inst add bsp (* binding-size n-word-bytes)) (store-binding-stack-pointer bsp) (inst or tls-index tls-index) (inst jmp :ne tls-index-valid) (inst mov tls-index symbol) (inst call (make-fixup (ecase (tn-offset tls-index) (#.eax-offset 'alloc-tls-index-in-eax) (#.ebx-offset 'alloc-tls-index-in-ebx) (#.ecx-offset 'alloc-tls-index-in-ecx) (#.edx-offset 'alloc-tls-index-in-edx) (#.edi-offset 'alloc-tls-index-in-edi) (#.esi-offset 'alloc-tls-index-in-esi)) :assembly-routine)) (emit-label tls-index-valid) (inst push (make-ea :dword :base tls-index) :fs) (popw bsp (- binding-value-slot binding-size)) (storew symbol bsp (- binding-symbol-slot binding-size)) (inst mov (make-ea :dword :base tls-index) val :fs))))#!-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, then restore it to the TLS area. (loadw temp bsp (- binding-value-slot binding-size)) (inst mov (make-ea :dword :base tls-index) temp :fs) ;; 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 :dword :base tls-index) value :fs) (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 ebp-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 n-words) (if (integerp instance-length) ;; For RAW-INSTANCE-INIT/* VOPs, which know the exact instance length ;; at compile time. (make-ea :dword :base object :disp (- (* (- instance-length instance-slots-offset index (1- n-words)) n-word-bytes) instance-pointer-lowtag)) (flet ((make-ea-using-value (value) (make-ea :dword :base object :index instance-length :scale 4 :disp (- (* (- instance-slots-offset n-words) n-word-bytes) instance-pointer-lowtag (* value n-word-bytes))))) (if (typep index 'tn) (sc-case index (any-reg (make-ea :dword :base object :index instance-length :disp (- (* (- instance-slots-offset n-words) n-word-bytes) instance-pointer-lowtag))) (immediate (make-ea-using-value (tn-value index)))) (make-ea-using-value index)))))(define-vop (raw-instance-ref/word) (:translate %raw-instance-ref/word) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate))) (: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) (when (sc-is index any-reg) (inst shl tmp 2) (inst sub tmp index)) (inst mov value (make-ea-for-raw-slot object index tmp 1))))(define-vop (raw-instance-set/word) (:translate %raw-instance-set/word) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate)) (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) (when (sc-is index any-reg) (inst shl tmp 2) (inst sub tmp index)) (inst mov (make-ea-for-raw-slot object index tmp 1) 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 5 (inst mov (make-ea-for-raw-slot object index instance-length 1) value)))(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 immediate)) (diff :scs (signed-reg) :target result)) (:arg-types * tagged-num signed-num)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -