Changeset 7339
- Timestamp:
- Oct 1, 2007, 8:20:42 PM (13 years ago)
- Location:
- branches/ia32/compiler/X86
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ia32/compiler/X86/X8632/x8632-arch.lisp
r7286 r7339 363 363 (defconstant t-value (+ #x3008 fulltag-misc)) 364 364 (defconstant t-offset (- t-value nil-value)) 365 (defconstant nilsym-offset (+ t-offset symbol.size))366 365 367 366 (defconstant misc-bias fulltag-misc) … … 456 455 binding-index 457 456 ) 457 458 (defconstant nilsym-offset (+ t-offset symbol.size)) 458 459 459 460 (define-fixedsized-object vectorH -
branches/ia32/compiler/X86/X8632/x8632-vinsns.lisp
r7286 r7339 1313 1313 ;; start-mv-call 1314 1314 1315 ;; xxx check this 1316 (define-x8632-vinsn (vpush-label :push :node :vsp) (() 1317 ((label :label))) 1318 (leal (:@ (:^ label) (:%l x8632::fn)) (:%l x8632::ra0)) 1319 (pushl (:%l x8632::ra0))) 1320 1315 1321 ;; ???? 1316 1322 (define-x8632-vinsn emit-aligned-label (() … … 1320 1326 1321 1327 ;; pass-multiple-values-symbol 1328 ;;; %ra0 is pointing into %fn, so no need to copy %fn here. 1329 (define-x8632-vinsn pass-multiple-values-symbol (() 1330 ()) 1331 (pushl (:@ (+ x8632::nil-value (x8632::%kernel-global 'x86::ret1valaddr)))) 1332 (jmp (:@ x8632::symbol.fcell (:% x8632::fname)))) 1333 1334 1322 1335 ;; pass-multiple-values 1323 1336 … … 1441 1454 :done) 1442 1455 1456 (define-x8632-subprim-lea-jmp-vinsn (bind-interrupt-level-m1) .SPbind-interrupt-level-m1) 1457 1458 (define-x8632-subprim-lea-jmp-vinsn (bind-interrupt-level) .SPbind-interrupt-level) 1459 1460 (define-x8632-subprim-call-vinsn (unbind-interrupt-level) .SPunbind-interrupt-level) 1461 1443 1462 (define-x8632-subprim-jump-vinsn (tail-call-fn-gen) .SPtcallnfngen) 1444 1463 … … 1514 1533 1515 1534 ;;; 3d-dims 1516 ;;; 2d-unscaled-index 1535 1536 ;;; xxx 1537 (define-x8632-vinsn 2d-unscaled-index (((dest :imm) 1538 (dim1 :u32)) 1539 ((dim1 :u32) 1540 (i :imm) 1541 (j :imm))) 1542 1543 (imull (:%l i) (:%l dim1)) 1544 (leal (:@ (:%l j) (:%l dim1)) (:%l dest))) 1517 1545 1518 1546 ;;; 3d-unscaled-index … … 1565 1593 ()) 1566 1594 (movl (:$self 0) (:%l x8632::fn))) 1595 1596 1597 (define-x8632-subprim-jump-vinsn (tail-call-sym-slide) .SPtcallsymslide) 1598 1599 (define-x8632-subprim-jump-vinsn (tail-call-sym-vsp) .SPtcallsymvsp) 1600 1601 1602 (define-x8632-vinsn character->code (((dest :u32)) 1603 ((src :lisp))) 1604 (movl (:%l src) (:%l dest)) 1605 (sarl (:$ub x8632::charcode-shift) (:%l dest))) 1606 1607 (define-x8632-vinsn adjust-vsp (() 1608 ((amount :s32const))) 1609 ((:and (:pred >= amount -128) (:pred <= amount 127)) 1610 (addl (:$b amount) (:%l x8632::esp))) 1611 ((:not (:and (:pred >= amount -128) (:pred <= amount 127))) 1612 (addl (:$l amount) (:%l x8632::esp)))) 1567 1613 1568 1614 … … 1740 1786 (shrl (:$ub amt) (:%l dest))) 1741 1787 1742 1788 (define-x8632-vinsn recover-fn (() 1789 ()) 1790 (movl (:$self 0) (:%l x8632::fn))) 1791 1792 ;;; xxx probably wrong 1793 (define-x8632-vinsn (call-subprim-3 :call :subprim-call) (((dest t)) 1794 ((spno :s32const) 1795 (x t) 1796 (y t) 1797 (z t)) 1798 ((entry (:label 1)))) 1799 (:talign 5) 1800 (call (:@ spno)) 1801 (movl (:$self 0) (:%l x8632::fn))) 1743 1802 1744 1803 (queue-fixup -
branches/ia32/compiler/X86/x862.lisp
r7286 r7339 182 182 (defvar *x862-temp0* nil) 183 183 (defvar *x862-temp1* nil) 184 (defvar *x862-fn* nil) 184 185 (defvar *x862-fname* nil) 186 (defvar *x862-ra0* nil) 185 187 186 188 (defvar *x862-allocptr* nil) … … 461 463 (*x862-cstack* 0) 462 464 (*x86-lap-entry-offset* (target-arch-case 463 (:x8632 x8632::fulltag-misc)465 (:x8632 (- x8632::fulltag-misc 3)) ;xxx magic fudge factor 464 466 (:x8664 x8664::fulltag-function))) 465 467 (*x862-result-reg* (target-arch-case … … 476 478 (*x862-temp1* (target-arch-case (:x8632 x8632::temp1) 477 479 (:x8664 x8664::temp1))) 480 (*x862-fn* (target-arch-case (:x8632 x8632::fn) 481 (:x8664 x8664::fn))) 478 482 (*x862-fname* (target-arch-case (:x8632 x8632::fname) 479 483 (:x8664 x8664::fname))) 484 (*x862-ra0* (target-arch-case (:x8632 x8632::ra0) 485 (:x8664 x8664::ra0))) 480 486 (*x862-allocptr* (target-arch-case (:x8632 x8632::allocptr) 481 487 (:x8664 x8664::allocptr))) … … 582 588 (instruction (x86::make-x86-instruction)) 583 589 (end-code-tag (gensym)) 590 (start-tag (gensym)) 584 591 (srt-tag (gensym)) 585 592 debug-info) … … 593 600 (x86-lap-directive frag-list :byte 0)) ;regsave mask 594 601 (:x8632 602 (make-x86-lap-label start-tag) 595 603 (make-x86-lap-label srt-tag) 596 604 (x86-lap-directive frag-list :short `(ash (+ (- (:^ ,end-code-tag) 4) 597 *x86-lap-entry-offset*) -2)))) 605 *x86-lap-entry-offset*) -2)) 606 (emit-x86-lap-label frag-list start-tag))) 598 607 (x862-expand-vinsns vinsns frag-list instruction) 599 608 (when (or *x862-double-float-constant-alist* … … 689 698 (srt-frag (x86-lap-label-frag label)) 690 699 (srt-index (x86-lap-label-offset label))) 700 ;; (format t "~&end-code-label = ~s offset = ~s addr = ~s" (setq label (find end-code-tag *x86-lap-labels* 701 ;; :test #'eq :key #'x86-lap-label-name)) 702 ;; (x86-lap-label-offset label) 703 ;; (x86-lap-label-address label)) 704 ;; (format t "~&start-label = ~s offset = ~s addr = ~s" (setq label (find start-tag *x86-lap-labels* 705 ;; :test #'eq :key #'x86-lap-label-name)) 706 ;; (x86-lap-label-offset label) 707 ;; (x86-lap-label-address label)) 691 708 ;; fill in self-reference offsets 692 709 (do-dll-nodes (frag frag-list) … … 892 909 (defun x862-save-nvrs (seg n) 893 910 (declare (fixnum n)) 894 (when (> n 0) 895 (setq *x862-compiler-register-save-label* (x862-emit-note seg :regsave)) 896 (with-x86-local-vinsn-macros (seg) 897 (let* ((mask (target-arch-case 898 (:x8632 x8632-nonvolatile-node-regs) 899 (:x8664 x8664-nonvolatile-node-regs)))) 900 (dotimes (i n) 901 (let* ((reg (1- (integer-length mask)))) 902 (x862-vpush-register seg reg :regsave reg 0) 903 (setq mask (logandc2 mask (ash 1 reg))))))) 904 (setq *x862-register-restore-ea* *x862-vstack* 905 *x862-register-restore-count* n))) 911 (target-arch-case 912 ;; no nvrs on x8632 913 (:x8664 914 (when (> n 0) 915 (setq *x862-compiler-register-save-label* (x862-emit-note seg :regsave)) 916 (with-x86-local-vinsn-macros (seg) 917 (let* ((mask x8664-nonvolatile-node-regs)) 918 (dotimes (i n) 919 (let* ((reg (1- (integer-length mask)))) 920 (x862-vpush-register seg reg :regsave reg 0) 921 (setq mask (logandc2 mask (ash 1 reg))))))) 922 (setq *x862-register-restore-ea* *x862-vstack* 923 *x862-register-restore-count* n))))) 906 924 907 925 … … 914 932 915 933 (defun x862-restore-nvrs (seg ea nregs &optional (can-pop t)) 916 (when (and ea nregs) 917 (with-x86-local-vinsn-macros (seg) 918 (let* ((mask (target-arch-case 919 (:x8632 x8632-nonvolatile-node-regs) 920 (:x8664 x8664-nonvolatile-node-regs))) 921 (regs ())) 922 (dotimes (i nregs) 923 (let* ((reg (1- (integer-length mask)))) 924 (push reg regs) 925 (setq mask (logandc2 mask (ash 1 reg))))) 926 (cond (can-pop 927 (let* ((diff-in-bytes (- *x862-vstack* ea))) 928 (unless (zerop diff-in-bytes) 929 (x862-adjust-vstack diff-in-bytes) 930 (! vstack-discard (floor diff-in-bytes *x862-target-node-size*))) 931 (dolist (reg regs) 932 (! vpop-register reg)))) 933 (t 934 (dolist (reg regs) 935 (! vframe-load reg (- ea *x862-target-node-size*) ea) 936 (decf ea *x862-target-node-size*)))))))) 934 (target-arch-case 935 ;; no nvrs on x8632 936 (:x8664 937 (when (and ea nregs) 938 (with-x86-local-vinsn-macros (seg) 939 (let* ((mask x8664-nonvolatile-node-regs) 940 (regs ())) 941 (dotimes (i nregs) 942 (let* ((reg (1- (integer-length mask)))) 943 (push reg regs) 944 (setq mask (logandc2 mask (ash 1 reg))))) 945 (cond (can-pop 946 (let* ((diff-in-bytes (- *x862-vstack* ea))) 947 (unless (zerop diff-in-bytes) 948 (x862-adjust-vstack diff-in-bytes) 949 (! vstack-discard (floor diff-in-bytes *x862-target-node-size*))) 950 (dolist (reg regs) 951 (! vpop-register reg)))) 952 (t 953 (dolist (reg regs) 954 (! vframe-load reg (- ea *x862-target-node-size*) ea) 955 (decf ea *x862-target-node-size*)))))))))) 937 956 938 957 … … 1081 1100 (declare (fixnum offset)) 1082 1101 (! save-lisp-context-offset offset)))) 1083 ( destructuring-bind (&optional zvar yvar xvar &rest stack-args) revargs1084 (let* ((nstackargs (length stack-args)))1085 (x862-set-vstack (* nstackargs *x862-target-node-size*)) 1086 (dotimes (i nstackargs)1087 (x862-new-vstack-lcell :reserved *x862-target-lcell-size* 0 nil))1088 (target-arch-case1089 (:x86321102 (target-arch-case 1103 (:x8632 1104 (destructuring-bind (&optional zvar yvar &rest stack-args) revargs 1105 (let* ((nstackargs (length stack-args))) 1106 (x862-set-vstack (* nstackargs *x862-target-node-size*)) 1107 (dotimes (i nstackargs) 1108 (x862-new-vstack-lcell :reserved *x862-target-lcell-size* 0 nil)) 1090 1109 (if (>= nargs 2) 1091 (push (x862-vpush-arg-register seg ($ x8632::arg_y) yvar) reg-vars))1110 (push (x862-vpush-arg-register seg ($ *x862-arg-y*) yvar) reg-vars)) 1092 1111 (if (>= nargs 1) 1093 (push (x862-vpush-arg-register seg ($ x8632::arg_z) zvar) reg-vars))) 1094 (:x8664 1112 (push (x862-vpush-arg-register seg ($ *x862-arg-z*) zvar) reg-vars))))) 1113 (:x8664 1114 (destructuring-bind (&optional zvar yvar xvar &rest stack-args) revargs 1115 (let* ((nstackargs (length stack-args))) 1116 (x862-set-vstack (* nstackargs *x862-target-node-size*)) 1117 (dotimes (i nstackargs) 1118 (x862-new-vstack-lcell :reserved *x862-target-lcell-size* 0 nil)) 1095 1119 (if (>= nargs 3) 1096 1120 (push (x862-vpush-arg-register seg ($ x8664::arg_x) xvar) reg-vars)) 1097 1121 (if (>= nargs 2) 1098 (push (x862-vpush-arg-register seg ($ x8664::arg_y) yvar) reg-vars))1122 (push (x862-vpush-arg-register seg ($ *x862-arg-y*) yvar) reg-vars)) 1099 1123 (if (>= nargs 1) 1100 (push (x862-vpush-arg-register seg ($ x8664::arg_z) zvar) reg-vars))))))1124 (push (x862-vpush-arg-register seg ($ *x862-arg-z*) zvar) reg-vars)))))) 1101 1125 reg-vars))) 1102 1126 … … 1215 1239 (dolist (f (%cdr form) (x862-branch seg xfer)) 1216 1240 (x862-form seg nil nil f )) 1217 1241 (apply fn seg vreg xfer (%cdr form))) 1218 1242 (error "x862-form ? ~s" form)))))) 1219 1243 … … 1752 1776 1753 1777 (defun x862-aset2 (seg vreg xfer array i j new safe type-keyword dim0 dim1) 1778 (target-arch-case 1779 (:x8632 (error "not for x8632 yet"))) 1754 1780 (with-x86-local-vinsn-macros (seg target) 1755 1781 (let* ((i-known-fixnum (acode-fixnum-form-p i)) … … 1820 1846 1821 1847 (defun x862-aset3 (seg vreg xfer array i j k new safe type-keyword dim0 dim1 dim2) 1848 (target-arch-case 1849 (:x8632 (error "not for x8632 yet"))) 1822 1850 (with-x86-local-vinsn-macros (seg target) 1823 1851 (let* ((i-known-fixnum (acode-fixnum-form-p i)) … … 1898 1926 1899 1927 (defun x862-aref2 (seg vreg xfer array i j safe typekeyword &optional dim0 dim1) 1928 (target-arch-case 1929 (:x8632 (error "not for x8632 yet"))) 1900 1930 (with-x86-local-vinsn-macros (seg vreg xfer) 1901 1931 (let* ((i-known-fixnum (acode-fixnum-form-p i)) … … 1941 1971 1942 1972 (defun x862-aref3 (seg vreg xfer array i j k safe typekeyword &optional dim0 dim1 dim2) 1973 (target-arch-case 1974 (:x8632 (error "not for x8632 yet"))) 1943 1975 (with-x86-local-vinsn-macros (seg vreg xfer) 1944 1976 (let* ((i-known-fixnum (acode-fixnum-form-p i)) … … 2563 2595 (! emit-aligned-label (aref *backend-labels* labelnum)) 2564 2596 (@ labelnum) 2565 (! recover-fn-from-rip))) 2597 (target-arch-case 2598 (:x8632 2599 (! recover-fn)) 2600 (:x8664 2601 (! recover-fn-from-rip))))) 2566 2602 2567 2603 … … 2628 2664 (unless mvpass-label (error "bug: no label for mvpass")) 2629 2665 (if label-p 2630 (x862-copy-register seg call-reg ($ x8664::fn))2666 (x862-copy-register seg call-reg ($ *x862-fn*)) 2631 2667 (if a-reg 2632 2668 (x862-copy-register seg call-reg a-reg) … … 2667 2703 (unless (or label-p a-reg) (x862-store-immediate seg func destreg)) 2668 2704 (when label-p 2669 (x862-copy-register seg *x862-temp0* x8664::fn))2705 (x862-copy-register seg *x862-temp0* *x862-fn*)) 2670 2706 2671 2707 (cond ((or spread-p (null nargs)) … … 2757 2793 *x862-imm0* 2758 2794 (arch::make-vheader vsize (nx-lookup-target-uvector-subtag :function))) 2759 (x862-lri seg x8664::imm1 (- (ash (logandc2 (+ vsize 2) 1) (arch::target-word-shift arch)) (target-arch-case (:x8664 x8664::fulltag-misc)))) 2795 (target-arch-case 2796 (:x8632 2797 (! setup-uvector-allocation *x862-imm0*) 2798 (x862-lri seg *x862-imm0* (- (ash (logandc2 (+ vsize 2) 1) (arch::target-word-shift arch)) x8632::fulltag-misc))) 2799 (:x8664 2800 (x862-lri seg x8664::imm1 (- (ash (logandc2 (+ vsize 2) 1) (arch::target-word-shift arch)) (target-arch-case (:x8664 x8664::fulltag-misc)))))) 2760 2801 (! %allocate-uvector dest))) 2761 2802 (! init-nclosure *x862-arg-z*) 2762 (x862-store-immediate seg (x862-afunc-lfun-ref afunc) x8664::ra0)2803 (x862-store-immediate seg (x862-afunc-lfun-ref afunc) *x862-ra0*) 2763 2804 (with-node-temps (*x862-arg-z*) (t0 t1 t2 t3) 2764 (do* ((func x8664::ra0nil))2805 (do* ((func *x862-ra0* nil)) 2765 2806 ((null inherited-vars)) 2766 2807 (let* ((t0r (or func (if inherited-vars (var-to-reg (pop inherited-vars) t0)))) … … 2856 2897 (yform (%cadr revregargs)) 2857 2898 (xform (%caddr revregargs))) 2858 2859 2860 2861 2862 2899 (if (eq 3 nregs) 2900 (x862-three-targeted-reg-forms seg xform ($ x8664::arg_x) yform ($ *x862-arg-y*) zform ($ *x862-arg-z*)) 2901 (if (eq 2 nregs) 2902 (x862-two-targeted-reg-forms seg yform ($ *x862-arg-y*) zform ($ *x862-arg-z*)) 2903 (x862-one-targeted-reg-form seg zform ($ *x862-arg-z*)))))) 2863 2904 n))) 2864 2905 … … 4139 4180 (x862-note-top-cell var)) 4140 4181 (when make-vcell 4141 (with-node-target ( x8664::allocptr) closed4142 (with-node-target ( x8664::allocptrclosed) vcell4182 (with-node-target (*x862-allocptr*) closed 4183 (with-node-target (*x862-allocptr* closed) vcell 4143 4184 (x862-stack-to-register seg vloc closed) 4144 4185 (if closed-downward … … 4173 4214 (error "bind-var: var ~s was punted" var)) 4174 4215 (when make-vcell 4175 (with-node-target ( x8664::allocptr) closed4176 (with-node-target ( x8664::allocptrclosed) vcell4216 (with-node-target (*x862-allocptr*) closed 4217 (with-node-target (*x862-allocptr* closed) vcell 4177 4218 (x862-stack-to-register seg vloc closed) 4178 4219 (if closed-downward … … 5637 5678 (defun x862-binary-builtin (seg vreg xfer name form1 form2) 5638 5679 (with-x86-local-vinsn-macros (seg) 5639 (target-arch-case 5640 (:x8632 5641 (x862-two-targeted-reg-forms seg form1 ($ x8632::arg_y) form2 ($ x8632::arg_z))) 5642 (:x8664 5643 (x862-two-targeted-reg-forms seg form1 ($ *x862-arg-y*) form2 ($ *x862-arg-z*)))) 5680 (x862-two-targeted-reg-forms seg form1 ($ *x862-arg-y*) form2 ($ *x862-arg-z*)) 5644 5681 (x862-fixed-call-builtin seg vreg xfer name (subprim-name->offset '.SPcallbuiltin2)))) 5645 5682 … … 5726 5763 (! check-max-nargs max-args)) 5727 5764 (if (not (or rest keys)) 5728 (if (<= (+ num-fixed num-opt) $numx8664argregs)5765 (if (<= (+ num-fixed num-opt) *x862-target-num-arg-regs*) 5729 5766 (! save-lisp-context-no-stack-args) 5730 5767 (! save-lisp-context-variable-arg-count)) … … 5747 5784 (dotimes (i (the fixnum (+ nkeys nkeys))) 5748 5785 (x862-new-vstack-lcell :reserved *x862-target-lcell-size* 0 nil)) 5749 (x862-lri seg x8664::temp1(ash flags *x862-target-fixnum-shift*))5786 (x862-lri seg *x862-temp1* (ash flags *x862-target-fixnum-shift*)) 5750 5787 (unless (= nprev 0) 5751 5788 (x862-lri seg *x862-imm0* (ash nprev *x862-target-fixnum-shift*))) … … 5821 5858 (! ref-constant reg (x86-immediate-label (car constant)))))) 5822 5859 (when (and (not (or opt rest keys)) 5823 (<= max-args $numx8664argregs)5860 (<= max-args *x862-target-num-arg-regs*) 5824 5861 (not (some #'null arg-regs))) 5825 5862 (setq *x862-tail-vsp* *x862-vstack* … … 5837 5874 (do* ((vars arg-regs (cdr vars)) 5838 5875 (arg-reg-numbers (target-arch-case 5876 (:x8632 (list *x862-arg-z* *x862-arg-y*)) 5839 5877 (:x8664 (list *x862-arg-z* *x862-arg-y* x8664::arg_x)))) 5840 5878 (arg-reg-num (pop arg-reg-numbers) (pop arg-reg-numbers))) … … 7309 7347 (+ nbytes *x862-target-node-size* 7310 7348 (1- *x862-target-dnode-size*))) #x8000)) 7311 (let* ((header *x862-imm0*) 7312 (physsize x8664::imm1)) 7313 (x862-lri seg header (arch::make-vheader nelements subtag)) 7314 (x862-lri seg physsize (- (* (ceiling (+ nbytes *x862-target-node-size*) *x862-target-dnode-size*) 7315 *x862-target-dnode-size*) 7316 (target-arch-case 7317 (:x8632 x8632::fulltag-misc) 7318 (:x8664 x8664::fulltag-misc)))) 7349 (let* ((header *x862-imm0*) 7350 (n (- (* (ceiling (+ nbytes *x862-target-node-size*) *x862-target-dnode-size*) *x862-target-dnode-size*) 7351 (target-arch-case 7352 (:x8632 x8632::fulltag-misc) 7353 (:x8664 x8664::fulltag-misc))))) ;target::fulltag-misc? 7354 (x862-lri seg header (arch::make-vheader nelements subtag)) 7355 (target-arch-case 7356 (:x8632 7357 (! setup-uvector-allocation n)) 7358 (:x8664 7359 (x862-lri seg x8664::imm1 n))) 7319 7360 (ensuring-node-target (target vreg) 7320 7361 (! %allocate-uvector target))) … … 7931 7972 (^)) 7932 7973 7933 ;;; xxx --- does anyone use this?7934 7974 (defx862 x862-%lisp-word-ref %lisp-word-ref (seg vreg xfer base offset) 7935 7975 (let* ((fixoffset (acode-fixnum-form-p offset))) … … 8058 8098 8059 8099 (defx862 x862-generic-aref2 general-aref2 (seg vreg xfer arr i j) 8100 (target-arch-case 8101 (:x8632 (error "not for x8632 yet"))) 8060 8102 (let* ((atype0 (acode-form-type arr t)) 8061 8103 (ctype (if atype0 (specifier-type atype0))) … … 8109 8151 8110 8152 (defx862 x862-general-aref3 general-aref3 (seg vreg xfer arr i j k) 8153 (target-arch-case 8154 (:x8632 (error "not for x8632 yet"))) 8111 8155 (let* ((atype0 (acode-form-type arr t)) 8112 8156 (ctype (if atype0 (specifier-type atype0))) … … 8149 8193 8150 8194 (defx862 x862-general-aset2 general-aset2 (seg vreg xfer arr i j new) 8195 (target-arch-case 8196 (:x8632 (error "not for x8632 yet"))) 8151 8197 (let* ((atype0 (acode-form-type arr t)) 8152 8198 (ctype (if atype0 (specifier-type atype0))) … … 8186 8232 8187 8233 (defx862 x862-general-aset3 general-aset3 (seg vreg xfer arr i j k new) 8234 (target-arch-case 8235 (:x8632 (error "not for x8632 yet"))) 8188 8236 (let* ((atype0 (acode-form-type arr t)) 8189 8237 (ctype (if atype0 (specifier-type atype0)))
Note: See TracChangeset
for help on using the changeset viewer.