X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Ffloat.lisp;h=b642b5ccb689865b27df4f2982f269636a621977;hb=f12b298a4ce9090470000360b49523e56475a680;hp=728079dbca3c8cf1a6bb32ee93353bb7b35922cc;hpb=891f4de22b8a291d76d2e74e2a775e4bb659921f;p=sbcl.git diff --git a/src/compiler/x86-64/float.lisp b/src/compiler/x86-64/float.lisp index 728079d..b642b5c 100644 --- a/src/compiler/x86-64/float.lisp +++ b/src/compiler/x86-64/float.lisp @@ -64,8 +64,10 @@ (define-move-fun (load-fp-zero 1) (vop x y) ((fp-single-zero) (single-reg) (fp-double-zero) (double-reg)) - (identity x) ; KLUDGE: IDENTITY as IGNORABLE... - (inst movq y fp-double-zero-tn)) + (identity x) + (sc-case y + (single-reg (inst xorps y y)) + (double-reg (inst xorpd y y)))) (define-move-fun (load-single 2) (vop x y) ((single-stack) (single-reg)) @@ -436,7 +438,19 @@ (frob * mulss */single-float 4 mulsd */double-float 5 t) (frob / divss //single-float 12 divsd //double-float 19 nil)) - +(define-vop (fsqrt) + (:args (x :scs (double-reg))) + (:results (y :scs (double-reg))) + (:translate %sqrt) + (:policy :fast-safe) + (:arg-types double-float) + (:result-types double-float) + (:note "inline float arithmetic") + (:vop-var vop) + (:save-p :compute-only) + (:generator 1 + (note-this-location vop :internal-error) + (inst sqrtsd y x))) (macrolet ((frob ((name translate sc type) &body body) `(define-vop (,name) @@ -484,8 +498,6 @@ ;;;; comparison (define-vop (float-compare) - (:conditional) - (:info target not-p) (:policy :fast-safe) (:vop-var vop) (:save-p :compute-only) @@ -497,75 +509,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)))))) - -;; XXX all of these probably have bad NaN behaviour + (inst comisd x y))) + (define-vop (double-float double-float-compare) (:translate >) - (:info target not-p) - (:generator 2 - (inst comisd x y) - (inst jmp (if not-p :na :a) target))) + (:info) + (:conditional not :p :na) + (:generator 3 + (inst comisd x y))) (define-vop (>single-float single-float-compare) (:translate >) - (:info target not-p) - (:generator 2 - (inst comiss x y) - (inst jmp (if not-p :na :a) target))) + (:info) + (:conditional not :p :na) + (:generator 3 + (inst comiss x y))) @@ -786,7 +782,8 @@ (unless (location= imag r-imag) (inst movss r-imag imag)))) (complex-single-stack - (inst movss (ea-for-csf-real-stack r) real) + (unless (location= real r) + (inst movss (ea-for-csf-real-stack r) real)) (inst movss (ea-for-csf-imag-stack r) imag))))) (define-vop (make-complex-double-float) @@ -810,7 +807,8 @@ (unless (location= imag r-imag) (inst movsd r-imag imag)))) (complex-double-stack - (inst movsd (ea-for-cdf-real-stack r) real) + (unless (location= real r) + (inst movsd (ea-for-cdf-real-stack r) real)) (inst movsd (ea-for-cdf-imag-stack r) imag))))) (define-vop (complex-float-value)