📄 cell.lisp
字号:
(: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 xadd (make-ea-for-raw-slot object index tmp 1) 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 immediate))) (:arg-types * tagged-num) (: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) (when (sc-is index any-reg) (inst shl tmp 2) (inst sub tmp index)) (with-empty-tn@fp-top(value) (inst fld (make-ea-for-raw-slot object index tmp 1)))))(define-vop (raw-instance-set/single) (:translate %raw-instance-set/single) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate)) (value :scs (single-reg) :target result)) (:arg-types * tagged-num single-float) (:temporary (:sc unsigned-reg) tmp) (:results (result :scs (single-reg))) (:result-types single-float) (: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)) (unless (zerop (tn-offset value)) (inst fxch value)) (inst fst (make-ea-for-raw-slot object index tmp 1)) (cond ((zerop (tn-offset value)) (unless (zerop (tn-offset result)) (inst fst result))) ((zerop (tn-offset result)) (inst fst value)) (t (unless (location= value result) (inst fst result)) (inst fxch value)))))(define-vop (raw-instance-init/single) (:args (object :scs (descriptor-reg)) (value :scs (single-reg))) (:arg-types * single-float) (:info instance-length index) (:generator 5 (with-tn@fp-top (value) (inst fst (make-ea-for-raw-slot object index instance-length 1)))))(define-vop (raw-instance-ref/double) (:translate %raw-instance-ref/double) (: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 (double-reg))) (:result-types double-float) (: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)) (with-empty-tn@fp-top(value) (inst fldd (make-ea-for-raw-slot object index tmp 2)))))(define-vop (raw-instance-set/double) (:translate %raw-instance-set/double) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate)) (value :scs (double-reg) :target result)) (:arg-types * tagged-num double-float) (:temporary (:sc unsigned-reg) tmp) (:results (result :scs (double-reg))) (:result-types double-float) (: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)) (unless (zerop (tn-offset value)) (inst fxch value)) (inst fstd (make-ea-for-raw-slot object index tmp 2)) (cond ((zerop (tn-offset value)) (unless (zerop (tn-offset result)) (inst fstd result))) ((zerop (tn-offset result)) (inst fstd value)) (t (unless (location= value result) (inst fstd result)) (inst fxch value)))))(define-vop (raw-instance-init/double) (:args (object :scs (descriptor-reg)) (value :scs (double-reg))) (:arg-types * double-float) (:info instance-length index) (:generator 5 (with-tn@fp-top (value) (inst fstd (make-ea-for-raw-slot object index instance-length 2)))))(define-vop (raw-instance-ref/complex-single) (:translate %raw-instance-ref/complex-single) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate))) (:arg-types * positive-fixnum) (:temporary (:sc unsigned-reg) tmp) (:results (value :scs (complex-single-reg))) (:result-types complex-single-float) (: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)) (let ((real-tn (complex-single-reg-real-tn value))) (with-empty-tn@fp-top (real-tn) (inst fld (make-ea-for-raw-slot object index tmp 2)))) (let ((imag-tn (complex-single-reg-imag-tn value))) (with-empty-tn@fp-top (imag-tn) (inst fld (make-ea-for-raw-slot object index tmp 1))))))(define-vop (raw-instance-set/complex-single) (:translate %raw-instance-set/complex-single) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate)) (value :scs (complex-single-reg) :target result)) (:arg-types * positive-fixnum complex-single-float) (:temporary (:sc unsigned-reg) tmp) (:results (result :scs (complex-single-reg))) (:result-types complex-single-float) (: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)) (let ((value-real (complex-single-reg-real-tn value)) (result-real (complex-single-reg-real-tn result))) (cond ((zerop (tn-offset value-real)) ;; Value is in ST0. (inst fst (make-ea-for-raw-slot object index tmp 2)) (unless (zerop (tn-offset result-real)) ;; Value is in ST0 but not result. (inst fst result-real))) (t ;; Value is not in ST0. (inst fxch value-real) (inst fst (make-ea-for-raw-slot object index tmp 2)) (cond ((zerop (tn-offset result-real)) ;; The result is in ST0. (inst fst value-real)) (t ;; Neither value or result are in ST0 (unless (location= value-real result-real) (inst fst result-real)) (inst fxch value-real)))))) (let ((value-imag (complex-single-reg-imag-tn value)) (result-imag (complex-single-reg-imag-tn result))) (inst fxch value-imag) (inst fst (make-ea-for-raw-slot object index tmp 1)) (unless (location= value-imag result-imag) (inst fst result-imag)) (inst fxch value-imag))))(define-vop (raw-instance-init/complex-single) (:args (object :scs (descriptor-reg)) (value :scs (complex-single-reg))) (:arg-types * complex-single-float) (:info instance-length index) (:generator 5 (let ((value-real (complex-single-reg-real-tn value))) (with-tn@fp-top (value-real) (inst fst (make-ea-for-raw-slot object index instance-length 2)))) (let ((value-imag (complex-single-reg-imag-tn value))) (with-tn@fp-top (value-imag) (inst fst (make-ea-for-raw-slot object index instance-length 1))))))(define-vop (raw-instance-ref/complex-double) (:translate %raw-instance-ref/complex-double) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate))) (:arg-types * positive-fixnum) (:temporary (:sc unsigned-reg) tmp) (:results (value :scs (complex-double-reg))) (:result-types complex-double-float) (:generator 7 (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)) (let ((real-tn (complex-double-reg-real-tn value))) (with-empty-tn@fp-top (real-tn) (inst fldd (make-ea-for-raw-slot object index tmp 4)))) (let ((imag-tn (complex-double-reg-imag-tn value))) (with-empty-tn@fp-top (imag-tn) (inst fldd (make-ea-for-raw-slot object index tmp 2))))))(define-vop (raw-instance-set/complex-double) (:translate %raw-instance-set/complex-double) (:policy :fast-safe) (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate)) (value :scs (complex-double-reg) :target result)) (:arg-types * positive-fixnum complex-double-float) (:temporary (:sc unsigned-reg) tmp) (:results (result :scs (complex-double-reg))) (:result-types complex-double-float) (:generator 20 (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)) (let ((value-real (complex-double-reg-real-tn value)) (result-real (complex-double-reg-real-tn result))) (cond ((zerop (tn-offset value-real)) ;; Value is in ST0. (inst fstd (make-ea-for-raw-slot object index tmp 4)) (unless (zerop (tn-offset result-real)) ;; Value is in ST0 but not result. (inst fstd result-real))) (t ;; Value is not in ST0. (inst fxch value-real) (inst fstd (make-ea-for-raw-slot object index tmp 4)) (cond ((zerop (tn-offset result-real)) ;; The result is in ST0. (inst fstd value-real)) (t ;; Neither value or result are in ST0 (unless (location= value-real result-real) (inst fstd result-real)) (inst fxch value-real)))))) (let ((value-imag (complex-double-reg-imag-tn value)) (result-imag (complex-double-reg-imag-tn result))) (inst fxch value-imag) (inst fstd (make-ea-for-raw-slot object index tmp 2)) (unless (location= value-imag result-imag) (inst fstd result-imag)) (inst fxch value-imag))))(define-vop (raw-instance-init/complex-double) (:args (object :scs (descriptor-reg)) (value :scs (complex-double-reg))) (:arg-types * complex-double-float) (:info instance-length index) (:generator 20 (let ((value-real (complex-double-reg-real-tn value))) (with-tn@fp-top (value-real) (inst fstd (make-ea-for-raw-slot object index instance-length 4)))) (let ((value-imag (complex-double-reg-imag-tn value))) (with-tn@fp-top (value-imag) (inst fstd (make-ea-for-raw-slot object index instance-length 2))))))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -