X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fsparc%2Farray.lisp;h=67c59a796affbf79dbf4e8ef8619785caf31b3e8;hb=69d60b456b07a0256f08df0d02484f361ce5737c;hp=9fdb1ff61a307fa7c10f51ca968779a5269e5c7b;hpb=63817d29028c8551cda23f432a3328acd7fdd62f;p=sbcl.git diff --git a/src/compiler/sparc/array.lisp b/src/compiler/sparc/array.lisp index 9fdb1ff..67c59a7 100644 --- a/src/compiler/sparc/array.lisp +++ b/src/compiler/sparc/array.lisp @@ -12,7 +12,6 @@ (in-package "SB!VM") ;;;; allocator for the array header. - (define-vop (make-array-header) (:translate make-array-header) (:policy :fast-safe) @@ -36,7 +35,6 @@ (inst srl ndescr ndescr n-fixnum-tag-bits) (storew ndescr header 0 other-pointer-lowtag)) (move result header))) - ;;;; Additional accessors and setters for the array header. (define-vop (%array-dimension word-index-ref) @@ -84,7 +82,6 @@ ;;; Variants built on top of word-index-ref, etc. I.e. those vectors whos ;;; elements are represented in integer registers and are built out of ;;; 8, 16, or 32 bit elements. - (macrolet ((def-data-vector-frobs (type variant element-type &rest scs) `(progn (define-vop (,(symbolicate "DATA-VECTOR-REF/" (string type)) @@ -109,6 +106,9 @@ (def-data-vector-frobs simple-base-string byte-index character character-reg) + #!+sb-unicode + (def-data-vector-frobs simple-character-string word-index + character character-reg) (def-data-vector-frobs simple-vector word-index * descriptor-reg any-reg) @@ -607,70 +607,55 @@ ;;; 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)) -;;; #!+long-float (define-vop (raw-ref-long data-vector-ref/simple-array-long-float) (:translate %raw-ref-long) (:arg-types sb!c::raw-vector positive-fixnum)) -;;; #!+long-float (define-vop (raw-set-double data-vector-set/simple-array-long-float) (:translate %raw-set-long) (:arg-types sb!c::raw-vector positive-fixnum long-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)) -;;; #!+long-float (define-vop (raw-ref-complex-long data-vector-ref/simple-array-complex-long-float) (:translate %raw-ref-complex-long) (:arg-types sb!c::raw-vector positive-fixnum)) -;;; #!+long-float (define-vop (raw-set-complex-long data-vector-set/simple-array-complex-long-float) (:translate %raw-set-complex-long) (:arg-types sb!c::raw-vector positive-fixnum complex-long-float)) - ;;; These vops are useful for accessing the bits of a vector irrespective of ;;; what type of vector it is. -;;; - (define-vop (raw-bits word-index-ref) (:note "raw-bits VOP") (:translate %raw-bits) @@ -688,3 +673,21 @@ (:results (result :scs (unsigned-reg))) (:result-types unsigned-num) (:variant 0 other-pointer-lowtag)) + +(define-vop (vector-raw-bits word-index-ref) + (:note "vector-raw-bits VOP") + (:translate %vector-raw-bits) + (:results (value :scs (unsigned-reg))) + (:result-types unsigned-num) + (:variant vector-data-offset other-pointer-lowtag)) + +(define-vop (set-vector-raw-bits word-index-set) + (:note "setf vector-raw-bits VOP") + (:translate %set-vector-raw-bits) + (:args (object :scs (descriptor-reg)) + (index :scs (any-reg zero immediate)) + (value :scs (unsigned-reg))) + (:arg-types * tagged-num unsigned-num) + (:results (result :scs (unsigned-reg))) + (:result-types unsigned-num) + (:variant vector-data-offset other-pointer-lowtag)) \ No newline at end of file