From: Paul Khuong Date: Sat, 11 Jun 2011 04:09:11 +0000 (-0400) Subject: Improve SINGLE-FLOAT-BITS on x86-64 X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=9f5c04e93072a77a73af8fbf8a96d8a127db3d83;p=sbcl.git Improve SINGLE-FLOAT-BITS on x86-64 Avoid narrow-store-to-wide-load hazards, and generally emit sane MOVSXD for sign extension. Fixes lp#555201. --- diff --git a/src/compiler/x86-64/float.lisp b/src/compiler/x86-64/float.lisp index 601dabd..c2c2d26 100644 --- a/src/compiler/x86-64/float.lisp +++ b/src/compiler/x86-64/float.lisp @@ -1184,31 +1184,22 @@ (:args (float :scs (single-reg descriptor-reg) :load-if (not (sc-is float single-stack)))) (:results (bits :scs (signed-reg))) - (:temporary (:sc signed-stack :from :argument :to :result) stack-temp) (:arg-types single-float) (:result-types signed-num) (:translate single-float-bits) (:policy :fast-safe) - (:vop-var vop) (:generator 4 - (sc-case bits - (signed-reg - (sc-case float - (single-reg - (inst movss stack-temp float) - (move bits stack-temp)) - (single-stack - (move bits float)) - (descriptor-reg - (move bits float) - (inst shr bits 32)))) - (signed-stack - (sc-case float - (single-reg - (inst movss bits float))))) - ;; Sign-extend - (inst shl bits 32) - (inst sar bits 32))) + (sc-case float + (single-reg + (inst movd bits float) + (inst movsxd bits (reg-in-size bits :dword))) + (single-stack + (inst movsxd bits (make-ea :dword ; c.f. ea-for-sf-stack + :base rbp-tn + :disp (frame-byte-offset (tn-offset float))))) + (descriptor-reg + (move bits float) + (inst sar bits 32))))) (define-vop (double-float-high-bits) (:args (float :scs (double-reg descriptor-reg)