Changeset 8629


Ignore:
Timestamp:
Mar 1, 2008, 6:14:23 PM (12 years ago)
Author:
rme
Message:

Numerous changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32/compiler/X86/X8632/x8632-vinsns.lisp

    r8367 r8629  
    2626
    2727(define-x8632-vinsn scale-8bit-misc-index (((dest :u32))
     28                                            ((idx :imm))) ; A fixnum
     29  (movl (:%l idx) (:%l dest))
     30  (shrl (:$ub 2) (:%l dest)))
     31
     32;;; same as above, but looks better in bit vector contexts
     33(define-x8632-vinsn scale-1bit-misc-index (((dest :u32))
    2834                                            ((idx :imm))) ; A fixnum
    2935  (movl (:%l idx) (:%l dest))
     
    224230  ((:and (:pred > n 0) (:pred < n 32))
    225231   (cmpl (:$b (:apply ash n x8632::fixnumshift)) (:%l x8632::nargs)))
    226   ((:pred >= n 32))
    227    (cmpl (:$l (:apply ash n x8632::fixnumshift)) (:%l x8632::nargs))
     232  ((:pred >= n 32)
     233   (cmpl (:$l (:apply ash n x8632::fixnumshift)) (:%l x8632::nargs)))
    228234  (jz.pt :ok)
    229235  (uuo-error-wrong-number-of-args)
     
    235241   (testl (:%l x8632::nargs) (:%l x8632::nargs))
    236242   (jnz :ok))
    237   ((:and (:pred > min 1) (:pred < min 32))
    238    (rcmpl (:%l x8632::nargs) (:$b (:apply ash min x8632::fixnumshift))))
    239   ((:pred >= min 32)
    240    (rcmpl (:%l x8632::nargs) (:$l (:apply ash min x8632::fixnumshift))))
    241   (jae.pt :ok)
     243  ((:not (:pred = min 1))
     244   ((:and (:pred > min 1) (:pred < min 32))
     245    (rcmpl (:%l x8632::nargs) (:$b (:apply ash min x8632::fixnumshift))))
     246   ((:pred >= min 32)
     247    (rcmpl (:%l x8632::nargs) (:$l (:apply ash min x8632::fixnumshift))))
     248   (jae.pt :ok))
    242249  (uuo-error-too-few-args)
    243250  :ok)
     
    293300(define-x8632-vinsn default-optionals (()
    294301                                       ((n :u16const))
    295                                        ((temp :imm)))
     302                                       ((temp :u32)
     303                                        (nargs (:lisp #.x8632::nargs))))
     304  (movl (:%l x8632::nargs) (:%l temp))
    296305  ((:pred < n 32)
    297306   (rcmpl (:%l x8632::nargs) (:$b (:apply ash n x8632::fixnumshift))))
    298307  ((:pred >= n 32)
    299308   (rcmpl (:%l x8632::nargs) (:$l (:apply ash n x8632::fixnumshift))))
    300   (movl (:%l x8632::nargs) (:%l temp))
    301309  (jae :done)
    302310  :loop
     
    323331(define-x8632-vinsn save-lisp-context-variable-arg-count (()
    324332                                                          ()
    325                                                           ((temp :u32)))
     333                                                          ((temp :u32)
     334                                                           (nargs (:lisp #.x8632::nargs))))
    326335  (movl (:%l x8632::nargs) (:%l temp))
    327336  (subl (:$b (* $numx8632argregs x8632::node-size)) (:%l temp))
     
    340349(define-x8632-vinsn save-lisp-context-in-frame (()
    341350                                                ()
    342                                                 ((temp :u32)))
     351                                                ((temp :u32)
     352                                                 (nargs (:lisp #.x8632::nargs))))
    343353  (movl (:%l x8632::nargs) (:%l temp))
    344354  (subl (:$b (* $numx8632argregs x8632::node-size)) (:%l temp))
     
    490500  (uuo-error-reg-not-tag (:%l object) (:$ub x8632::fulltag-cons))
    491501  :ok)
     502
     503(define-x8632-vinsn set-z-flag-if-consp (()
     504                                         ((object :lisp))
     505                                         ((tag (:u32 #.x8632::imm0))))
     506  (movl (:%l object) (:%accl tag))
     507  (andb (:$b x8632::fulltagmask) (:%accb tag))
     508  (cmpb (:$b x8632::fulltag-cons) (:%accb tag))
     509  (sete (:%b x8632::ah))
     510  (cmpl (:$l x8632::nil-value) (:% object))
     511  (sete (:%b x8632::al))
     512  (xorb (:%b x8632::al) (:%b x8632::ah)))
    492513
    493514(define-x8632-vinsn trap-unless-uvector (()
     
    549570  (andl (:$b x8632::tagmask) (:%l tag))
    550571  (cmpl (:$b x8632::tag-misc) (:%l tag))
    551   (jne :have-tag)
     572  (jne :bad)
    552573  ;; xxx tag might not be byte-accessible
    553574  (movb (:@ x8632::misc-subtag-offset (:%l object)) (:%b tag))
    554   :have-tag
    555   (cmpl (:$b x8632::subtag-single-float) (:%l tag))
     575  (cmpb (:$b x8632::subtag-single-float) (:%b tag))
    556576  (je.pt :ok)
     577  :bad
    557578  (uuo-error-reg-not-tag (:%l object) (:$ub x8632::subtag-single-float))
    558579  :ok)
     
    564585  (andl (:$b x8632::tagmask) (:%l tag))
    565586  (cmpl (:$b x8632::tag-misc) (:%l tag))
    566   (jne :have-tag)
     587  (jne :bad)
    567588  ;; xxx tag might not be byte-accessible
    568589  (movb (:@ x8632::misc-subtag-offset (:%l object)) (:%b tag))
    569   :have-tag
    570   (cmpl (:$b x8632::subtag-double-float) (:%l tag))
     590  (cmpb (:$b x8632::subtag-double-float) (:%b tag))
    571591  (je.pt :ok)
     592  :bad
    572593  (uuo-error-reg-not-tag (:%l object) (:$ub x8632::subtag-double-float))
    573594  :ok)
     
    14031424;; start-mv-call
    14041425
    1405 ;; xxx check this
    14061426(define-x8632-vinsn (vpush-label :push :node :vsp) (()
    1407                                                  ((label :label)))
    1408   (leal (:@ (:^ label) (:%l x8632::fn)) (:%l x8632::ra0))
    1409   (pushl (:%l x8632::ra0)))
     1427                                                    ((label :label))
     1428                                                    ((temp :lisp)))
     1429  (leal (:@ (:^ label) (:%l x8632::fn)) (:%l temp))
     1430  (pushl (:%l temp)))
    14101431
    14111432(define-x8632-vinsn emit-aligned-label (()
     
    14141435  ;; We just want the label following this stuff to be tra-tagged.
    14151436  (:align 3)
    1416   (:long 0)
    1417   (:byte 0))
     1437  (nop) (nop) (nop) (nop) (nop))
    14181438
    14191439;; pass-multiple-values-symbol
     
    16201640(define-x8632-subprim-call-vinsn (ff-call)  .SPffcall)
    16211641
     1642(define-x8632-subprim-call-vinsn (gets64) .SPgets64)
     1643
     1644(define-x8632-subprim-call-vinsn (getu64) .SPgetu64)
     1645
     1646(define-x8632-subprim-call-vinsn (makes64) .SPmakes64)
     1647
     1648(define-x8632-subprim-call-vinsn (makeu64) .SPmakeu64)
     1649
    16221650(define-x8632-subprim-lea-jmp-vinsn (stack-cons-list*)  .SPstkconslist-star)
    16231651
     
    19872015                            (src :imm))
    19882016                           ((temp :s32)
    1989                             (shiftcount (:s32 #.x8664::rcx))))
     2017                            (shiftcount (:s32 #.x8632::ecx))))
    19902018  (movl (:%l count) (:%l temp))
    19912019  (sarl (:$ub x8632::fixnumshift) (:%l temp))
     
    20812109  (btrl (:%l bitnum) (:@ x8632::misc-data-offset (:%l vec) (:%l word-index) 4))
    20822110  :done)
     2111
     2112;;; In safe code, something else has ensured that the value is of type
     2113;;; BIT.
     2114(define-x8632-vinsn nset-variable-bit-to-variable-value (()
     2115                                                         ((vec :lisp)
     2116                                                          (index :s32)
     2117                                                          (value :lisp)))
     2118  (testl (:%l value) (:%l value))
     2119  (je :clr)
     2120  (btsl (:%l index) (:@ x8632::misc-data-offset (:%l vec)))
     2121  (jmp :done)
     2122  :clr
     2123  (btrl (:%l index) (:@ x8632::misc-data-offset (:%l vec)))
     2124  :done)
     2125
     2126(define-x8632-vinsn nset-variable-bit-to-zero (()
     2127                                              ((vec :lisp)
     2128                                               (index :s32)))
     2129  (btrl (:%l index) (:@ x8632::misc-data-offset (:%l vec))))
     2130
     2131(define-x8632-vinsn nset-variable-bit-to-one (()
     2132                                             ((vec :lisp)
     2133                                              (index :s32)))
     2134  (btsl (:%l index) (:@ x8632::misc-data-offset (:%l vec))))
    20832135
    20842136(define-x8632-vinsn set-variable-bit-to-zero (()
     
    25222574                                   (idx :imm))
    25232575                                  ((imm :u32)))
    2524   (movl (:%l idx) (:%l imm))
    2525   (sarl (:$ub 1) (:%l imm))
    2526   (movl (:@ x8632::misc-data-offset (:%l str) (:%l imm)) (:%l imm))
    2527   (imull (:$b x8632::fixnumone) (:%l imm)(:%l code)))
     2576  (movl (:@ x8632::misc-data-offset (:%l str) (:%l idx)) (:%l imm))
     2577  (imull (:$b x8632::fixnumone) (:%l imm) (:%l code)))
     2578
     2579(define-x8632-vinsn %set-scharcode32 (()
     2580                                      ((str :lisp)
     2581                                       (idx :imm)
     2582                                       (code :imm))
     2583                                      ((imm :u32)))
     2584  (movl (:%l code) (:%l imm))
     2585  (shrl (:$ub x8632::fixnumshift) (:%l imm))
     2586  (movl (:%l imm) (:@ x8632::misc-data-offset (:%l str) (:%l idx))))
    25282587
    25292588
     
    27292788  (movl (:%l bitnum) (:%l dest)))
    27302789
     2790(define-x8632-vinsn nref-bit-vector-fixnum (((dest :imm)
     2791                                             (bitnum :s32))
     2792                                            ((bitnum :s32)
     2793                                             (bitvector :lisp))
     2794                                            ())
     2795  (btl (:%l bitnum) (:@ x8632::misc-data-offset (:%l bitvector)))
     2796  (setc (:%b bitnum))
     2797  (movzbl (:%b bitnum) (:%l bitnum))
     2798  (imull (:$b x8632::fixnumone) (:%l bitnum) (:%l dest)))
     2799
    27312800(define-x8632-vinsn set-macptr-address (()
    27322801                                        ((addr :address)
     
    28362905  (movapd (:%xmm x8632::fpzero)  (:@ x8632::macptr.domain (:%l dest))))
    28372906
    2838 
    28392907(define-x8632-vinsn fixnum->signed-natural (((dest :s32))
    28402908                                            ((src :imm)))
    28412909  (movl (:%l src) (:%l dest))
    28422910  (sarl (:$ub x8632::fixnumshift) (:%l dest)))
     2911
     2912(define-x8632-vinsn fixnum->unsigned-natural (((dest :u32))
     2913                                              ((src :imm)))
     2914  (movl (:%l src) (:%l dest))
     2915  (shrl (:$ub x8632::fixnumshift) (:%l dest)))
    28432916
    28442917(define-x8632-vinsn mem-set-double-float (()
     
    29893062                                  ()
    29903063                                  ((tag :u8)))
    2991   (pushl (:%l x8632::nargs))
    29923064  (movl (:%l x8632::temp0) (:%l tag))
    29933065  ((:pred = (:apply %hard-regspec-value tag) x8632::eax)
     
    30003072  (movb (:@ x8632::misc-subtag-offset (:%l x8632::temp0)) (:%b tag))
    30013073  (cmpb (:$b x8632::subtag-function) (:%b tag))
    3002   (cmovel (:%l x8632::temp0) (:%l x8632::xfn))
    30033074  (je :go)
    30043075  (cmpb (:$b x8632::subtag-symbol) (:%b tag))
    3005   (cmovel (:%l x8632::symbol.fcell (:%l x8632::fname)) (:%l x8632::xfn))
     3076  (cmovel (:%l x8632::symbol.fcell (:%l x8632::temp0)) (:%l x8632::temp0))
    30063077  (jne :bad)
    30073078  :go
    3008   (popl (:%l x8632::nargs))
    3009   (jmp (:%l x8632::xfn))
     3079  (jmp (:%l x8632::temp0))
    30103080  :bad
    30113081  (uuo-error-not-callable))
     
    31893259  (movl (:$self 0) (:%l x8632::fn)))
    31903260
    3191 (define-x8632-vinsn %set-scharcode32 (()
    3192                                     ((str :lisp)
    3193                                      (idx :imm)
    3194                                      (code :imm))
    3195                                     ((imm :u32)
    3196                                      (imm1 :u32)))
    3197   (movl (:%l code) (:%l imm1))
    3198   (movl (:%l idx) (:%l imm))
    3199   (shrl (:$ub x8632::fixnumshift) (:%l imm1))
    3200   (shrl (:$ub 2) (:%l imm))
    3201   (movl (:%l imm1) (:@ x8632::misc-data-offset (:%l str) (:%l imm))))
    3202 
    32033261(define-x8632-vinsn pop-argument-registers (()
    32043262                                            ())
     
    32083266  (popl (:%l x8632::arg_z))
    32093267  (je :done)
    3210   (popl (:%l x8664::arg_y))
     3268  (popl (:%l x8632::arg_y))
    32113269  :done)
    32123270
     
    33713429(define-x8632-vinsn nth-value (((result :lisp))
    33723430                               ()
    3373                                ((temp :imm)))
     3431                               ((temp :u32)
     3432                                (nargs (:lisp #.x8632::nargs))))
    33743433  (leal (:@ (:%l x8632::esp) (:%l x8632::nargs)) (:%l temp))
    33753434  (subl (:@ (:%l temp)) (:%l x8632::nargs))
     
    33873446(define-x8632-subprim-call-vinsn (stack-misc-alloc-init)  .SPstack-misc-alloc-init)
    33883447
    3389 (define-x8632-vinsn fixnum->unsigned-natural (((dest :u32))
    3390                                               ((src :imm)))
    3391   (movl (:%l src) (:%l dest))
    3392   (shrl (:$ub x8632::fixnumshift) (:%l dest)))
    3393 
    33943448(define-x8632-vinsn %debug-trap (()
    33953449                                 ())
     
    34053459
    34063460(define-x8632-vinsn alloc-c-frame (()
    3407                                    ((nwords :u32const)))
     3461                                   ((nwords :u32const))
     3462                                   ((temp :imm)))
    34083463  (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp))
    3409   ((:pred < (:apply ash (:apply logandc2 (:apply + nwords 9) 1) x8632::word-shift) 128)
    3410    (subl (:$b (:apply ash (:apply logandc2 (:apply + nwords 9) 1) x8632::word-shift)) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
    3411   ((:not (:pred < (:apply ash (:apply logandc2 (:apply + nwords 9) 1) x8632::word-shift) 128))
    3412    (subl (:$l (:apply ash (:apply logandc2 (:apply + nwords 9) 1) x8632::word-shift)) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
    3413   (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0))
    3414   (movd (:%mmx x8632::stack-temp) (:@ (:%l x8632::ra0))))
    3415 
    3416 ;;; xxx maybe right --- 8?  offset 2?
     3464  (subl (:$l (:apply ash nwords x8632::word-shift))
     3465        (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
     3466  ;; align stack to 16-byte boundary
     3467  (andb (:$b -16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
     3468  (subl (:$b x8632::node-size) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
     3469  (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
     3470  (movd (:%mmx x8632::stack-temp) (:@ (:%l temp))))
     3471
    34173472(define-x8632-vinsn set-c-arg (()
    34183473                               ((arg :u32)
    3419                                 (offset :u32const)))
    3420   (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0))
    3421   (movl (:%l arg) (:@ (:apply + 8 (:apply ash offset 2)) (:%l x8632::ra0))))
     3474                                (offset :u32const))
     3475                               ((temp :imm)))
     3476  (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
     3477  (movl (:%l arg) (:@ (:apply + 4 (:apply ash offset 2)) (:%l temp))))
    34223478
    34233479(define-x8632-vinsn eep.address (((dest t))
     
    34883544
    34893545(define-x8632-subprim-lea-jmp-vinsn (keyword-bind) .SPkeyword-bind)
     3546
     3547(define-x8632-vinsn set-high-halfword (()
     3548                                       ((dest :imm)
     3549                                        (n :s16const)))
     3550  (orl (:$l (:apply ash n 16)) (:%l dest)))
    34903551
    34913552(define-x8632-vinsn scale-nargs (()
     
    35153576
    35163577(define-x8632-vinsn one-opt-supplied-p (()
    3517                                         ())
     3578                                        ()
     3579                                        ((temp :u32)))
    35183580  (testl (:%l x8632::nargs) (:%l x8632::nargs))
    3519   (je :one)
    3520   (pushl (:$l x8632::nil-value))
    3521   (jmp :done)
    3522   :one
    3523   (pushl (:$l x8632::t-value))
    3524   :done)
     3581  (setne (:%b temp))
     3582  (negb (:%b temp))
     3583  (andl (:$b x8632::t-offset) (:%l temp))
     3584  (addl (:$l x8632::nil-value) (:%l temp))
     3585  (pushl (:%l temp)))
    35253586
    35263587;; needs some love
    35273588(define-x8632-vinsn two-opt-supplied-p (()
    35283589                                        ())
    3529   ;; note that nargs is imm0
    35303590  (rcmpl (:%l x8632::nargs) (:$b (:apply ash 2 x8632::word-shift)))
    35313591  (jge :two)
     
    36123672  (btsl (:$ub (:apply %hard-regspec-value reg)) (:@ (:%seg :rcontext) x8632::tcr.node-regs-mask)))
    36133673
    3614 ;;; need 16 byte alignment here?
    36153674(define-x8632-vinsn (temp-push-unboxed-word :push :word :csp)
    36163675    (()
    3617      ((w :u32)))
     3676     ((w :u32))
     3677     ((temp :imm)))
    36183678  (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp))
    3619   (subl (:$b 8) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
    3620   (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0)) 
    3621   (movd (:%mmx x8632::stack-temp) (:@ (:%l x8632::ra0)))
    3622   (movl (:%l w) (:@ 4 (:%l x8632::ra0))))
     3679  (subl (:$b 16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
     3680  (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
     3681  (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
     3682  (movl (:%l w) (:@ 4 (:%l temp))))
    36233683
    36243684(define-x8632-vinsn (temp-pop-unboxed-word :pop :word :csp)
    36253685    (((w :u32))
    3626      ())
    3627   (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0))
    3628   (movl (:@ 4 (:%l x8632::ra0)) (:%l w))
    3629   (addl (:$b 8) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
     3686     ()
     3687     ((temp :imm)))
     3688  (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
     3689  (movl (:@ 4 (:%l temp)) (:%l w))
     3690  (addl (:$b 16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
    36303691
    36313692(define-x8632-vinsn (temp-push-node :push :word :tsp)
     
    36533714(define-x8632-vinsn (temp-push-single-float :push :word :csp)
    36543715    (()
    3655      ((f :single-float)))
     3716     ((f :single-float))
     3717     ((temp :imm)))
    36563718  (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp))
    36573719  (subl (:$b 8) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
    3658   (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0))
    3659   (movd (:%mmx x8632::stack-temp) (:@ (:%l x8632::ra0)))
    3660   (movss (:%xmm f) (:@ 4 (:%l x8632::ra0))))
     3720  (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
     3721  (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
     3722  (movss (:%xmm f) (:@ 4 (:%l temp))))
    36613723
    36623724(define-x8632-vinsn (temp-pop-single-float :pop :word :csp)
    36633725    (((f :single-float))
    3664      ())
    3665   (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0))
    3666   (movss (:@ 4 (:%q x8664::ra0)) (:%xmm f))
    3667   (addl (:$b (* 2 x8632::dnode-size)) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
     3726     ()
     3727     ((temp :imm)))
     3728  (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
     3729  (movss (:@ 4 (:%l temp)) (:%xmm f))
     3730  (addl (:$b 8) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
    36683731
    36693732(define-x8632-vinsn (temp-push-double-float :push :word :csp)
    36703733    (()
    3671      ((f :double-float)))
     3734     ((f :double-float))
     3735     ((temp :imm)))
    36723736  (movd (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%mmx x8632::stack-temp))
    36733737  (subl (:$b 16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp))
    3674   (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0))
    3675   (movd (:%mmx x8632::stack-temp) (:@ (:%l x8632::ra0)))
    3676   (movsd (:%xmm f) (:@ 8 (:%l x8632::ra0))))
     3738  (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
     3739  (movd (:%mmx x8632::stack-temp) (:@ (:%l temp)))
     3740  (movsd (:%xmm f) (:@ 8 (:%l temp))))
    36773741
    36783742(define-x8632-vinsn (temp-pop-double-float :pop :word :csp)
    36793743    (((f :double-float))
    3680      ())
    3681   (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l x8632::ra0))
    3682   (movsd (:@ 8 (:%l x8632::ra0)) (:%xmm f))
     3744     ()
     3745     ((temp :imm)))
     3746  (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
     3747  (movsd (:@ 8 (:%l temp)) (:%xmm f))
    36833748  (addl (:$b 16) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
    36843749
Note: See TracChangeset for help on using the changeset viewer.