[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