⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cell.lisp

📁 开源跨平台Lisp编译器
💻 LISP
📖 第 1 页 / 共 3 页
字号:
    (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 + -