Changeset 15050
- Timestamp:
- Oct 28, 2011, 2:20:18 PM (13 years ago)
- Location:
- trunk/source/compiler
- Files:
-
- 2 edited
-
X86/x862.lisp (modified) (18 diffs)
-
nx2.lisp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/compiler/X86/x862.lisp
r15041 r15050 94 94 `(progn 95 95 (x862-invalidate-regmap) 96 (backend-gen-label ,',segvar ,,labelnum-var))) 97 (@+ (,labelnum-var) 98 `(progn ;keep regmap 96 99 (backend-gen-label ,',segvar ,,labelnum-var))) 97 100 (@= (,labelnum-var) … … 188 191 (defvar *x862-tail-vsp* nil) 189 192 (defvar *x862-tail-nargs* nil) 193 (defvar *x862-tail-arg-vars* nil) 190 194 (defvar *x862-tail-allow* t) 191 195 (defvar *x862-reckless* nil) … … 611 615 (*x862-tail-vsp* nil) 612 616 (*x862-tail-nargs* nil) 617 (*x862-tail-arg-vars* nil) 613 618 (*x862-inhibit-register-allocation* nil) 614 619 (*x862-tail-allow* t) … … 2899 2904 (! call-known-symbol *x862-arg-z*)))) 2900 2905 2901 (defun x862- self-call (seg nargs tail-p)2906 (defun x862-do-self-call (seg nargs tail-p) 2902 2907 (with-x86-local-vinsn-macros (seg) 2903 2908 (cond ((and tail-p … … 2942 2947 (callable (or symp lfunp label-p)) 2943 2948 (destreg (if symp ($ *x862-fname*) (unless label-p ($ *x862-temp0*)))) 2944 (alternate-tail-call 2945 (and tail-p label-p *x862-tail-label* (eql nargs *x862-tail-nargs*) (not spread-p))) 2949 2946 2950 (set-nargs-vinsn nil)) 2947 2951 (or (and label-p nargs (not spread-p) (not (x862-mvpass-p xfer)) 2948 (not alternate-tail-call) 2949 (x862-self-call seg nargs tail-p)) 2952 (x862-do-self-call seg nargs tail-p)) 2950 2953 (progn 2951 2954 (when expression-p … … 2965 2968 (x862-copy-register seg destreg a-reg)) 2966 2969 (unless spread-p 2967 (unless alternate-tail-call 2968 (x862-restore-nvrs seg *x862-register-restore-ea* *x862-register-restore-count* (and nargs (<= nargs *x862-target-num-arg-regs*)))))) 2970 (x862-restore-nvrs seg *x862-register-restore-ea* *x862-register-restore-count* (and nargs (<= nargs *x862-target-num-arg-regs*))))) 2969 2971 (if spread-p 2970 2972 (progn … … 2984 2986 (x862-restore-nvrs seg *x862-register-restore-ea* *x862-register-restore-count* nil))) 2985 2987 (if nargs 2986 (unless alternate-tail-call 2987 (setq set-nargs-vinsn (x862-set-nargs seg nargs))) 2988 (setq set-nargs-vinsn (x862-set-nargs seg nargs)) 2988 2989 (! pop-argument-registers))) 2989 2990 (if callable … … 3014 3015 (x862-call-symbol seg nil) 3015 3016 (! call-known-function)))))) 3016 (if alternate-tail-call 3017 (progn 3018 (x862-unwind-stack seg xfer 0 0 *x862-tail-vsp*) 3019 (! jump (aref *backend-labels* *x862-tail-label*))) 3020 (progn 3017 (progn 3021 3018 (x862-unwind-stack seg xfer 0 0 #x7fffff) 3022 3019 (if (and (not spread-p) nargs (%i<= nargs *x862-target-num-arg-regs*)) … … 3080 3077 (if symp 3081 3078 (! jump-known-symbol) 3082 (! jump-known-function)))))))) )3079 (! jump-known-function)))))))) 3083 3080 ;; The general (funcall) case: we don't know (at compile-time) 3084 3081 ;; for sure whether we've got a symbol or a (local, constant) … … 3352 3349 address-reg)) 3353 3350 3354 (defun x862-push-reg-for-form (seg form suggested )3351 (defun x862-push-reg-for-form (seg form suggested &optional targeted) 3355 3352 (let* ((reg (if (and (node-reg-p suggested) 3356 3353 (nx2-acode-call-p form)) ;probably ... 3357 3354 (x862-one-targeted-reg-form seg form *x862-arg-z*) 3358 (x862-one-untargeted-reg-form seg form suggested)))) 3355 (if targeted 3356 (x862-one-targeted-reg-form seg form suggested) 3357 (x862-one-untargeted-reg-form seg form suggested))))) 3359 3358 (x862-push-register seg reg))) 3360 3359 … … 3594 3593 (if atriv 3595 3594 (x862-one-targeted-reg-form seg aform areg) 3596 (setq apushed (x862-push-reg-for-form seg aform areg ))))3595 (setq apushed (x862-push-reg-for-form seg aform areg t)))) 3597 3596 (x862-one-targeted-reg-form seg bform breg) 3598 3597 (if aconst … … 3666 3665 (if atriv 3667 3666 (x862-one-targeted-reg-form seg aform areg) 3668 (setq apushed (x862-push-reg-for-form seg aform areg ))))3667 (setq apushed (x862-push-reg-for-form seg aform areg t)))) 3669 3668 (if (and bform (not bconst)) 3670 3669 (if btriv 3671 3670 (x862-one-targeted-reg-form seg bform breg) 3672 (setq bpushed (x862-push-reg-for-form seg bform breg ))))3671 (setq bpushed (x862-push-reg-for-form seg bform breg t)))) 3673 3672 (x862-one-targeted-reg-form seg cform creg) 3674 3673 (unless btriv … … 3726 3725 (if atriv 3727 3726 (x862-one-targeted-reg-form seg aform areg) 3728 (setq apushed (x862-push-reg-for-form seg aform areg ))))3727 (setq apushed (x862-push-reg-for-form seg aform areg t)))) 3729 3728 (if (and bform (not bconst)) 3730 3729 (if btriv 3731 3730 (x862-one-targeted-reg-form seg bform breg) 3732 (setq bpushed (x862-push-reg-for-form seg bform breg ))))3731 (setq bpushed (x862-push-reg-for-form seg bform breg t)))) 3733 3732 (if (and cform (not cconst)) 3734 3733 (if ctriv 3735 3734 (x862-one-targeted-reg-form seg cform creg) 3736 (setq cpushed (x862-push-reg-for-form seg cform creg ))))3735 (setq cpushed (x862-push-reg-for-form seg cform creg t)))) 3737 3736 (x862-one-targeted-reg-form seg dform dreg) 3738 3737 (unless ctriv … … 4051 4050 (var (nx2-lexical-reference-p form)) 4052 4051 (ea (when var 4053 (unless (x862-existing-reg-for-var var) (var-ea var)))) 4052 (unless (x862-existing-reg-for-var var) 4053 (when (eql 1 (var-refs var)) (var-ea var))))) 4054 4054 (offset (and ea 4055 4055 (memory-spec-p ea) 4056 4056 (not (addrspec-vcell-p ea)) 4057 4057 (memspec-frame-address-offset ea))) 4058 (reg (unless offset(x862-one-untargeted-reg-form seg (if js32 i j) *x862-arg-z*)))4058 (reg (unless (and offset nil) (x862-one-untargeted-reg-form seg (if js32 i j) *x862-arg-z*))) 4059 4059 (constant (or js32 is32))) 4060 4060 (if offset … … 6515 6515 (:x8632 6516 6516 *x8632-nvrs*))))) 6517 (@ (backend-get-next-label)) ; generic self-reference label, should be label #16517 (@ (backend-get-next-label)) ; generic self-reference label, should be label #1 6518 6518 (! establish-fn) 6519 6519 (@ (backend-get-next-label)) ; self-call label 6520 (when keys ;; Ensure keyvect is the first immediate6520 (when keys;; Ensure keyvect is the first immediate 6521 6521 (x86-immediate-label (%cadr (%cdddr keys)))) 6522 6522 (when code-note … … 6648 6648 (rplacd constant reg) 6649 6649 (! ref-constant reg (x86-immediate-label (car constant)))))) 6650 (when (and (not (or opt rest keys)) 6651 (<= max-args *x862-target-num-arg-regs*) 6652 (not (some #'null arg-regs))) 6653 (setq *x862-tail-vsp* *x862-vstack* 6654 *x862-tail-nargs* max-args) 6655 (@ (setq *x862-tail-label* (backend-get-next-label)))) 6650 (when (and (not (or opt rest keys method-var)) 6651 (logbitp $fbittailcallsself (afunc-bits *x862-cur-afunc*)) 6652 (<= max-args (1+ *x862-target-num-arg-regs*)) 6653 (dolist (var rev-fixed t) 6654 (let* ((bits (nx-var-bits var))) 6655 (declare (fixnum bits)) 6656 (when (or (logbitp $vbitspecial bits) 6657 (eql (logior (ash 1 $vbitclosed) 6658 (ash 1 $vbitsetq)) 6659 (logand bits (logior (ash 1 $vbitclosed) 6660 (ash 1 $vbitsetq))))) 6661 (return))))) 6662 (setq *x862-tail-nargs* max-args 6663 *x862-tail-arg-vars* (reverse rev-fixed) 6664 *x862-tail-vsp* *x862-vstack*) 6665 (let* ((stack-arg-var (if (> max-args *x862-target-num-arg-regs*) 6666 (car *x862-tail-arg-vars*)))) 6667 (when (and stack-arg-var (not (var-nvr stack-arg-var))) 6668 (x862-stack-to-register seg (x862-vloc-ea 0) *x862-temp0*))) 6669 (setq *x862-tail-label* (backend-get-next-label))) 6656 6670 (when method-var 6657 6671 (target-arch-case … … 6690 6704 (setq reserved-lcells (x862-collect-lcells :reserved)) 6691 6705 (x862-bind-lambda seg reserved-lcells req opt rest keys auxen optsupvloc arg-regs lexprp inherited-vars) 6706 (when *x862-tail-label* 6707 (@+ *x862-tail-label*)) 6692 6708 (when next-method-var-scope-info 6693 6709 (push next-method-var-scope-info *x862-recorded-symbols*))) … … 7500 7516 (defx862 x862-self-call self-call (seg vreg xfer arglist &optional spread-p) 7501 7517 (setq arglist (x862-augment-arglist *x862-cur-afunc* arglist (if spread-p 1 *x862-target-num-arg-regs*))) 7502 (x862-call-fn seg vreg xfer -2 arglist spread-p)) 7518 (let* ((nargs *x862-tail-nargs*)) 7519 (if (and nargs (x862-tailcallok xfer) (not spread-p) 7520 (eql nargs (+ (length (car arglist)) 7521 (length (cadr arglist))))) 7522 (let* ((forms (append (car arglist) (reverse (cadr arglist)))) 7523 (vars *x862-tail-arg-vars*) 7524 (regs (ecase nargs 7525 (0 ()) 7526 (1 (list ($ *x862-arg-z*))) 7527 (2 (list ($ *x862-arg-y*) ($ *x862-arg-z*))) 7528 (3 (list (target-arch-case 7529 (:x8632 ($ x8632::temp0)) 7530 (:x8664 ($ x8664::arg_x))) 7531 ($ *x862-arg-y*) ($ *x862-arg-z*))) 7532 (4 (target-arch-case 7533 (:x8632 (compiler-bug "4 tail-call args on x8632")) 7534 (:x8664 (list ($ x8664::temp0) 7535 ($ x8664::arg_x) 7536 ($ x8664::arg_y) 7537 ($ x8664::arg_z)))))))) 7538 (case nargs 7539 (1 (x862-one-targeted-reg-form seg (car forms) (car regs))) 7540 (2 (x862-two-targeted-reg-forms seg (car forms) (car regs) (cadr forms) (cadr regs))) 7541 (3 (x862-three-targeted-reg-forms seg (car forms) (car regs) (cadr forms) (cadr regs) (caddr forms) (caddr regs))) 7542 (4 (x862-four-targeted-reg-forms seg (car forms) (car regs) (cadr forms) (cadr regs) (caddr forms) (caddr regs) (cadddr forms) (cadddr regs)))) 7543 (do* ((vars vars (cdr vars)) 7544 (regs regs (cdr regs))) 7545 ((null vars)) 7546 (let* ((var (car vars)) 7547 (reg (car regs))) 7548 (x862-do-lexical-setq seg nil (var-ea var) reg))) 7549 (let* ((diff (- *x862-vstack* *x862-tail-vsp*))) 7550 (unless (eql 0 diff) 7551 (! adjust-vsp diff)) 7552 (! jump (aref *backend-labels* *x862-tail-label*)))) 7553 (x862-call-fn seg vreg xfer -2 arglist spread-p)))) 7503 7554 7504 7555 -
trunk/source/compiler/nx2.lisp
r15037 r15050 30 30 31 31 (defun nx2-partition-vars (vars inherited-vars &optional (afunc-flags 0)) 32 (declare (ignorable afunc-flags))33 32 (labels ((var-weight (var) 34 33 (let* ((bits (nx-var-bits var))) … … 42 41 (logand bits (logior (ash 1 $vbitclosed) (ash 1 $vbitsetq))))) 43 42 0 44 (var-refs var)) 43 (let* ((w (var-refs var))) 44 (if (logbitp $fbittailcallsself afunc-flags) 45 (ash w 2) 46 w))) 45 47 0))) 46 48 (sum-weights (varlist)
Note:
See TracChangeset
for help on using the changeset viewer.
