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

📄 cell.lisp

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