Changeset 5713


Ignore:
Timestamp:
Jan 18, 2007, 2:52:25 AM (18 years ago)
Author:
Gary Byers
Message:

Poweropen ff-calls might need to return all possible result regs.
(Maybe poweropen syscall, too.)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/compiler/PPC/ppc2.lisp

    r5704 r5713  
    82168216  (with-ppc-local-vinsn-macros (seg)
    82178217    (let* ((fp-loads ())
    8218            (nextarg 0))
    8219     ;; Evaluate each form into the C frame, according to the matching
    8220     ;; argspec.  Remember type and arg offset of any FP args, since FP
    8221     ;; regs will have to be loaded later.
    8222     (do* ((specs argspecs (cdr specs))
    8223           (vals argvals (cdr vals)))
    8224          ((null specs))
    8225       (declare (list specs vals))
    8226       (let* ((valform (car vals))
    8227              (spec (car specs))
    8228              (longval (ppc2-long-constant-p valform))
    8229              (absptr (acode-absolute-ptr-p valform)))
    8230         (case spec
    8231           ((:signed-doubleword :unsigned-doubleword)
    8232            (ppc2-one-targeted-reg-form seg valform ($ ppc::arg_z))
    8233            (if (eq spec :signed-doubleword)
    8234              (! gets64)
    8235              (! getu64))
    8236            (! set-c-arg ($ ppc::imm0) nextarg)
    8237            (target-arch-case
    8238             (:ppc32
    8239              (incf nextarg)
    8240              (! set-c-arg ($ ppc::imm1) nextarg))
    8241             (:ppc64)))
    8242           (:double-float
    8243            (let* ((df ($ ppc::fp1 :class :fpr :mode :double-float)))
    8244              (ppc2-one-targeted-reg-form seg valform df)
    8245              (! set-double-c-arg df nextarg)           
    8246              (push (cons :double-float nextarg) fp-loads)
    8247              (incf nextarg)))
    8248           (:single-float
    8249            (let* ((sf ($ ppc::fp1 :class :fpr :mode :single-float)))
    8250              (ppc2-one-targeted-reg-form seg valform sf)
    8251              (! set-single-c-arg sf nextarg)
    8252              (push (cons :single-float nextarg) fp-loads)))
    8253           (:address
    8254            (with-imm-target ()
    8255              (ptr :address)
    8256              (if absptr
    8257                (ppc2-lri seg ptr absptr)
    8258                (ppc2-one-targeted-reg-form seg valform ptr))
    8259              (! set-c-arg ptr nextarg)))
    8260           (t
    8261            (if (typep spec 'unsigned-byte)
    8262              (progn
    8263                (with-imm-target () (ptr :address)
    8264                  (ppc2-one-targeted-reg-form seg valform ptr)
    8265                  (with-imm-temps (ptr) (r)
    8266                    (dotimes (i spec)
    8267                      (target-arch-case
    8268                       (:ppc32
    8269                        (! mem-ref-c-fullword r ptr (ash i ppc32::word-shift)))
    8270                       (:ppc64
    8271                        (! mem-ref-c-doubleword r ptr (ash i ppc64::word-shift))))
    8272                      (! set-c-arg r nextarg)
    8273                      (incf nextarg))))
    8274                (decf nextarg))
     8218           (nextarg 0)
     8219           (return-registers nil))
     8220      ;; Evaluate each form into the C frame, according to the matching
     8221      ;; argspec.  Remember type and arg offset of any FP args, since FP
     8222      ;; regs will have to be loaded later.
     8223      (do* ((specs argspecs (cdr specs))
     8224            (vals argvals (cdr vals)))
     8225           ((null specs) (if return-registers (ppc2-pop-register seg ($ ppc::arg_y))))
     8226        (declare (list specs vals))
     8227        (let* ((valform (car vals))
     8228               (spec (car specs))
     8229               (longval (ppc2-long-constant-p valform))
     8230               (absptr (acode-absolute-ptr-p valform)))
     8231          (case spec
     8232            (:registers
     8233             (setq return-registers t)
     8234             (ppc2-push-register seg (ppc2-one-untargeted-reg-form seg valform ppc::arg_z)))
     8235            ((:signed-doubleword :unsigned-doubleword)
     8236             (ppc2-one-targeted-reg-form seg valform ($ ppc::arg_z))
     8237             (if (eq spec :signed-doubleword)
     8238               (! gets64)
     8239               (! getu64))
     8240             (! set-c-arg ($ ppc::imm0) nextarg)
     8241             (target-arch-case
     8242              (:ppc32
     8243               (incf nextarg)
     8244               (! set-c-arg ($ ppc::imm1) nextarg))
     8245              (:ppc64)))
     8246            (:double-float
     8247             (let* ((df ($ ppc::fp1 :class :fpr :mode :double-float)))
     8248               (ppc2-one-targeted-reg-form seg valform df)
     8249               (! set-double-c-arg df nextarg)           
     8250               (push (cons :double-float nextarg) fp-loads)
     8251               (incf nextarg)))
     8252            (:single-float
     8253             (let* ((sf ($ ppc::fp1 :class :fpr :mode :single-float)))
     8254               (ppc2-one-targeted-reg-form seg valform sf)
     8255               (! set-single-c-arg sf nextarg)
     8256               (push (cons :single-float nextarg) fp-loads)))
     8257            (:address
    82758258             (with-imm-target ()
    8276                (valreg :natural)
    8277                (let* ((reg valreg))
    8278                  (if longval
    8279                    (ppc2-lri seg valreg longval)
    8280                    (setq reg (ppc2-unboxed-integer-arg-to-reg seg valform valreg spec)))
    8281                  (! set-c-arg reg nextarg))))))
    8282         (incf nextarg)))
    8283     (do* ((fpreg ppc::fp1 (1+ fpreg))
    8284           (reloads (nreverse fp-loads) (cdr reloads)))
    8285          ((or (null reloads) (= fpreg ppc::fp14)))
    8286       (declare (list reloads) (fixnum fpreg))
    8287       (let* ((reload (car reloads))
    8288              (size (car reload))
    8289              (from (cdr reload)))
    8290         (if (eq size :double-float)
    8291           (! reload-double-c-arg fpreg from)
    8292           (! reload-single-c-arg fpreg from)))))))
     8259                 (ptr :address)
     8260               (if absptr
     8261                 (ppc2-lri seg ptr absptr)
     8262                 (ppc2-one-targeted-reg-form seg valform ptr))
     8263               (! set-c-arg ptr nextarg)))
     8264            (t
     8265             (if (typep spec 'unsigned-byte)
     8266               (progn
     8267                 (with-imm-target () (ptr :address)
     8268                   (ppc2-one-targeted-reg-form seg valform ptr)
     8269                   (with-imm-temps (ptr) (r)
     8270                     (dotimes (i spec)
     8271                       (target-arch-case
     8272                        (:ppc32
     8273                         (! mem-ref-c-fullword r ptr (ash i ppc32::word-shift)))
     8274                        (:ppc64
     8275                         (! mem-ref-c-doubleword r ptr (ash i ppc64::word-shift))))
     8276                       (! set-c-arg r nextarg)
     8277                       (incf nextarg))))
     8278                 (decf nextarg))
     8279               (with-imm-target ()
     8280                   (valreg :natural)
     8281                 (let* ((reg valreg))
     8282                   (if longval
     8283                     (ppc2-lri seg valreg longval)
     8284                     (setq reg (ppc2-unboxed-integer-arg-to-reg seg valform valreg spec)))
     8285                   (! set-c-arg reg nextarg))))))
     8286          (incf nextarg)))
     8287      (do* ((fpreg ppc::fp1 (1+ fpreg))
     8288            (reloads (nreverse fp-loads) (cdr reloads)))
     8289           ((or (null reloads) (= fpreg ppc::fp14)))
     8290        (declare (list reloads) (fixnum fpreg))
     8291        (let* ((reload (car reloads))
     8292               (size (car reload))
     8293               (from (cdr reload)))
     8294          (if (eq size :double-float)
     8295            (! reload-double-c-arg fpreg from)
     8296            (! reload-single-c-arg fpreg from))))
     8297      return-registers)))
    82938298
    82948299(defun ppc2-poweropen-foreign-return (seg vreg xfer resultspec)
     
    85558560  (let* ((*ppc2-vstack* *ppc2-vstack*)
    85568561         (*ppc2-top-vstack-lcell* *ppc2-top-vstack-lcell*)
    8557          (*ppc2-cstack* *ppc2-cstack*))
     8562         (*ppc2-cstack* *ppc2-cstack*)
     8563         (return-registers nil))
    85588564    (declare (fixnum nextarg))
    85598565    (! alloc-c-frame (the fixnum
     
    85768582    (ppc2-open-undo $undo-ppc-c-frame)
    85778583    (ppc2-vpush-register seg (ppc2-one-untargeted-reg-form seg address ppc::arg_z))
    8578     (ppc2-poweropen-foreign-args seg argspecs argvals)
     8584    (setq return-registers (ppc2-poweropen-foreign-args seg argspecs argvals))
    85798585    (ppc2-vpop-register seg ppc::arg_z)
    8580     (if monitor-exception-ports
    8581       (! poweropen-ff-callX)
    8582       (! poweropen-ff-call))
     8586    (if return-registers
     8587      (! poweropen-ff-call-regs)
     8588      (if monitor-exception-ports
     8589        (! poweropen-ff-callX)
     8590        (! poweropen-ff-call)))
    85838591    (ppc2-close-undo)
    85848592    (when vreg
Note: See TracChangeset for help on using the changeset viewer.