Changeset 14982
- Timestamp:
- Sep 15, 2011, 9:46:53 PM (13 years ago)
- Location:
- trunk/source/compiler
- Files:
-
- 8 edited
-
ARM/arm2.lisp (modified) (10 diffs)
-
PPC/ppc2.lisp (modified) (1 diff)
-
X86/x862.lisp (modified) (1 diff)
-
backend.lisp (modified) (1 diff)
-
nx-basic.lisp (modified) (1 diff)
-
nx0.lisp (modified) (11 diffs)
-
nx1.lisp (modified) (2 diffs)
-
nxenv.lisp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/compiler/ARM/arm2.lisp
r14972 r14982 355 355 (#.arm::arm-cond-le arm::arm-cond-ge) 356 356 (#.arm::arm-cond-gt arm::arm-cond-lt) 357 (#.arm::arm-cond-ge arm::arm-cond-le))) 357 (#.arm::arm-cond-ge arm::arm-cond-le) 358 (#.arm::arm-cond-lo arm::arm-cond-hi) 359 (#.arm::arm-cond-ls arm::arm-cond-hs) 360 (#.arm::arm-cond-hi arm::arm-cond-lo) 361 (#.arm::arm-cond-hs arm::arm-cond-ls))) 358 362 359 363 … … 2366 2370 (when (and rest (not key-p) (not (cadr auxen)) rest-values) 2367 2371 (when (eq (logand (the fixnum (nx-var-bits rest)) 2368 (logior $vsetqmask(ash -1 $vbitspecial)2372 (logior (ash -1 $vbitspecial) 2369 2373 (ash 1 $vbitclosed) (ash 1 $vbitsetq) (ash 1 $vbitcloseddownward))) 2370 2374 0) ; Nothing but simple references … … 3020 3024 (values aalready balready) 3021 3025 (with-arm-local-vinsn-macros (seg) 3022 (let* ((avar (arm2-lexical-reference-p aform)) 3026 (let* ((*available-backend-imm-temps* *available-backend-imm-temps*) 3027 (avar (arm2-lexical-reference-p aform)) 3023 3028 (adest areg) 3024 3029 (bdest breg) … … 3032 3037 (progn 3033 3038 (setq adest (arm2-one-untargeted-reg-form seg aform areg)) 3039 (when (imm-reg-p adest) 3040 (use-imm-temp (%hard-regspec-value adest))) 3034 3041 (when (same-arm-reg-p adest breg) 3035 3042 (setq breg areg))) … … 3040 3047 (setq bdest (arm2-one-untargeted-reg-form seg bform breg))) 3041 3048 (if aconst 3042 (setq adest (arm2-one-untargeted-reg-form seg aform areg)) 3049 (progn 3050 (if (imm-reg-p bdest) 3051 (use-imm-temp (%hard-regspec-value bdest))) 3052 (setq adest (arm2-one-untargeted-reg-form seg aform areg))) 3043 3053 (if apushed 3044 3054 (arm2-elide-pushes seg apushed (arm2-pop-register seg areg))))) … … 3358 3368 arglist) 3359 3369 3360 (defun arm2-constant-for-compare-p (form )3370 (defun arm2-constant-for-compare-p (form &optional unboxed) 3361 3371 (setq form (acode-unwrapped-form form)) 3362 3372 (when (acode-p form) 3363 3373 (let* ((op (acode-operator form))) 3364 3374 (if (eql op (%nx1-operator fixnum)) 3365 (let* ((val (ash (cadr form) arm::fixnumshift))) 3375 (let* ((val (if unboxed 3376 (cadr form) 3377 (ash (cadr form) arm::fixnumshift)))) 3366 3378 (if (or (arm::encode-arm-immediate val) 3367 3379 (arm::encode-arm-immediate (- val))) … … 3440 3452 (multiple-value-bind (ireg jreg) (arm2-two-untargeted-reg-forms seg i arm::arg_y j arm::arg_z) 3441 3453 (arm2-compare-registers seg vreg xfer ireg jreg cr-bit true-p))))))))) 3454 3455 (defun arm2-natural-compare (seg vreg xfer i j cr-bit true-p) 3456 (with-arm-local-vinsn-macros (seg vreg xfer) 3457 (let* ((jconst (arm2-constant-for-compare-p j t)) 3458 (iconst (arm2-constant-for-compare-p i t)) 3459 (boolean (backend-crf-p vreg))) 3460 (if (and boolean (or iconst jconst)) 3461 (let* ((reg (arm2-one-untargeted-reg-form seg (if jconst i j) ($ arm::imm0 :mode :u32)))) 3462 (! compare-immediate vreg reg (or jconst iconst)) 3463 (unless (or jconst (eq cr-bit arm::arm-cond-eq)) 3464 (setq cr-bit (arm2-cr-bit-for-reversed-comparison cr-bit))) 3465 (^ cr-bit true-p)) 3466 (if (and (eq cr-bit arm::arm-cond-eq) 3467 (or jconst iconst)) 3468 (arm2-test-reg-%izerop 3469 seg 3470 vreg 3471 xfer 3472 (arm2-one-untargeted-reg-form 3473 seg 3474 (if jconst i j) 3475 ($ arm::imm0 :mode :u32)) 3476 cr-bit 3477 true-p 3478 (or jconst iconst)) 3479 (multiple-value-bind (ireg jreg) (arm2-two-untargeted-reg-forms seg i ($ arm::imm0 :mode :u32) j ($ arm::imm1 :mode :u32)) 3480 (arm2-compare-registers seg vreg xfer ireg jreg cr-bit true-p))))))) 3442 3481 3443 3482 … … 3889 3928 (progn 3890 3929 (nx-set-var-bits var (%ilogior (%ilsl $vbitpunted 1) bits)) 3891 (nx2-replace-var-refs var puntval) 3930 (let* ((type (var-inittype var))) 3931 (if (and type (not (eq t type))) 3932 (nx2-replace-var-refs var 3933 (make-acode (%nx1-operator typed-form) 3934 type 3935 puntval)) 3936 (nx2-replace-var-refs var puntval))) 3892 3937 (arm2-set-var-ea seg var puntval)) 3893 3938 (progn … … 6014 6059 (arm2-compare seg vreg xfer form1 form2 cr-bit true-p))) 6015 6060 6061 6016 6062 (defarm2 arm2-numcmp numcmp (seg vreg xfer cc form1 form2) 6017 6063 (or (acode-optimize-numcmp seg vreg xfer cc form1 form2 *arm2-trust-declarations*) … … 7080 7126 (multiple-value-bind (cr-bit true-p) (acode-condition-to-arm-cr-bit cc) 7081 7127 (setq cr-bit (arm-cr-bit-to-arm-unsigned-cr-bit cr-bit)) 7082 (arm2- compare seg vreg xfer form1 form2 cr-bit true-p)))7128 (arm2-natural-compare seg vreg xfer form1 form2 cr-bit true-p))) 7083 7129 7084 7130 (defarm2 arm2-double-float-compare double-float-compare (seg vreg xfer cc form1 form2) -
trunk/source/compiler/PPC/ppc2.lisp
r14959 r14982 2201 2201 (when (and rest (not key-p) (not (cadr auxen)) rest-values) 2202 2202 (when (eq (logand (the fixnum (nx-var-bits rest)) 2203 (logior $vsetqmask(ash -1 $vbitspecial)2203 (logior (ash -1 $vbitspecial) 2204 2204 (ash 1 $vbitclosed) (ash 1 $vbitsetq) (ash 1 $vbitcloseddownward))) 2205 2205 0) ; Nothing but simple references -
trunk/source/compiler/X86/x862.lisp
r14979 r14982 2724 2724 (when (and rest (not key-p) (not (cadr auxen)) rest-values) 2725 2725 (when (eq (logand (the fixnum (nx-var-bits rest)) 2726 (logior $vsetqmask(ash -1 $vbitspecial)2726 (logior (ash -1 $vbitspecial) 2727 2727 (ash 1 $vbitclosed) (ash 1 $vbitsetq) (ash 1 $vbitcloseddownward))) 2728 2728 0) ; Nothing but simple references -
trunk/source/compiler/backend.lisp
r14848 r14982 151 151 (= (get-regspec-mode reg) hard-reg-class-gpr-mode-node))) 152 152 153 (defun imm-reg-p (reg) 154 (and (= (hard-regspec-class reg) hard-reg-class-gpr) 155 (/= (get-regspec-mode reg) hard-reg-class-gpr-mode-node))) 156 153 157 (defun node-reg-value (reg) 154 158 (if (node-reg-p reg) -
trunk/source/compiler/nx-basic.lisp
r14972 r14982 512 512 513 513 (defun nx-cons-var (name &optional (bits 0)) 514 (%istruct 'var name bits nil nil nil nil 0 nil nil ))514 (%istruct 'var name bits nil nil nil nil 0 nil nil 0 0 nil)) 515 515 516 516 -
trunk/source/compiler/nx0.lisp
r14980 r14982 491 491 (punted (logbitp $vbitpunted bits))) 492 492 (if (or punted 493 (eql 0 ( %ilogand $vsetqmask bits)))493 (eql 0 (nx-var-root-nsetqs var))) 494 494 (var-inittype var))))) 495 495 (if (or (eq op (%nx1-operator %aref1)) … … 1007 1007 (or ignored ignoreunused 1008 1008 (progn (and (consp expansion) (eq (car expansion) :symbol-macro) (setq sym (list :symbol-macro sym))) (nx1-whine :unused sym))) 1009 (when ( %izerop (%ilogand bits (%ilogior $vrefmask $vsetqmask)))1009 (when (eql 0 (logior (nx-var-root-nrefs var) (nx-var-root-nsetqs var))) 1010 1010 (nx-set-var-bits var (%ilogior (%ilsl $vbitignore 1) bits))))))) 1011 1011 … … 1045 1045 ;;; setq'ed, and the old guy wasn't setq'ed in the body, the binding 1046 1046 ;;; can be punted. 1047 1047 1048 (defun nx1-note-var-binding (var initform) 1048 1049 (let* ((inittype (nx-acode-form-type initform *nx-lexical-environment*)) … … 1056 1057 (if (eq op (%nx1-operator lexical-reference)) 1057 1058 (let* ((target (%cadr init)) 1058 (setq-count (%ilsr 8 (%ilogand $vsetqmask (nx-var-bits target))))) 1059 (unless (eq setq-count (%ilsr 8 $vsetqmask)) 1060 (cons var (cons setq-count target)))) 1059 (setq-count (nx-var-root-nsetqs var))) 1060 (cons var (cons setq-count target))) 1061 1061 (if (and (%ilogbitp $vbitdynamicextent bits) 1062 1062 (or (eq op (%nx1-operator closed-function)) … … 1099 1099 (%ilogand 1100 1100 (%ilogior (%ilsl $vbitsetq 1) (%ilsl $vbitclosed 1)) 1101 target-bits)) 1102 (neq ( %ilsr 8 (%ilogand $vsetqmask target-bits)) (cadr pair)))1101 target-bits)) 1102 (neq (nx-var-root-nsetqs target) (cadr pair))) 1103 1103 (push (cons var target) *nx-punted-vars*))))) 1104 1104 … … 1106 1106 (let* ((bits (nx-var-bits var)) 1107 1107 (mask (%ilogior (%ilsl $vbitsetq 1) (ash -1 $vbitspecial) (%ilsl $vbitclosed 1))) 1108 (nrefs ( %ilogand $vrefmask bits))1108 (nrefs (nx-var-root-nrefs var)) 1109 1109 (val (nx-untyped-form initform)) 1110 1110 (op (if (acode-p val) (acode-operator val)))) … … 1207 1207 (setf (lexenv.lambda (setq result (new-lexical-environment result))) fn)))))) 1208 1208 1209 (defun nx-root-var (v)1210 (do* ((v v bits)1211 (bits (var-bits v) (var-bits v)))1212 ((fixnump bits) v)))1213 1209 1214 1210 (defun nx-reconcile-inherited-vars (more) … … 1345 1341 (declare (fixnum varbits boundtobits)) 1346 1342 (unless (eq (%ilogior 1343 (%ilsl $vbitsetq 1) 1344 (%ilsl $vbitclosed 1)) 1345 (%ilogand 1346 (%ilogior 1347 1347 (%ilsl $vbitsetq 1) 1348 1348 (%ilsl $vbitclosed 1)) 1349 (%ilogand 1350 (%ilogior 1351 (%ilsl $vbitsetq 1) 1352 (%ilsl $vbitclosed 1)) 1353 boundtobits)) 1349 boundtobits)) 1354 1350 ;; Can't happen - 1355 1351 (unless (%izerop (%ilogand (%ilogior 1356 (%ilsl $vbitsetq 1)1357 (ash -1 $vbitspecial)1358 (%ilsl $vbitclosed 1)) varbits))1352 (%ilsl $vbitsetq 1) 1353 (ash -1 $vbitspecial) 1354 (%ilsl $vbitclosed 1)) varbits)) 1359 1355 (error "Bug-o-rama - \"punted\" var had bogus bits. ~ 1360 1356 Or something. Right? ~s ~s" var varbits)) 1361 (let* ((varcount ( %ilogand $vrefmask varbits))1362 (boundtocount ( %ilogand $vrefmask boundtobits)))1357 (let* ((varcount (nx-var-root-nrefs var)) 1358 (boundtocount (nx-var-root-nrefs boundto))) 1363 1359 (nx-set-var-bits var (%ilogior 1364 (%ilsl $vbitpuntable 1) 1365 (%i- varbits varcount))) 1366 (setf (var-refs var) (+ (var-refs var) (var-refs boundto))) 1367 (nx-set-var-bits 1368 boundto 1369 (%i+ (%i- boundtobits boundtocount) 1370 (%ilogand $vrefmask 1371 (%i+ (%i- boundtocount 1) varcount))))))))) 1360 (%ilsl $vbitpuntable 1) 1361 varbits)) 1362 (setf (var-refs var) 0 1363 (var-refs boundto) (+ (var-refs var) (var-refs boundto))) 1364 (nx-set-var-root-nrefs boundto 1365 (+ (1- boundtocount) varcount))))))) 1372 1366 1373 1367 ;;; Home-baked handler-case replacement. About 10 times as fast as full handler-case. … … 2631 2625 2632 2626 2627 (defun nx-root-var (var) 2628 (do* ((var var bits) 2629 (bits (var-bits var) (var-bits var))) 2630 ((typep bits 'fixnum) var))) 2631 2633 2632 (defun nx-var-bits (var) 2634 2633 (do* ((var var bits) … … 2641 2640 ((fixnump bits) (setf (var-bits var) newbits)))) 2642 2641 2642 (defun nx-var-root-nrefs (var) 2643 (do* ((var var bits) 2644 (bits (var-bits var) (var-bits var))) 2645 ((fixnump bits) (var-root-nrefs var)))) 2646 2647 2648 (defun nx-set-var-root-nrefs (var new) 2649 (do* ((var var bits) 2650 (bits (var-bits var) (var-bits var))) 2651 ((fixnump bits) (setf (var-root-nrefs var) new)))) 2652 2653 (defun nx-var-root-nsetqs (var) 2654 (do* ((var var bits) 2655 (bits (var-bits var) (var-bits var))) 2656 ((fixnump bits) (var-root-nsetqs var)))) 2657 2658 (defun nx-set-var-root-nsetqs (var new) 2659 (do* ((var var bits) 2660 (bits (var-bits var) (var-bits var))) 2661 ((fixnump bits) (setf (var-root-nsetqs var) new)))) 2662 2643 2663 (defun nx-make-lexical-reference (var) 2644 2664 (let* ((ref (make-acode (%nx1-operator lexical-reference) var))) … … 2650 2670 (temp-p (%ilogbitp $vbittemporary bits)) 2651 2671 (by (if temp-p 1 (expt 4 *nx-loop-nesting-level*))) 2652 (new ( %imin (%i+ (%ilogand2 $vrefmask bits) by) 255)))2653 (setf (var-refs var) (+ (var-refs var) by))2654 (nx-set-var- bits var (%ilogior (%ilogand (%ilognot $vrefmask) bits) new))2672 (new (+ (var-refs var) by))) 2673 (setf (var-refs var) new) 2674 (nx-set-var-root-nrefs var (+ (nx-var-root-nrefs var) 1)) 2655 2675 new)) 2656 2676 -
trunk/source/compiler/nx1.lisp
r14940 r14982 1601 1601 (let ((tagbits (nx-var-bits tagvar))) 1602 1602 (if (not (%ilogbitp $vbitclosed tagbits)) 1603 (if (neq 0 ( %ilogand $vrefmask tagbits))1603 (if (neq 0 (nx-var-root-nrefs tagvar)) 1604 1604 (make-acode 1605 1605 (%nx1-operator local-block) … … 2195 2195 (let ((old-bits (nx-var-bits var))) 2196 2196 (push (nx1-form `(the ,type ,sym)) typechecks) 2197 (when (%izerop (%ilogand2 old-bits 2198 (%ilogior (%ilsl $vbitspecial 1) 2199 (%ilsl $vbitreffed 1) 2200 (%ilsl $vbitclosed 1) 2201 $vrefmask 2202 $vsetqmask))) 2197 (when (%izerop (logior 2198 (%ilogand2 old-bits 2199 (%ilogior (%ilsl $vbitspecial 1) 2200 (%ilsl $vbitreffed 1) 2201 (%ilsl $vbitclosed 1))) 2202 (nx-var-root-nrefs var) 2203 (nx-var-root-nsetqs var))) 2203 2204 (nx-set-var-bits var (%ilogand2 (nx-var-bits var) 2204 2205 (%ilognot (%ilsl $vbitignore 1)))))))))))))) -
trunk/source/compiler/nxenv.lisp
r14972 r14982 42 42 var-nvr 43 43 var-declared-unboxed-type ; NIL or float or natural-integer type 44 var-root-nrefs ; reference count of "root" var 45 var-root-nsetqs ; setq count of root var 46 var-initform ; initial value acode or NIL. 44 47 ) 45 48 … … 59 62 (defconstant $vbitreffed 27) 60 63 (defconstant $vbitspecial 28) 61 (defconstant $vsetqmask #xff00)62 (defconstant $vrefmask #xff)63 64 64 65 (defconstant $decl_optimize (%ilsl 16 0)) ; today's chuckle … … 561 562 (defun nx-adjust-setq-count (var &optional (by 1) catchp) 562 563 (let* ((bits (nx-var-bits var)) 564 (nsetqs (nx-var-root-nsetqs var)) 563 565 (scaled-by (if (%ilogbitp $vbittemporary bits) 564 566 by 565 567 (expt 4 *nx-loop-nesting-level*))) 566 (new (%i+ (%ilsr 8 (%ilogand2 $vsetqmask bits)) scaled-by))) 567 (if (%i> new 255) (setq new 255)) 568 (setq bits (nx-set-var-bits var (%ilogior (%ilogand (%ilognot $vsetqmask) bits) (%ilsl 8 new)))) 568 (new (%i+ nsetqs scaled-by))) 569 (nx-set-var-root-nsetqs var (1+ nsetqs)) 569 570 ;; If a variable is setq'ed from a catch nested within the construct that 570 571 ;; bound it, it can't be allocated to a register. * … … 575 576 (when catchp 576 577 (nx-set-var-bits var (%ilogior2 bits (%ilsl $vbitnoreg 1)))) 577 (setf (var-refs var) (+ (the fixnum (var-refs var)) scaled-by))578 (setf (var-refs var) new) 578 579 new)) 579 580
Note:
See TracChangeset
for help on using the changeset viewer.
