(sap-stack
(if (= (tn-offset fp) esp-offset)
(storew x fp (tn-offset y)) ; c-call
- (storew x fp (- (1+ (tn-offset y)))))))))
+ (storew x fp (frame-word-offset (tn-offset y))))))))
(define-move-vop move-sap-arg :move-arg
(descriptor-reg sap-reg) (sap-reg))
type
size
&optional signed)
- (let ((temp-sc (symbolicate size "-REG"))
- (element-size (ecase size
- (:byte 1)
- (:word 2)
- (:dword 4))))
+ (let ((temp-sc (symbolicate size "-REG")))
`(progn
(define-vop (,ref-name)
(:translate ,ref-name)
(offset :scs (signed-reg immediate)))
(:info disp)
(:arg-types system-area-pointer signed-num
- (:constant (constant-displacement 0 ; lowtag
- ,element-size
- 0)))
+ (:constant (constant-displacement 0 1 0)))
(:results (result :scs (,sc)))
(:result-types ,type)
(:generator 5
(immediate
(inst ,mov-inst result
(make-ea ,size :base sap
- :disp (+ (tn-value offset)
- (* ,element-size disp)))))
+ :disp (+ (tn-value offset) disp))))
(t (inst ,mov-inst result
(make-ea ,size :base sap
:index offset
- :disp (* ,element-size disp))))))))
+ :disp disp)))))))
(define-vop (,set-name)
(:translate ,set-name)
(:policy :fast-safe)
'temp)))
(:info disp)
(:arg-types system-area-pointer signed-num
- (:constant (constant-displacement 0 ; lowtag
- ,element-size
- 0))
+ (:constant (constant-displacement 0 1 0))
,type)
,@(unless (eq size :dword)
`((:temporary (:sc ,temp-sc :offset eax-offset
(immediate
(make-ea ,size :base sap
:disp (+ (tn-value offset)
- (* ,element-size disp))))
+ disp)))
(t (make-ea ,size
:base sap
:index offset
- :disp (* ,element-size disp))))
+ :disp disp)))
,(if (eq size :dword) 'value 'temp))
(move result
,(if (eq size :dword) 'value 'eax-tn))))))))
(offset :scs (signed-reg immediate)))
(:info disp)
(:arg-types system-area-pointer signed-num
- (:constant (constant-displacement 0 ; lowtag
- 8 ; double-float size
- 0)))
+ (:constant (constant-displacement 0 1 0)))
(:results (result :scs (double-reg)))
(:result-types double-float)
(:generator 5
(t
(with-empty-tn@fp-top(result)
(inst fldd (make-ea :dword :base sap :index offset
- :disp (* 4 disp))))))))
+ :disp disp)))))))
(define-vop (%set-sap-ref-double-with-offset)
(:translate sb!c::%set-sap-ref-double-with-offset)
(value :scs (double-reg)))
(:info disp)
(:arg-types system-area-pointer signed-num
- (:constant (constant-displacement 0 ; lowtag
- 8 ; double-float size
- 0))
+ (:constant (constant-displacement 0 1 0))
double-float)
(:results (result :scs (double-reg)))
(:result-types double-float)
(:generator 5
(cond ((zerop (tn-offset value))
;; Value is in ST0.
- (inst fstd (make-ea :dword :base sap :index offset
- :disp (* 8 disp)))
+ (inst fstd (make-ea :dword :base sap :index offset :disp disp))
(unless (zerop (tn-offset result))
;; Value is in ST0 but not result.
(inst fstd result)))
(t
;; Value is not in ST0.
(inst fxch value)
- (inst fstd (make-ea :dword :base sap :index offset
- :disp (* 8 disp)))
+ (inst fstd (make-ea :dword :base sap :index offset :disp disp))
(cond ((zerop (tn-offset result))
;; The result is in ST0.
(inst fstd value))
(:args (sap :scs (sap-reg) :to (:eval 0))
(value :scs (double-reg)))
(:arg-types system-area-pointer (:constant (signed-byte 32))
- (:constant (constant-displacement 0 ; lowtag
- 8 ; double-float size
- 0))
+ (:constant (constant-displacement 0 1 0))
double-float)
(:info offset disp)
(:results (result :scs (double-reg)))
(offset :scs (signed-reg immediate)))
(:info disp)
(:arg-types system-area-pointer signed-num
- (:constant (constant-displacement 0 ; lowtag
- 4 ; single-float size
- 0)))
+ (:constant (constant-displacement 0 1 0)))
(:results (result :scs (single-reg)))
(:result-types single-float)
(:generator 5
(inst fld (make-ea :dword :base sap :disp (tn-value offset)))))
(t
(with-empty-tn@fp-top(result)
- (inst fld (make-ea :dword :base sap :index offset
- :disp (* 4 disp))))))))
+ (inst fld (make-ea :dword :base sap :index offset :disp disp)))))))
(define-vop (%set-sap-ref-single-with-offset)
(:translate sb!c::%set-sap-ref-single-with-offset)
(value :scs (single-reg)))
(:info disp)
(:arg-types system-area-pointer signed-num
- (:constant (constant-displacement 0 ; lowtag
- 4 ; single-float size
- 0))
+ (:constant (constant-displacement 0 1 0))
single-float)
(:results (result :scs (single-reg)))
(:result-types single-float)
(:generator 5
(cond ((zerop (tn-offset value))
;; Value is in ST0
- (inst fst (make-ea :dword :base sap :index offset
- :disp (* 4 disp)))
+ (inst fst (make-ea :dword :base sap :index offset :disp disp))
(unless (zerop (tn-offset result))
;; Value is in ST0 but not result.
(inst fst result)))
(t
;; Value is not in ST0.
(inst fxch value)
- (inst fst (make-ea :dword :base sap :index offset
- :disp (* 4 disp)))
+ (inst fst (make-ea :dword :base sap :index offset :disp disp))
(cond ((zerop (tn-offset result))
;; The result is in ST0.
(inst fst value))
(:args (sap :scs (sap-reg) :to (:eval 0))
(value :scs (single-reg)))
(:arg-types system-area-pointer (:constant (signed-byte 32))
- (:constant (constant-displacement 0 ; lowtag
- 4 ; single-float size
- 0))
+ (:constant (constant-displacement 0 1 0))
single-float)
(:info offset disp)
(:results (result :scs (single-reg)))
(inst add
sap
(- (* vector-data-offset n-word-bytes) other-pointer-lowtag))))
-
-;;; Transforms for 64-bit SAP accessors.
-
-(deftransform sap-ref-64 ((sap offset) (* *))
- '(logior (sap-ref-32 sap offset)
- (ash (sap-ref-32 sap (+ offset 4)) 32)))
-
-(deftransform signed-sap-ref-64 ((sap offset) (* *))
- '(logior (sap-ref-32 sap offset)
- (ash (signed-sap-ref-32 sap (+ offset 4)) 32)))
-
-(deftransform %set-sap-ref-64 ((sap offset value) (* * *))
- '(progn
- (%set-sap-ref-32 sap offset (logand value #xffffffff))
- (%set-sap-ref-32 sap (+ offset 4) (ash value -32))))
-
-(deftransform %set-signed-sap-ref-64 ((sap offset value) (* * *))
- '(progn
- (%set-sap-ref-32 sap offset (logand value #xffffffff))
- (%set-signed-sap-ref-32 sap (+ offset 4) (ash value -32))))