📄 array.lisp
字号:
(t value)) (+ (* extra ,bits) ,(1- bits)) ,bits old) (if (typep offset '(signed-byte 14)) (inst stw old offset object) (inst stw old (ldb (byte 11 0) offset) lip))) (sc-case value (immediate (inst li (tn-value value) result)) (t (move value result)))))))))) (def-small-data-vector-frobs simple-bit-vector 1) (def-small-data-vector-frobs simple-array-unsigned-byte-2 2) (def-small-data-vector-frobs simple-array-unsigned-byte-4 4));;; And the float variants.(define-vop (data-vector-ref/simple-array-single-float) (:note "inline array access") (:translate data-vector-ref) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to (:argument 1)) (index :scs (any-reg) :to (:argument 0) :target offset)) (:arg-types simple-array-single-float positive-fixnum) (:results (value :scs (single-reg))) (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) offset) (:result-types single-float) (:generator 5 (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) index offset) (inst fldx offset object value)))(define-vop (data-vector-set/simple-array-single-float) (:note "inline array store") (:translate data-vector-set) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to (:argument 1)) (index :scs (any-reg) :to (:argument 0) :target offset) (value :scs (single-reg) :target result)) (:arg-types simple-array-single-float positive-fixnum single-float) (:results (result :scs (single-reg))) (:result-types single-float) (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) offset) (:generator 5 (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) index offset) (inst fstx value offset object) (unless (location= result value) (inst funop :copy value result))))(define-vop (data-vector-ref/simple-array-double-float) (:note "inline array access") (:translate data-vector-ref) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to (:argument 1)) (index :scs (any-reg) :to (:argument 0) :target offset)) (:arg-types simple-array-double-float positive-fixnum) (:results (value :scs (double-reg))) (:result-types double-float) (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) offset) (:generator 7 (inst sll index 1 offset) (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) offset offset) (inst fldx offset object value)))(define-vop (data-vector-set/simple-array-double-float) (:note "inline array store") (:translate data-vector-set) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to (:argument 1)) (index :scs (any-reg) :to (:argument 0) :target offset) (value :scs (double-reg) :target result)) (:arg-types simple-array-double-float positive-fixnum double-float) (:results (result :scs (double-reg))) (:result-types double-float) (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) offset) (:generator 20 (inst sll index 1 offset) (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) offset offset) (inst fstx value offset object) (unless (location= result value) (inst funop :copy value result))));;; Complex float arrays.(define-vop (data-vector-ref/simple-array-complex-single-float) (:note "inline array access") (:translate data-vector-ref) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to :result) (index :scs (any-reg))) (:arg-types simple-array-complex-single-float positive-fixnum) (:results (value :scs (complex-single-reg))) (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset) (:result-types complex-single-float) (:generator 5 (inst sll index 1 offset) (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) offset offset) (let ((real-tn (complex-single-reg-real-tn value))) (inst fldx offset object real-tn)) (let ((imag-tn (complex-single-reg-imag-tn value))) (inst addi n-word-bytes offset offset) (inst fldx offset object imag-tn))))(define-vop (data-vector-set/simple-array-complex-single-float) (:note "inline array store") (:translate data-vector-set) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to :result) (index :scs (any-reg)) (value :scs (complex-single-reg) :target result)) (:arg-types simple-array-complex-single-float positive-fixnum complex-single-float) (:results (result :scs (complex-single-reg))) (:result-types complex-single-float) (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset) (:generator 5 (inst sll index 1 offset) (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) offset offset) (let ((value-real (complex-single-reg-real-tn value)) (result-real (complex-single-reg-real-tn result))) (inst fstx value-real offset object) (unless (location= result-real value-real) (inst funop :copy value-real result-real))) (let ((value-imag (complex-single-reg-imag-tn value)) (result-imag (complex-single-reg-imag-tn result))) (inst addi n-word-bytes offset offset) (inst fstx value-imag offset object) (unless (location= result-imag value-imag) (inst funop :copy value-imag result-imag)))))(define-vop (data-vector-ref/simple-array-complex-double-float) (:note "inline array access") (:translate data-vector-ref) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to :result) (index :scs (any-reg))) (:arg-types simple-array-complex-double-float positive-fixnum) (:results (value :scs (complex-double-reg))) (:result-types complex-double-float) (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset) (:generator 7 (inst sll index 2 offset) (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) offset offset) (let ((real-tn (complex-double-reg-real-tn value))) (inst fldx offset object real-tn)) (let ((imag-tn (complex-double-reg-imag-tn value))) (inst addi (* 2 n-word-bytes) offset offset) (inst fldx offset object imag-tn))))(define-vop (data-vector-set/simple-array-complex-double-float) (:note "inline array store") (:translate data-vector-set) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to :result) (index :scs (any-reg)) (value :scs (complex-double-reg) :target result)) (:arg-types simple-array-complex-double-float positive-fixnum complex-double-float) (:results (result :scs (complex-double-reg))) (:result-types complex-double-float) (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset) (:generator 20 (inst sll index 2 offset) (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) offset offset) (let ((value-real (complex-double-reg-real-tn value)) (result-real (complex-double-reg-real-tn result))) (inst fstx value-real offset object) (unless (location= result-real value-real) (inst funop :copy value-real result-real))) (let ((value-imag (complex-double-reg-imag-tn value)) (result-imag (complex-double-reg-imag-tn result))) (inst addi (* 2 n-word-bytes) offset offset) (inst fstx value-imag offset object) (unless (location= result-imag value-imag) (inst funop :copy value-imag result-imag)))));;; These VOPs are used for implementing float slots in structures (whose raw;;; data is an unsigned-32 vector.(define-vop (raw-ref-single data-vector-ref/simple-array-single-float) (:translate %raw-ref-single) (:arg-types sb!c::raw-vector positive-fixnum))(define-vop (raw-set-single data-vector-set/simple-array-single-float) (:translate %raw-set-single) (:arg-types sb!c::raw-vector positive-fixnum single-float))(define-vop (raw-ref-double data-vector-ref/simple-array-double-float) (:translate %raw-ref-double) (:arg-types sb!c::raw-vector positive-fixnum))(define-vop (raw-set-double data-vector-set/simple-array-double-float) (:translate %raw-set-double) (:arg-types sb!c::raw-vector positive-fixnum double-float))(define-vop (raw-ref-complex-single data-vector-ref/simple-array-complex-single-float) (:translate %raw-ref-complex-single) (:arg-types sb!c::raw-vector positive-fixnum))(define-vop (raw-set-complex-single data-vector-set/simple-array-complex-single-float) (:translate %raw-set-complex-single) (:arg-types sb!c::raw-vector positive-fixnum complex-single-float))(define-vop (raw-ref-complex-double data-vector-ref/simple-array-complex-double-float) (:translate %raw-ref-complex-double) (:arg-types sb!c::raw-vector positive-fixnum))(define-vop (raw-set-complex-double data-vector-set/simple-array-complex-double-float) (:translate %raw-set-complex-double) (:arg-types sb!c::raw-vector positive-fixnum complex-double-float));;; These vops are useful for accessing the bits of a vector irrespective of;;; what type of vector it is.(define-full-reffer raw-bits * 0 other-pointer-lowtag (unsigned-reg) unsigned-num %raw-bits)(define-full-setter set-raw-bits * 0 other-pointer-lowtag (unsigned-reg) unsigned-num %set-raw-bits)(define-full-reffer vector-raw-bits * vector-data-offset other-pointer-lowtag (unsigned-reg) unsigned-num %vector-raw-bits)(define-full-setter set-vector-raw-bits * vector-data-offset other-pointer-lowtag (unsigned-reg) unsigned-num %set-vector-raw-bits);;;; Misc. Array VOPs.(define-vop (get-vector-subtype get-header-data))(define-vop (set-vector-subtype set-header-data))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -