diff --git a/compiler/x86/array.lisp b/compiler/x86/array.lisp index b05ec2624799f2a0cf1d58dc14754ae7045f5fd7..a8cbde23dac182c70aa1b8b0d04eb1e57596e06e 100644 --- a/compiler/x86/array.lisp +++ b/compiler/x86/array.lisp @@ -7,7 +7,7 @@ ;;; Scott Fahlman or slisp-group@cs.cmu.edu. ;;; (ext:file-comment - "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/array.lisp,v 1.2 1997/02/05 15:34:13 pw Exp $") + "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/array.lisp,v 1.3 1997/03/25 16:59:26 dtc Exp $") ;;; ;;; ********************************************************************** ;;; @@ -95,7 +95,7 @@ (bound :scs (any-reg)) (index :scs (any-reg immediate) :target result)) (:arg-types * positive-fixnum tagged-num) - (:results (result :scs (any-reg immediate-stack))) + (:results (result :scs (any-reg descriptor-reg))) (:result-types positive-fixnum) (:vop-var vop) (:save-p :compute-only) @@ -109,8 +109,7 @@ ;; we get the < 0 and >= bound test all rolled into one. (inst jmp :be error) (unless (and (tn-p index) (location= result index)) - (inst mov result index)) - ))) + (inst mov result index))))) ;;;; Accessors/Setters @@ -583,8 +582,7 @@ (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to (:eval 0)) (index :scs (unsigned-reg) :to (:eval 0)) - (value :scs (unsigned-reg unsigned-stack signed-reg signed-stack) - :target eax)) + (value :scs (unsigned-reg signed-reg) :target eax)) (:arg-types simple-array-unsigned-byte-8 positive-fixnum positive-fixnum) (:temporary (:sc dword-reg :offset eax-offset :target result :from (:argument 2) :to (:result 0)) @@ -604,8 +602,7 @@ (:translate data-vector-set) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to (:eval 0)) - (value :scs (unsigned-reg unsigned-stack signed-reg signed-stack) - :target eax)) + (value :scs (unsigned-reg signed-reg) :target eax)) (:info index) (:arg-types simple-array-unsigned-byte-8 (:constant (signed-byte 30)) positive-fixnum) @@ -662,8 +659,7 @@ (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to (:eval 0)) (index :scs (unsigned-reg) :to (:eval 0)) - (value :scs (unsigned-reg unsigned-stack signed-reg signed-stack) - :target eax)) + (value :scs (unsigned-reg signed-reg) :target eax)) (:arg-types simple-array-unsigned-byte-16 positive-fixnum positive-fixnum) (:temporary (:sc dword-reg :offset eax-offset :target result :from (:argument 2) :to (:result 0)) @@ -683,8 +679,7 @@ (:translate data-vector-set) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to (:eval 0)) - (value :scs (unsigned-reg unsigned-stack signed-reg signed-stack) - :target eax)) + (value :scs (unsigned-reg signed-reg) :target eax)) (:info index) (:arg-types simple-array-unsigned-byte-16 (:constant (signed-byte 30)) positive-fixnum) (:temporary (:sc dword-reg :offset eax-offset :target result @@ -778,3 +773,81 @@ other-pointer-type)) value) (move result value))) + + +;;; signed-byte-16 + +#+nil +(define-vop (data-vector-ref/simple-array-signed-byte-16) + (:translate data-vector-ref) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg)) + (index :scs (unsigned-reg))) + (:arg-types simple-array-signed-byte-16 positive-fixnum) + (:results (value :scs (signed-reg))) + (:result-types tagged-num) + (:generator 5 + (inst movsx value + (make-ea :word :base object :index index :scale 2 + :disp (- (* vector-data-offset word-bytes) + other-pointer-type))))) + +#+nil +(define-vop (data-vector-ref-c/simple-array-signed-byte-16) + (:translate data-vector-ref) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg))) + (:info index) + (:arg-types simple-array-signed-byte-16 (:constant (signed-byte 30))) + (:results (value :scs (signed-reg))) + (:result-types tagged-num) + (:generator 4 + (inst movsx value + (make-ea :word :base object + :disp (- (+ (* vector-data-offset word-bytes) + (* 2 index)) + other-pointer-type))))) + +#+nil +(define-vop (data-vector-set/simple-array-signed-byte-16) + (:translate data-vector-set) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg) :to (:eval 0)) + (index :scs (unsigned-reg) :to (:eval 0)) + (value :scs (signed-reg) :target eax)) + (:arg-types simple-array-signed-byte-16 positive-fixnum tagged-num) + (:temporary (:sc dword-reg :offset eax-offset :target result + :from (:argument 2) :to (:result 0)) + eax) + (:results (result :scs (signed-reg))) + (:result-types tagged-num) + (:generator 5 + (move eax value) + (inst mov (make-ea :word :base object :index index :scale 2 + :disp (- (* vector-data-offset word-bytes) + other-pointer-type)) + ax-tn) + (move result eax))) + +#+nil +(define-vop (data-vector-set-c/simple-array-signed-byte-16) + (:translate data-vector-set) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg) :to (:eval 0)) + (value :scs (signed-reg) :target eax)) + (:info index) + (:arg-types simple-array-signed-byte-16 (:constant (signed-byte 30)) tagged-num) + (:temporary (:sc dword-reg :offset eax-offset :target result + :from (:argument 1) :to (:result 0)) + eax) + (:results (result :scs (signed-reg))) + (:result-types tagged-num) + (:generator 4 + (move eax value) + (inst mov + (make-ea :word :base object + :disp (- (+ (* vector-data-offset word-bytes) + (* 2 index)) + other-pointer-type)) + ax-tn) + (move result eax)))