Micro-optimize calling alloc_tramp on x86_64.
[sbcl.git] / src / compiler / mips / array.lisp
index 2f501b2..fd8a76e 100644 (file)
   (: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)
   (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
 \f
 ;;; 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