X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fx86-64%2Ffloat.lisp;h=23eef993996be6c3fbb3e8d5644f22e276ddb507;hb=d25e3478acccec70402ff32554669a982be8e281;hp=f1b7f4175178bf78762be487d66b6f6dba6d6006;hpb=365286d3d1ba47647e1af3016305540186283a49;p=sbcl.git diff --git a/src/compiler/x86-64/float.lisp b/src/compiler/x86-64/float.lisp index f1b7f41..23eef99 100644 --- a/src/compiler/x86-64/float.lisp +++ b/src/compiler/x86-64/float.lisp @@ -32,8 +32,7 @@ (declare (ignore kind)) `(make-ea :qword :base rbp-tn - :disp (- (* (+ (tn-offset ,tn) 1) - n-word-bytes))))) + :disp (frame-byte-offset (tn-offset ,tn))))) (defun ea-for-sf-stack (tn) (ea-for-xf-stack tn :single)) (defun ea-for-df-stack (tn) @@ -44,9 +43,14 @@ (declare (ignore kind)) `(make-ea :qword :base ,base - :disp (- (* (+ (tn-offset ,tn) - (* 1 (ecase ,slot (:real 1) (:imag 2)))) - n-word-bytes))))) + :disp (frame-byte-offset + (+ (tn-offset ,tn) + (cond ((= (tn-offset ,base) rsp-offset) + sp->fp-offset) + ((= (tn-offset ,base) rbp-offset) + 0) + (t (error "Unexpected offset."))) + (ecase ,slot (:real 0) (:imag 1))))))) (defun ea-for-csf-real-stack (tn &optional (base rbp-tn)) (ea-for-cxf-stack tn :single :real base)) (defun ea-for-csf-imag-stack (tn &optional (base rbp-tn)) @@ -326,8 +330,7 @@ (:double '((inst movsd ea x))))) (let ((ea (make-ea :dword :base fp - :disp (- (* (1+ (tn-offset y)) - n-word-bytes))))) + :disp (frame-byte-offset (tn-offset y))))) ,@(ecase format (:single '((inst movss ea x))) (:double '((inst movsd ea x)))))))))) @@ -498,8 +501,6 @@ ;;;; comparison (define-vop (float-compare) - (:conditional) - (:info target not-p) (:policy :fast-safe) (:vop-var vop) (:save-p :compute-only) @@ -511,102 +512,59 @@ (define-vop (single-float-compare float-compare) (:args (x :scs (single-reg)) (y :scs (single-reg))) - (:conditional) (:arg-types single-float single-float)) (define-vop (double-float-compare float-compare) (:args (x :scs (double-reg)) (y :scs (double-reg))) - (:conditional) (:arg-types double-float double-float)) (define-vop (=/single-float single-float-compare) (:translate =) - (:info target not-p) + (:info) + (:conditional not :p :ne) (:vop-var vop) (:generator 3 (note-this-location vop :internal-error) (inst comiss x y) ;; if PF&CF, there was a NaN involved => not equal ;; otherwise, ZF => equal - (cond (not-p - (inst jmp :p target) - (inst jmp :ne target)) - (t - (let ((not-lab (gen-label))) - (inst jmp :p not-lab) - (inst jmp :e target) - (emit-label not-lab)))))) + )) (define-vop (=/double-float double-float-compare) (:translate =) - (:info target not-p) + (:info) + (:conditional not :p :ne) (:vop-var vop) (:generator 3 (note-this-location vop :internal-error) - (inst comisd x y) - (cond (not-p - (inst jmp :p target) - (inst jmp :ne target)) - (t - (let ((not-lab (gen-label))) - (inst jmp :p not-lab) - (inst jmp :e target) - (emit-label not-lab)))))) + (inst comisd x y))) (define-vop (double-float double-float-compare) (:translate >) - (:info target not-p) + (:info) + (:conditional not :p :na) (:generator 3 - (inst comisd x y) - (cond (not-p - (inst jmp :p target) - (inst jmp :na target)) - (t - (let ((not-lab (gen-label))) - (inst jmp :p not-lab) - (inst jmp :a target) - (emit-label not-lab)))))) + (inst comisd x y))) (define-vop (>single-float single-float-compare) (:translate >) - (:info target not-p) + (:info) + (:conditional not :p :na) (:generator 3 - (inst comiss x y) - (cond (not-p - (inst jmp :p target) - (inst jmp :na target)) - (t - (let ((not-lab (gen-label))) - (inst jmp :p not-lab) - (inst jmp :a target) - (emit-label not-lab)))))) + (inst comiss x y))) @@ -773,7 +731,7 @@ (inst movsd temp float) (move hi-bits temp)) (double-stack - (loadw hi-bits ebp-tn (- (1+ (tn-offset float))))) + (loadw hi-bits ebp-tn (frame-word-offset (tn-offset float)))) (descriptor-reg (loadw hi-bits float double-float-value-slot other-pointer-lowtag))) @@ -795,7 +753,7 @@ (inst movsd temp float) (move lo-bits temp)) (double-stack - (loadw lo-bits ebp-tn (- (1+ (tn-offset float))))) + (loadw lo-bits ebp-tn (frame-word-offset (tn-offset float)))) (descriptor-reg (loadw lo-bits float double-float-value-slot other-pointer-lowtag)))