Changeset 15411
- Timestamp:
- Jun 11, 2012, 10:12:21 AM (12 years ago)
- Location:
- trunk/source/compiler/X86
- Files:
-
- 3 edited
-
X8632/x8632-vinsns.lisp (modified) (1 diff)
-
X8664/x8664-vinsns.lisp (modified) (1 diff)
-
x862.lisp (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/compiler/X86/X8632/x8632-vinsns.lisp
r15347 r15411 1260 1260 (jmp lab)) 1261 1261 1262 (define-x8632-vinsn return-or-fix-overflow (() 1263 ()) 1264 (jo :fix) 1265 (:byte #xf3) (ret) 1266 :fix 1267 (jmp (:@ .SPfix-overflow))) 1262 1268 1263 1269 (define-x8632-vinsn add-constant (((dest :imm)) -
trunk/source/compiler/X86/X8664/x8664-vinsns.lisp
r15347 r15411 1391 1391 (movq (:%q x8664::arg_z) (:%q val))) 1392 1392 (jmp lab)) 1393 1394 (define-x8664-vinsn return-or-fix-overflow (() 1395 ()) 1396 (jo :fix) 1397 (:byte #xf3) (ret) 1398 :fix 1399 (jmp (:@ .SPfix-overflow))) 1393 1400 1394 1401 (define-x8664-vinsn add-constant (((dest :imm)) -
trunk/source/compiler/X86/x862.lisp
r15380 r15411 5749 5749 (label nil) 5750 5750 (vstack nil) 5751 (foldp ( not *x862-open-code-inline*)))5751 (foldp (x862-fold-popj))) 5752 5752 (if (%izerop mask) (setq mask nil)) 5753 5753 (with-x86-local-vinsn-macros (seg) … … 6083 6083 (eq 0 *x862-undo-count*))) 6084 6084 6085 (defun x862-mv-p (cd) 6085 ;;; on x86, branching to a shared exit point can sometimes be 6086 ;;; larger than simply exiting, but it's hard to know that in 6087 ;;; advance. If the exit point involves restoring nvrs, then 6088 ;;; it's likely that branching will be smaller. 6089 (defun x862-fold-popj () 6090 (unless *x862-open-code-inline* ; never fold if speed>space 6091 *x862-register-restore-ea*)) ; fold if we'll need to restore nvrs. 6092 6093 6094 (defun x862-mv-p (cd) 6086 6095 (or (eq cd $backend-return) (x862-mvpass-p cd))) 6087 6096 … … 7753 7762 (falselabel (backend-get-next-label)) 7754 7763 (need-else (unless false-is-goto (or (not (nx-null false)) (x862-for-value-p vreg)))) 7755 (both-single-valued (and ( not *x862-open-code-inline*)7764 (both-single-valued (and (x862-fold-popj) 7756 7765 (eq xfer $backend-return) 7757 7766 (x862-for-value-p vreg) … … 7927 7936 7928 7937 (defun x862-inline-sub2 (seg vreg xfer form1 form2) 7929 (let* ((v2 (acode-fixnum-form-p form2))) 7938 (let* ((v2 (acode-fixnum-form-p form2)) 7939 (tailp (and (x862-tailcallok xfer) (not (x862-fold-popj))))) 7930 7940 (if (and v2 (not (eql v2 most-negative-fixnum))) 7931 7941 (x862-inline-add2 seg vreg xfer form1 (make-acode (%nx1-operator fixnum) (- v2))) 7932 7942 (with-x86-local-vinsn-macros (seg vreg xfer) 7933 7943 (x862-two-targeted-reg-forms seg form1 ($ *x862-arg-y*) form2 ($ *x862-arg-z*)) 7944 (when tailp 7945 (x862-restore-nvrs seg *x862-register-restore-ea* *x862-register-restore-count* t) 7946 (! restore-full-lisp-context)) 7934 7947 (let* ((out-of-line (backend-get-next-label)) 7935 7948 (done (backend-get-next-label))) … … 7941 7954 (! branch-unless-both-args-fixnums ($ *x862-arg-y*) ($ *x862-arg-z*) (aref *backend-labels* out-of-line)))) 7942 7955 (! fixnum-sub2 ($ *x862-arg-z*) ($ *x862-arg-y*) ($ *x862-arg-z*)) 7943 (x862-check-fixnum-overflow seg ($ *x862-arg-z*) done) 7956 (if tailp 7957 (! return-or-fix-overflow) 7958 (x862-check-fixnum-overflow seg ($ *x862-arg-z*) done)) 7944 7959 (@ out-of-line) 7960 (if tailp 7961 (! jump-subprim (subprim-name->offset '.SPbuiltin-minus)) 7962 (progn 7945 7963 (! call-subprim-2 ($ *x862-arg-z*) (subprim-name->offset '.SPbuiltin-minus) ($ *x862-arg-y*) ($ *x862-arg-z*)) 7946 7964 (@ done) 7947 (x862-copy-register seg target ($ *x862-arg-z*))) 7948 (^)))))) 7965 (x862-copy-register seg target ($ *x862-arg-z*))))) 7966 (unless tailp 7967 (^))))))) 7949 7968 7950 7969 (defun x862-inline-add2 (seg vreg xfer form1 form2) … … 7957 7976 form2 7958 7977 (if fix2 7959 form1)))) 7978 form1))) 7979 (tailp (and (x862-tailcallok xfer) (not (x862-fold-popj))))) 7960 7980 (if otherform 7961 7981 (x862-one-targeted-reg-form seg otherform ($ *x862-arg-z*)) 7962 7982 (x862-two-targeted-reg-forms seg form1 ($ *x862-arg-y*) form2 ($ *x862-arg-z*))) 7983 (when tailp 7984 (x862-restore-nvrs seg *x862-register-restore-ea* *x862-register-restore-count* t) 7985 (! restore-full-lisp-context)) 7963 7986 (let* ((out-of-line (backend-get-next-label)) 7964 7987 (done (backend-get-next-label))) … … 7975 7998 (! add-constant ($ *x862-arg-z*) (ash (or fix1 fix2) *x862-target-fixnum-shift*)) 7976 7999 (! fixnum-add2 ($ *x862-arg-z*) ($ *x862-arg-y*))) 7977 (x862-check-fixnum-overflow seg ($ *x862-arg-z*) done) 8000 (if tailp 8001 (! return-or-fix-overflow) 8002 (x862-check-fixnum-overflow seg ($ *x862-arg-z*) done)) 7978 8003 (@ out-of-line) 7979 8004 (if otherform 7980 8005 (x862-lri seg ($ *x862-arg-y*) (ash (or fix1 fix2) *x862-target-fixnum-shift*))) 7981 (! call-subprim-2 ($ *x862-arg-z*) (subprim-name->offset '.SPbuiltin-plus) ($ *x862-arg-y*) ($ *x862-arg-z*)) 7982 (@ done) 7983 (x862-copy-register seg target ($ *x862-arg-z*))) 7984 (^))))) 8006 (if tailp 8007 (! jump-subprim (subprim-name->offset '.SPbuiltin-plus)) 8008 (progn 8009 (! call-subprim-2 ($ *x862-arg-z*) (subprim-name->offset '.SPbuiltin-plus) ($ *x862-arg-y*) ($ *x862-arg-z*)) 8010 (@ done) 8011 (x862-copy-register seg target ($ *x862-arg-z*))))) 8012 (unless tailp 8013 (^)))))) 7985 8014 7986 8015 (defx862 x862-add2 add2 (seg vreg xfer form1 form2) … … 8018 8047 (fiximm (if fixval (<= (integer-length fixval) 8019 8048 (- 31 *x862-target-fixnum-shift*)))) 8020 (otherform (when fiximm (if fix1 form2 form1)))) 8049 (otherform (when fiximm (if fix1 form2 form1))) 8050 (tailp (and (x862-tailcallok xfer) (not (x862-fold-popj))))) 8021 8051 (let* ((out-of-line (backend-get-next-label)) 8022 8052 (done (backend-get-next-label))) … … 8025 8055 (x862-one-targeted-reg-form seg otherform ($ *x862-arg-z*)) 8026 8056 (x862-two-targeted-reg-forms seg form1 ($ *x862-arg-y*) form2 ($ *x862-arg-z*))) 8057 (when tailp 8058 (x862-restore-nvrs seg *x862-register-restore-ea* *x862-register-restore-count* t) 8059 (! restore-full-lisp-context)) 8027 8060 (if otherform 8028 8061 (unless (acode-fixnum-form-p otherform) … … 8036 8069 (! %logior-c ($ *x862-arg-z*) ($ *x862-arg-z*) (ash fixval *x862-target-fixnum-shift*)) 8037 8070 (! %logior2 ($ *x862-arg-z*) ($ *x862-arg-z*) ($ *x862-arg-y*))) 8038 (-> done) 8071 (if tailp 8072 (! jump-return-pc) 8073 (-> done)) 8039 8074 (@ out-of-line) 8040 8075 (if otherform 8041 8076 (x862-lri seg ($ *x862-arg-y*) (ash fixval *x862-target-fixnum-shift*))) 8042 (! call-subprim-2 ($ *x862-arg-z*) (subprim-name->offset '.SPbuiltin-logior) ($ *x862-arg-y*) ($ *x862-arg-z*)) 8043 (@ done) 8044 (x862-copy-register seg target ($ *x862-arg-z*))) 8045 (^))))))) 8077 (if tailp 8078 (! jump-subprim (subprim-name->offset '.SPbuiltin-logior)) 8079 (progn 8080 (! call-subprim-2 ($ *x862-arg-z*) (subprim-name->offset '.SPbuiltin-logior) ($ *x862-arg-y*) ($ *x862-arg-z*)) 8081 (@ done) 8082 (x862-copy-register seg target ($ *x862-arg-z*))))) 8083 (unless tailp 8084 (^)))))))) 8046 8085 8047 8086 (defx862 x862-logior2 logior2 (seg vreg xfer form1 form2) … … 8065 8104 (fiximm (if fixval (<= (integer-length fixval) 8066 8105 (- 31 *x862-target-fixnum-shift*)))) 8067 (otherform (when fiximm (if fix1 form2 form1)))) 8106 (otherform (when fiximm (if fix1 form2 form1))) 8107 (tailp (and (x862-tailcallok xfer) (not (x862-fold-popj))))) 8068 8108 (let* ((out-of-line (backend-get-next-label)) 8069 8109 (done (backend-get-next-label))) … … 8072 8112 (x862-one-targeted-reg-form seg otherform ($ *x862-arg-z*)) 8073 8113 (x862-two-targeted-reg-forms seg form1 ($ *x862-arg-y*) form2 ($ *x862-arg-z*))) 8114 (when tailp 8115 (x862-restore-nvrs seg *x862-register-restore-ea* *x862-register-restore-count* t) 8116 (! restore-full-lisp-context)) 8074 8117 (if otherform 8075 8118 (unless (acode-fixnum-form-p otherform) … … 8083 8126 (! %logand-c ($ *x862-arg-z*) ($ *x862-arg-z*) (ash fixval *x862-target-fixnum-shift*)) 8084 8127 (! %logand2 ($ *x862-arg-z*) ($ *x862-arg-z*) ($ *x862-arg-y*))) 8085 (-> done) 8128 (if tailp 8129 (! jump-return-pc) 8130 (-> done)) 8086 8131 (@ out-of-line) 8087 8132 (if otherform 8088 8133 (x862-lri seg ($ *x862-arg-y*) (ash fixval *x862-target-fixnum-shift*))) 8089 (! call-subprim-2 ($ *x862-arg-z*) (subprim-name->offset '.SPbuiltin-logand) ($ *x862-arg-y*) ($ *x862-arg-z*)) 8090 (@ done) 8091 (x862-copy-register seg target ($ *x862-arg-z*))) 8092 (^))))))) 8134 (if tailp 8135 (! jump-subprim (subprim-name->offset '.SPbuiltin-logand)) 8136 (progn 8137 (! call-subprim-2 ($ *x862-arg-z*) (subprim-name->offset '.SPbuiltin-logand) ($ *x862-arg-y*) ($ *x862-arg-z*)) 8138 (@ done) 8139 (x862-copy-register seg target ($ *x862-arg-z*))))) 8140 (^))))))) 8093 8141 8094 8142 (defx862 x862-logand2 logand2 (seg vreg xfer form1 form2)
Note:
See TracChangeset
for help on using the changeset viewer.
