Changeset 10811

Show
Ignore:
Timestamp:
06/19/05 02:48:08 (3 years ago)
Author:
rtoy
Message:

Add a new VOP for DOUBLE-FLOAT-BITS, like on sparc. A
micro-optimization.

Location:
trunk/src
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/code/kernel.lisp

    r7874 r9799  
    153153#+long-float 
    154154(defun long-float-low-bits (x) (long-float-low-bits x)) 
     155 
     156#+sparc 
     157(defun double-float-bits (x) (double-float-bits x)) 
     158 
     159#-sparc 
     160(defun double-float-bits (x) 
     161  (values (double-float-high-bits x) (double-float-low-bits x))) 
     162 
     163 
     164(defun %numerator (x) 
     165  (declare (type ratio x)) 
     166  (%numerator x)) 
     167 
     168(defun %denominator (x) 
     169  (declare (type ratio x)) 
     170  (%denominator x)) 
  • trunk/src/compiler/ppc/float.lisp

    r8638 r10507  
    140140(defun complex-double-reg-imag-tn (x) 
    141141  (make-random-tn :kind :normal :sc (sc-or-lose 'double-reg *backend*) 
    142                   :offset (+ (tn-offset x) 2))) 
     142                  :offset (1+ (tn-offset x)))) 
    143143 
    144144 
     
    511511                (:temporary (:from (:argument 0) :sc single-reg) temp) 
    512512                (:temporary (:scs (double-stack)) stack-temp) 
    513                 (:results (y :scs (signed-reg) 
    514                              :load-if (not (sc-is y signed-stack)))) 
     513                (:results (y :scs (signed-reg))) 
    515514                (:arg-types ,from-type) 
    516515                (:result-types signed-num) 
     
    523522                  (note-this-location vop :internal-error) 
    524523                  (inst ,inst temp x) 
    525                   (sc-case y 
    526                     (signed-stack 
    527                      (inst stfd temp (current-nfp-tn vop) 
    528                            (* (tn-offset y) vm:word-bytes))) 
    529                     (signed-reg 
    530                      (inst stfd temp (current-nfp-tn vop) 
    531                            (* (tn-offset stack-temp) vm:word-bytes)) 
    532                      (inst lwz y (current-nfp-tn vop) 
    533                            (+ 4 (* (tn-offset stack-temp) vm:word-bytes))))))))) 
     524                  (inst stfd temp (current-nfp-tn vop) 
     525                        (* (tn-offset stack-temp) vm:word-bytes)) 
     526                  (inst lwz y (current-nfp-tn vop) 
     527                        (+ 4 (* (tn-offset stack-temp) vm:word-bytes))))))) 
    534528  (frob %unary-truncate single-reg single-float fctiwz) 
    535529  (frob %unary-truncate double-reg double-float fctiwz) 
     
    633627  (:args (float :scs (double-reg descriptor-reg) 
    634628                :load-if (not (sc-is float double-stack)))) 
    635   (:results (hi-bits :scs (signed-reg) 
    636                      :load-if (or (sc-is float descriptor-reg double-stack) 
    637                                   (not (sc-is hi-bits signed-stack))))) 
    638   (:temporary (:scs (signed-stack)) stack-temp) 
     629  (:results (hi-bits :scs (signed-reg))) 
     630  (:temporary (:scs (double-stack)) stack-temp) 
    639631  (:arg-types double-float) 
    640632  (:result-types signed-num) 
     
    643635  (:vop-var vop) 
    644636  (:generator 5 
    645     (sc-case hi-bits 
    646       (signed-reg 
    647        (sc-case float 
    648          (double-reg 
    649           (inst stfd float (current-nfp-tn vop) 
    650                 (* (tn-offset stack-temp) vm:word-bytes)) 
    651           (inst lwz hi-bits (current-nfp-tn vop) 
    652                 (* (tn-offset stack-temp) vm:word-bytes))) 
    653          (double-stack 
    654           (inst lwz hi-bits (current-nfp-tn vop) 
    655                 (* (tn-offset float) vm:word-bytes))) 
    656          (descriptor-reg 
    657           (loadw hi-bits float vm:double-float-value-slot 
    658                  vm:other-pointer-type)))) 
    659       (signed-stack 
    660        (sc-case float 
    661          (double-reg 
    662           (inst stfd float (current-nfp-tn vop) 
    663                 (* (tn-offset hi-bits) vm:word-bytes)))))))) 
     637    (sc-case float 
     638      (double-reg 
     639       (inst stfd float (current-nfp-tn vop) 
     640             (* (tn-offset stack-temp) vm:word-bytes)) 
     641       (inst lwz hi-bits (current-nfp-tn vop) 
     642             (* (tn-offset stack-temp) vm:word-bytes))) 
     643      (double-stack 
     644       (inst lwz hi-bits (current-nfp-tn vop) 
     645             (* (tn-offset float) vm:word-bytes))) 
     646      (descriptor-reg 
     647       (loadw hi-bits float vm:double-float-value-slot 
     648              vm:other-pointer-type))))) 
    664649 
    665650(define-vop (double-float-low-bits) 
    666651  (:args (float :scs (double-reg descriptor-reg) 
    667652                :load-if (not (sc-is float double-stack)))) 
    668   (:results (lo-bits :scs (unsigned-reg) 
    669                      :load-if (or (sc-is float descriptor-reg double-stack) 
    670                                   (not (sc-is lo-bits unsigned-stack))))) 
    671   (:temporary (:scs (unsigned-stack)) stack-temp) 
     653  (:results (lo-bits :scs (unsigned-reg))) 
     654  (:temporary (:scs (double-stack)) stack-temp) 
    672655  (:arg-types double-float) 
    673656  (:result-types unsigned-num) 
     
    676659  (:vop-var vop) 
    677660  (:generator 5 
    678     (sc-case lo-bits 
    679       (unsigned-reg 
    680        (sc-case float 
    681          (double-reg 
    682           (inst stfd float (current-nfp-tn vop) 
    683                 (* (tn-offset stack-temp) vm:word-bytes)) 
    684           (inst lwz lo-bits (current-nfp-tn vop) 
    685                 (* (1+ (tn-offset stack-temp)) vm:word-bytes))) 
    686          (double-stack 
    687           (inst lwz lo-bits (current-nfp-tn vop) 
    688                 (* (1+ (tn-offset float)) vm:word-bytes))) 
    689          (descriptor-reg 
    690           (loadw lo-bits float (1+ vm:double-float-value-slot) 
    691                  vm:other-pointer-type)))) 
    692       (unsigned-stack 
    693        (sc-case float 
    694          (double-reg 
    695           (inst stfd float (current-nfp-tn vop) 
    696                 (* (tn-offset lo-bits) vm:word-bytes)))))))) 
     661    (sc-case float 
     662      (double-reg 
     663       (inst stfd float (current-nfp-tn vop) 
     664             (* (tn-offset stack-temp) vm:word-bytes)) 
     665       (inst lwz lo-bits (current-nfp-tn vop) 
     666             (* (1+ (tn-offset stack-temp)) vm:word-bytes))) 
     667      (double-stack 
     668       (inst lwz lo-bits (current-nfp-tn vop) 
     669             (* (1+ (tn-offset float)) vm:word-bytes))) 
     670      (descriptor-reg 
     671       (loadw lo-bits float (1+ vm:double-float-value-slot) 
     672              vm:other-pointer-type))))) 
    697673 
    698674