Changeset 5765


Ignore:
Timestamp:
Jan 21, 2007, 5:15:23 AM (18 years ago)
Author:
Gary Byers
Message:

ff-call: handle n-word struct-by-value, register return.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/compiler/X86/x862.lisp

    r5603 r5765  
    83968396         (ngpr-args 0)
    83978397         (simple-foreign-args nil)
    8398          (fp-loads ()))
     8398         (fp-loads ())
     8399         (return-registers ()))
    83998400      (declare (fixnum  nshort-floats ndouble-floats nfpr-args ngpr-args narg-words
    84008401                        gpr-offset other-offset single-float-offset double-float-offset))
     
    84098410                           (incf nsingle-floats)
    84108411                           (incf nother-words)))
    8411           (t (incf ngpr-args)
    8412              (if (> ngpr-args 6)
    8413                (incf nother-words)))))
     8412          (:registers (setq return-registers t))
     8413          (t
     8414           (if (typep argspec 'unsigned-byte)
     8415             (incf nother-words argspec)
     8416             (progn
     8417               (incf ngpr-args)
     8418               (if (> ngpr-args 6)
     8419                 (incf nother-words)))))))
    84148420      (let* ((total-words (+ nother-words nsingle-floats ndouble-floats)))
    84158421        (when (null argspecs)
     
    84358441               (absptr (acode-absolute-ptr-p valform)))
    84368442          (case spec
     8443            (:registers
     8444             (x862-vpush-register seg (x862-one-untargeted-reg-form seg valform x8664::arg_z)))
    84378445            (:double-float
    84388446             (let* ((df ($ x8664::fp1 :class :fpr :mode :double-float)))
     
    84718479                      (incf other-offset)))))
    84728480            (t
    8473              (with-imm-target () (valreg :natural)
    8474                 (let* ((reg (x862-unboxed-integer-arg-to-reg seg valform valreg spec)))
    8475                   (incf ngpr-args)
    8476                   (cond ((<= ngpr-args 6)
    8477                          (! set-c-arg reg gpr-offset)
    8478                          (incf gpr-offset))
    8479                         (t
    8480                          (! set-c-arg reg other-offset)
    8481                          (incf other-offset)))))))))
     8481             (if (typep spec 'unsigned-byte)
     8482               (progn
     8483                 (with-imm-target () (ptr :address)
     8484                   (x862-one-targeted-reg-form seg valform ptr)
     8485                   (with-imm-target (ptr) (r :natural)
     8486                     (dotimes (i spec)
     8487                       (! mem-ref-c-doubleword r ptr (ash i x8664::word-shift))
     8488                       (! set-c-arg r other-offset)
     8489                       (incf other-offset)))))               
     8490               (with-imm-target () (valreg :natural)
     8491                 (let* ((reg (x862-unboxed-integer-arg-to-reg seg valform valreg spec)))
     8492                   (incf ngpr-args)
     8493                   (cond ((<= ngpr-args 6)
     8494                          (! set-c-arg reg gpr-offset)
     8495                          (incf gpr-offset))
     8496                         (t
     8497                          (! set-c-arg reg other-offset)
     8498                          (incf other-offset))))))))))
    84828499      (do* ((fpreg x8664::fp0 (1+ fpreg))
    84838500            (reloads (nreverse fp-loads) (cdr reloads)))
     
    84908507            (! reload-double-c-arg ($ fpreg :class :fpr :mode :double-float) from)
    84918508            (! reload-single-c-arg ($ fpreg :class :fpr :mode :single-float) from))))
     8509      (if use-registers
     8510        (x862-vpop-register seg ($ x8664::arg_y)))
    84928511      (if simple-foreign-args
    84938512        (x862-one-targeted-reg-form seg address x8664::arg_z)
    84948513        (x862-vpop-register seg ($ x8664::arg_z)))
    84958514      (x862-lri seg x8664::rax (min 8 nfpr-args))
    8496       (! ff-call)
     8515      (if use-registers
     8516        (! ff-call-returning-registers)
     8517        (! ff-call) )
    84978518      (x862-close-undo)
    84988519      (when vreg
Note: See TracChangeset for help on using the changeset viewer.