Changeset 14942


Ignore:
Timestamp:
Aug 17, 2011, 5:33:30 AM (9 years ago)
Author:
gb
Message:

%FIXNUM-{REF|SET}-DOUBLE-FLOAT support in PPC backends.

Location:
trunk/source/compiler/PPC
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/PPC/PPC32/ppc32-vinsns.lisp

    r14775 r14942  
    40424042  (fneg dest src))
    40434043
     4044(define-ppc32-vinsn fixnum-ref-c-double-float (((dest :double-float))
     4045                                               ((base :imm)
     4046                                                (idx :u16const)))
     4047  (lfd dest (:apply ash idx 3) base))
     4048
     4049(define-ppc32-vinsn fixnum-ref-double-float (((dest :double-float))
     4050                                               ((base :imm)
     4051                                                (idx :imm))
     4052                                               ((temp :imm)))
     4053  (add temp idx idx)
     4054  (lfdx dest base temp))
     4055
     4056
     4057(define-ppc32-vinsn fixnum-set-c-double-float (()
     4058                                               ((base :imm)
     4059                                                (idx :u16const)
     4060                                                (val :double-float)))
     4061  (stfd val (:apply ash idx 3) base))
     4062
     4063(define-ppc32-vinsn fixnum-set-c-double-float (()
     4064                                               ((base :imm)
     4065                                                (idx :imm)
     4066                                                (val :double-float))
     4067                                               ((temp :imm)))
     4068  (add temp idx idx)
     4069  (stfdx val base temp))
     4070
    40444071;;; In case ppc32::*ppc-opcodes* was changed since this file was compiled.
    40454072(queue-fixup
  • trunk/source/compiler/PPC/PPC64/ppc64-vinsns.lisp

    r14775 r14942  
    40334033(define-ppc64-vinsn single-float-negate (((dest :single-float))
    40344034                                         ((src :single-float)))
    4035   (fneg dest src))
     4035 (fneg dest src))
     4036(define-ppc64-vinsn fixnum-ref-c-double-float (((dest :double-float))
     4037                                               ((base :imm)
     4038                                                (idx :u16const)))
     4039  (lfd dest (:apply ash idx 3) base))
     4040
     4041(define-ppc64-vinsn fixnum-ref-double-float (((dest :double-float))
     4042                                             ((base :imm)
     4043                                              (idx :imm)))
     4044  (lfdx dest base idx))
     4045
     4046
     4047(define-ppc64-vinsn fixnum-set-c-double-float (()
     4048                                               ((base :imm)
     4049                                                (idx :u16const)
     4050                                                (val :double-float)))
     4051  (stfd val (:apply ash idx 3) base))
     4052
     4053(define-ppc64-vinsn fixnum-set-c-double-float (()
     4054                                               ((base :imm)
     4055                                                (idx :imm)
     4056                                                (val :double-float)))
     4057  (stfdx val base idx))
    40364058
    40374059;;; In case ppc64::*ppc-opcodes* was changed since this file was compiled.
  • trunk/source/compiler/PPC/ppc2.lisp

    r14775 r14942  
    92439243                nil))
    92449244
     9245(defppc2 ppc2-fixnum-ref-double-float %fixnum-ref-double-float (seg vreg xfer base index)
     9246  (if (null vreg)
     9247    (progn
     9248      (ppc2-form base seg nil nil)
     9249      (ppc2-form index seg nil xfer))
     9250    (let* ((fix (acode-fixnum-form-p index)))
     9251      (unless (typep fix '(unsigned-byte 12))
     9252        (setq fix nil))
     9253      (if (and (= (hard-regspec-class vreg) hard-reg-class-fpr)
     9254               (= (get-regspec-mode vreg) hard-reg-class-fpr-mode-double) )
     9255        (cond (fix
     9256               (! fixnum-ref-c-double-float vreg (ppc2-one-untargeted-reg-form seg base ppc::arg_z) fix))
     9257              (t
     9258               (multiple-value-bind (rbase rindex) (ppc2-two-untargeted-reg-forms seg base ppc::arg_y index ppc::arg_z)
     9259                 (! fixnum-ref-double-float vreg rbase rindex))))
     9260        (with-fp-target () (target :double-float)
     9261          (cond (fix
     9262                 (! fixnum-ref-c-double-float target (ppc2-one-untargeted-reg-form seg base ppc::arg_z) fix))
     9263                (t
     9264                 (multiple-value-bind (rbase rindex) (ppc2-two-untargeted-reg-forms seg base ppc::arg_y index ppc::arg_z)
     9265                   (! fixnum-ref-double-float target rbase rindex))))
     9266          (<- target)))
     9267      (^))))
     9268
     9269(defppc2 ppc2-fixnum-set-double-float %fixnum-set-double-float (seg vreg xfer base index val)
     9270  (let* ((fix (acode-fixnum-form-p index)))
     9271    (unless (typep fix '(unsigned-byte 12))
     9272      (setq fix nil))
     9273    (cond ((or (null vreg)
     9274               (and (= (hard-regspec-class vreg) hard-reg-class-fpr)
     9275                    (= (get-regspec-mode vreg) hard-reg-class-fpr-mode-double)))
     9276           (let* ((fhint (or vreg ($ ppc::fp1 :class :fpr :mode :double-float))))
     9277             (if fix
     9278               (multiple-value-bind (rbase rval)
     9279                   (ppc2-two-untargeted-reg-forms seg base ($ ppc::arg_z) val fhint)
     9280                 (! fixnum-set-c-double-float rbase fix rval)
     9281                 (<- rval))
     9282               (multiple-value-bind (rbase rindex rval)
     9283                   (ppc2-three-untargeted-reg-forms seg base ($ ppc::arg_y) index ($ ppc::arg_z) val fhint)
     9284                 (! fixnum-set-double-float rbase rindex rval)
     9285                 (<- rval)))))
     9286          (t
     9287           (if fix
     9288             (multiple-value-bind (rbase rboxed)
     9289                 (ppc2-two-untargeted-reg-forms seg base ($ ppc::arg_y) val ($ ppc::arg_z))
     9290               (with-fp-target () (rval :double-float)
     9291                 (ppc2-copy-register seg rval rboxed)
     9292                 (! fixnum-set-c-double-float rbase fix rval))
     9293               (<- rboxed))
     9294             (multiple-value-bind (rbase rindex rboxed)
     9295                 (ppc2-three-untargeted-reg-forms seg base ($ ppc::arg_x) index ($ ppc::arg_y) val ($ ppc::arg_z))
     9296               (with-fp-target () (rval :double-float)
     9297                 (ppc2-copy-register seg rval rboxed)
     9298                 (! fixnum-set-double-float rbase rindex rval))
     9299               (<- rboxed)))))
     9300    (^)))
Note: See TracChangeset for help on using the changeset viewer.