[prev in list] [next in list] [prev in thread] [next in thread] 

List:       sbcl-commits
Subject:    [Sbcl-commits] master: use fixnums for x86-64 array accessor VOPs when possible
From:       "Nathan Froyd" <nfroyd () users ! sourceforge ! net>
Date:       2012-04-15 23:49:13
Message-ID: E1SJZC1-0002E8-Ei () sfs-ml-3 ! v29 ! ch3 ! sourceforge ! com
[Download RAW message or body]

The branch "master" has been updated in SBCL:
       via  a8e49202d33fffbfe2de1990159d62be25794dfe (commit)
      from  91d6d6dd140340948d4142f1bdf1d9b4fb215b90 (commit)

- Log -----------------------------------------------------------------
commit a8e49202d33fffbfe2de1990159d62be25794dfe
Author: Nathan Froyd <froydnj@gmail.com>
Date:   Sun Apr 15 19:45:51 2012 -0400

    use fixnums for x86-64 array accessor VOPs when possible
    
    Now that we have fixnums with 1-bit tags on x86-64, we can use them
    directly for accessing arrays with 16- and 32-bit elements, rather
    than converting to unsigned words first.
    
    This patch is originally from Paul Khuong:
    
    http://paste.lisp.org/display/128545
---
 src/compiler/x86-64/array.lisp |  154 ++++++++++++++++++++-------------------
 1 files changed, 79 insertions(+), 75 deletions(-)

diff --git a/src/compiler/x86-64/array.lisp b/src/compiler/x86-64/array.lisp
index 28060d9..6102251 100644
--- a/src/compiler/x86-64/array.lisp
+++ b/src/compiler/x86-64/array.lisp
@@ -637,82 +637,86 @@
                    (:byte 1)
                    (:word 2)
                    (:dword 4))))
-    `(progn
-      (define-vop (,(symbolicate "DATA-VECTOR-REF-WITH-OFFSET/" ptype))
-        (:translate data-vector-ref-with-offset)
-        (:policy :fast-safe)
-        (:args (object :scs (descriptor-reg))
-               (index :scs (unsigned-reg)))
-        (:info offset)
-        (:arg-types ,ptype positive-fixnum
-                    (:constant (constant-displacement other-pointer-lowtag
-                                                      ,n-bytes vector-data-offset)))
-        (:results (value :scs ,scs))
-        (:result-types ,type)
-        (:generator 5
-          (inst ,mov-inst value
-                (make-ea ,operand-size :base object :index index :scale ,n-bytes
-                         :disp (- (+ (* vector-data-offset n-word-bytes)
-                                     (* offset ,n-bytes))
-                                  other-pointer-lowtag)))))
-      (define-vop (,(symbolicate "DATA-VECTOR-REF-C-WITH-OFFSET/" ptype))
-        (:translate data-vector-ref-with-offset)
-        (:policy :fast-safe)
-        (:args (object :scs (descriptor-reg)))
-        (:info index offset)
-        (:arg-types ,ptype (:constant low-index)
-                    (:constant (constant-displacement other-pointer-lowtag
-                                                      ,n-bytes vector-data-offset)))
-        (:results (value :scs ,scs))
-        (:result-types ,type)
-        (:generator 4
-          (inst ,mov-inst value
-                (make-ea ,operand-size :base object
-                         :disp (- (+ (* vector-data-offset n-word-bytes)
-                                     (* ,n-bytes index)
-                                     (* ,n-bytes offset))
-                                  other-pointer-lowtag)))))
-      (define-vop (,(symbolicate "DATA-VECTOR-SET-WITH-OFFSET/" ptype))
-        (:translate data-vector-set-with-offset)
-        (:policy :fast-safe)
-        (:args (object :scs (descriptor-reg) :to (:eval 0))
-               (index :scs (unsigned-reg) :to (:eval 0))
-               (value :scs ,scs :target result))
-        (:info offset)
-        (:arg-types ,ptype positive-fixnum
-                    (:constant (constant-displacement other-pointer-lowtag
-                                                      ,n-bytes vector-data-offset))
-                    ,type)
-        (:results (result :scs ,scs))
-        (:result-types ,type)
-        (:generator 5
-          (inst mov (make-ea ,operand-size :base object :index index :scale ,n-bytes
-                             :disp (- (+ (* vector-data-offset n-word-bytes)
-                                         (* offset ,n-bytes))
-                                      other-pointer-lowtag))
-                (reg-in-size value ,operand-size))
-          (move result value)))
+    (multiple-value-bind (index-sc scale)
+        (if (>= n-bytes (ash 1 n-fixnum-tag-bits))
+            (values 'any-reg (ash n-bytes (- n-fixnum-tag-bits)))
+            (values 'unsigned-reg n-bytes))
+      `(progn
+         (define-vop (,(symbolicate "DATA-VECTOR-REF-WITH-OFFSET/" ptype))
+           (:translate data-vector-ref-with-offset)
+           (:policy :fast-safe)
+           (:args (object :scs (descriptor-reg))
+                  (index :scs (,index-sc)))
+           (:info offset)
+           (:arg-types ,ptype positive-fixnum
+                       (:constant (constant-displacement other-pointer-lowtag
+                                                         ,n-bytes vector-data-offset)))
+           (:results (value :scs ,scs))
+           (:result-types ,type)
+           (:generator 5
+                       (inst ,mov-inst value
+                             (make-ea ,operand-size :base object :index index :scale ,scale
+                                      :disp (- (+ (* vector-data-offset n-word-bytes)
+                                                  (* offset ,n-bytes))
+                                               other-pointer-lowtag)))))
+         (define-vop (,(symbolicate "DATA-VECTOR-REF-C-WITH-OFFSET/" ptype))
+           (:translate data-vector-ref-with-offset)
+           (:policy :fast-safe)
+           (:args (object :scs (descriptor-reg)))
+           (:info index offset)
+           (:arg-types ,ptype (:constant low-index)
+                       (:constant (constant-displacement other-pointer-lowtag
+                                                         ,n-bytes vector-data-offset)))
+           (:results (value :scs ,scs))
+           (:result-types ,type)
+           (:generator 4
+                       (inst ,mov-inst value
+                             (make-ea ,operand-size :base object
+                                      :disp (- (+ (* vector-data-offset n-word-bytes)
+                                                  (* ,n-bytes index)
+                                                  (* ,n-bytes offset))
+                                               other-pointer-lowtag)))))
+         (define-vop (,(symbolicate "DATA-VECTOR-SET-WITH-OFFSET/" ptype))
+           (:translate data-vector-set-with-offset)
+           (:policy :fast-safe)
+           (:args (object :scs (descriptor-reg) :to (:eval 0))
+                  (index :scs (,index-sc) :to (:eval 0))
+                  (value :scs ,scs :target result))
+           (:info offset)
+           (:arg-types ,ptype positive-fixnum
+                       (:constant (constant-displacement other-pointer-lowtag
+                                                         ,n-bytes vector-data-offset))
+                       ,type)
+           (:results (result :scs ,scs))
+           (:result-types ,type)
+           (:generator 5
+                       (inst mov (make-ea ,operand-size :base object :index index :scale ,scale
+                                          :disp (- (+ (* vector-data-offset n-word-bytes)
+                                                      (* offset ,n-bytes))
+                                                   other-pointer-lowtag))
+                             (reg-in-size value ,operand-size))
+                       (move result value)))
 
-      (define-vop (,(symbolicate "DATA-VECTOR-SET-C-WITH-OFFSET/" ptype))
-        (:translate data-vector-set-with-offset)
-        (:policy :fast-safe)
-        (:args (object :scs (descriptor-reg) :to (:eval 0))
-               (value :scs ,scs :target result))
-        (:info index offset)
-        (:arg-types ,ptype (:constant low-index)
-                    (:constant (constant-displacement other-pointer-lowtag
-                                                      ,n-bytes vector-data-offset))
-                    ,type)
-        (:results (result :scs ,scs))
-        (:result-types ,type)
-        (:generator 4
-          (inst mov (make-ea ,operand-size :base object
-                             :disp (- (+ (* vector-data-offset n-word-bytes)
-                                         (* ,n-bytes index)
-                                         (* ,n-bytes offset))
-                                      other-pointer-lowtag))
-                (reg-in-size value ,operand-size))
-          (move result value)))))))
+         (define-vop (,(symbolicate "DATA-VECTOR-SET-C-WITH-OFFSET/" ptype))
+           (:translate data-vector-set-with-offset)
+           (:policy :fast-safe)
+           (:args (object :scs (descriptor-reg) :to (:eval 0))
+                  (value :scs ,scs :target result))
+           (:info index offset)
+           (:arg-types ,ptype (:constant low-index)
+                       (:constant (constant-displacement other-pointer-lowtag
+                                                         ,n-bytes vector-data-offset))
+                       ,type)
+           (:results (result :scs ,scs))
+           (:result-types ,type)
+           (:generator 4
+                       (inst mov (make-ea ,operand-size :base object
+                                          :disp (- (+ (* vector-data-offset n-word-bytes)
+                                                      (* ,n-bytes index)
+                                                      (* ,n-bytes offset))
+                                                   other-pointer-lowtag))
+                             (reg-in-size value ,operand-size))
+                       (move result value))))))))
   (define-data-vector-frobs simple-array-unsigned-byte-7 movzx :byte
     positive-fixnum unsigned-reg signed-reg)
   (define-data-vector-frobs simple-array-unsigned-byte-8 movzx :byte

-----------------------------------------------------------------------


hooks/post-receive
-- 
SBCL

------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
Sbcl-commits mailing list
Sbcl-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sbcl-commits
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic