X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fmips%2Farray.lisp;h=fd8a76e47fc1a35c94d5ff8f920c37a19c0bd176;hb=aa7b669779e8e88349938ca962229f31ead08af2;hp=2f501b2f8927c5ed9705b295a4d22b33820b86e1;hpb=c823a0c4ad5be108455745c7b451228182d5d164;p=sbcl.git diff --git a/src/compiler/mips/array.lisp b/src/compiler/mips/array.lisp index 2f501b2..fd8a76e 100644 --- a/src/compiler/mips/array.lisp +++ b/src/compiler/mips/array.lisp @@ -18,18 +18,19 @@ (:args (type :scs (any-reg)) (rank :scs (any-reg))) (:arg-types positive-fixnum positive-fixnum) - (:temporary (:scs (any-reg)) bytes) - (:temporary (:scs (non-descriptor-reg)) header) + (:temporary (:scs (non-descriptor-reg)) bytes header) (:temporary (:sc non-descriptor-reg :offset nl4-offset) pa-flag) (:results (result :scs (descriptor-reg))) (:generator 13 - (inst addu bytes rank (+ (* array-dimensions-offset n-word-bytes) + (inst addu bytes rank (+ (* (1+ array-dimensions-offset) n-word-bytes) lowtag-mask)) - (inst li header (lognot lowtag-mask)) - (inst and bytes header) + (inst srl bytes n-lowtag-bits) + (inst sll bytes n-lowtag-bits) (inst addu header rank (fixnumize (1- array-dimensions-offset))) (inst sll header n-widetag-bits) - (inst or header header type) + (inst or header type) + ;; Remove the extraneous fixnum tag bits because TYPE and RANK + ;; were fixnums (inst srl header n-fixnum-tag-bits) (pseudo-atomic (pa-flag) (inst or result alloc-tn other-pointer-lowtag) @@ -130,9 +131,9 @@ (def-partial-data-vector-frobs simple-array-signed-byte-16 tagged-num :short t signed-reg) - (def-full-data-vector-frobs simple-array-unsigned-byte-29 positive-fixnum + (def-full-data-vector-frobs simple-array-unsigned-fixnum positive-fixnum any-reg) - (def-full-data-vector-frobs simple-array-signed-byte-30 tagged-num + (def-full-data-vector-frobs simple-array-fixnum tagged-num any-reg) (def-full-data-vector-frobs simple-array-signed-byte-32 signed-num @@ -512,10 +513,6 @@ ;;; 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