Changeset 5713
- Timestamp:
- Jan 18, 2007, 2:52:25 AM (18 years ago)
- File:
-
- 1 edited
-
trunk/ccl/compiler/PPC/ppc2.lisp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/compiler/PPC/ppc2.lisp
r5704 r5713 8216 8216 (with-ppc-local-vinsn-macros (seg) 8217 8217 (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 8275 8258 (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))) 8293 8298 8294 8299 (defun ppc2-poweropen-foreign-return (seg vreg xfer resultspec) … … 8555 8560 (let* ((*ppc2-vstack* *ppc2-vstack*) 8556 8561 (*ppc2-top-vstack-lcell* *ppc2-top-vstack-lcell*) 8557 (*ppc2-cstack* *ppc2-cstack*)) 8562 (*ppc2-cstack* *ppc2-cstack*) 8563 (return-registers nil)) 8558 8564 (declare (fixnum nextarg)) 8559 8565 (! alloc-c-frame (the fixnum … … 8576 8582 (ppc2-open-undo $undo-ppc-c-frame) 8577 8583 (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)) 8579 8585 (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))) 8583 8591 (ppc2-close-undo) 8584 8592 (when vreg
Note:
See TracChangeset
for help on using the changeset viewer.
