+2009-11-02 Doug Evans <dje@sebabeach.org>
+
+ Specify isa(s) when doing ifield, operand, insn lookups.
+ ACU = all callers updated.
+ * attr.scm (/attr-eval): Call rtx-value instead of rtx-eval-with-estate.
+ * enum.scm (define-full-insn-enum): Pass isa-name-list to
+ current-ifld-lookup.
+ * html.scm (get-insn-properties): Pass isa-name-list to
+ current-op-lookup.
+ * ifield.scm (/ifld-parse-follows): New arg isas, ACU.
+ * insn.scm (/parse-insn-format-symbol): New arg isa-name-list, ACU.
+ (/parse-insn-format-list, /parse-insn-iformat-iflds): Ditto.
+ (/parse-insn-format, syntax-break-out): Ditto.
+ * mach.scm (obj-filter-by-isa): New function.
+ (current-ifld-lookup): New optional arg maybe-isa-name-list.
+ (/ifld-already-defined?, /op-already-defined?): Simplify.
+ (current-op-lookup): New optional arg maybe-isa-name-list.
+ (current-insn-lookup): New arg isa-name-list, ACU.
+ (/insn-already-defined?, /minsn-already-defined?): Simplify.
+ (current-minsn-lookup): New arg isa-name-list, ACU.
+ * minsn.scm (/minsn-compute-iflds): Pass isa-name-list to
+ current-op-lookup.
+ * opc-itab.scm (compute-syntax): New arg isa-name-list, ACU.
+ (gen-syntax-entry): Ditto.
+ * operand.scm (/operand-parse): Pass isa-name-list to
+ current-ifld-lookup.
+ (/derived-parse-encoding): New arg isa-name-list, ACU.
+ (/derived-parse-ifield-assertion): Ditto.
+ (/derived-operand-parse): Pass isa-name-list to current-op-lookup.
+ (/anyof-parse-choice): Ditto.
+ (anyof-satisfies-assertions?): Pass context to rtx-solve.
+ (/anyof-merge-syntax): New arg container, ACU.
+ (operand-builtin!): Add pc to all isas.
+ * rtl-c.scm (estate-make-for-rtl-c): Delete arg extra-vars-alist, ACU.
+ (estate-make-for-rtl-c++, rtl-c-expr-parsed): Ditto.
+ (rtl-c-parsed, rtl-c++-parsed): Ditto.
+ (rtl-c): New arg isa-name-list, ACU.
+ (rtl-c-expr, rtl-c++): Ditto.
+ (closure): New arg isa-name-list, ACU.
+ * rtl-traverse.scm (/make-cstate): New arg isa-name-list, ACU.
+ (/cstate-isas): New function.
+ (/rtx-canon-symbol-list): New function.
+ (/rtx-canon-env-stack): Renamed from /rtx-canon-env, ACU.
+ updated.
+ (/rtx-make-canon-table): Rename ENV to ENVSTACK, new entry SYMBOLLIST.
+ (/rtx-canon-rtx-operand): Pass isa list to current-op-lookup.
+ (/rtx-canon-rtx-ref, /rtx-canon): Ditto.
+ (rtx-canonicalize): New arg isa-name-list, ACU.
+ (rtx-canonicalize-stmt): Delete.
+ (tstate-make): New arg isas, ACU.
+ (tstate-isas, tstate--set-isas!): New functions.
+ (tstate-env-stack): Renamed from tstate-env, ACU.
+ (tstate-set-env-stack!): Renamed from tstate-set-env!, ACU.
+ (tstate-make-closure): Renamed from tstate-new-env, new arg
+ isa-name-list, ACU.
+ (/rtx-traverse-env): Delete.
+ (/rtx-make-traverser-table): Rename ENV to ENVSTACK, new entry
+ SUMBOLLIST.
+ (/rtx-traverse): Include conditional flag in dump output.
+ Update isa,envstack for closures. Pass isa list to current-op-lookup.
+ (<eval-state>): New member isas. Rename env to env-stack.
+ (<eval-state> vmake!): Handle #:isas. #:env renamed to #:env-stack.
+ (<eval-state>): New getter/setter for isas. Rename env getter/setter
+ to env-stack.
+ (estate-make-for-eval): Provide #:isas.
+ (estate-make-closure): Renamed from estate-new-env. New arg
+ isa-name-list, ACU.
+ * rtl-xform.scm (/rtx-simplify-expr-fn): Handle closures.
+ (/rtx-trim-args): ENV renamed to ENVSTACK. Ad ITERATION, SYMBOLLIST.
+ (/rtx-trim-for-doc): Handle closures.
+ * rtl.scm (/rtx-valid-types): Rename ENV to ENVSTACK. Add ITERATION,
+ SYMBOLLIST.
+ (rtx-env-var-list): Delete.
+ (rtx-env-make): Handle already-compiled environments.
+ (rtx-var-alist-to-env): New function.
+ (rtx-var-alist-to-closure-env-stack, rtx-make-env-stack): New functions.
+ (rtx-env-stack-dump): Renamed from rtx-env-dump, ACU.
+ (rtx-operand-obj): New arg isa-name-list, ACU.
+ (rtx-closure-isas, rtx-closure-env-stack, rtx-closure-expr): New
+ functions.
+ * rtx-funcs.scm (closure): New arg isa-name-list, reorder args, ACU.
+ * sem-frags.scm (<sfrag>): Delete member compiled-semantics.
+ (/frag-compute-desired-frags): Minor simplification.
+ (/frag-pick-best): Ditto.
+ * sid-cpu.scm (gen-semantic-code): Require canonical rtl.
+ (/gen-sfrag-code): Update.
+ * sim-cpu.scm (gen-semantic-code): Require canonical rtl.
+ * utils-cgen.scm (sanitize): New arg isa-name-list, ACU.
+ * utils.scm (non-null-intersection?): New function.
+
+ * gen-all (do_src): Manually run cgen-all for sid.
+
+2009-11-01 Doug Evans <dje@sebabeach.org>
+
+ * gen-all: New file.
+
+ * rtl-traverse.scm (/rtx-canon): Issue better error message for
+ invalid rtx function names.
+
+2009-10-28 Doug Evans <dje@sebabeach.org>
+
+ * cos.scm (object-assign!): New function.
+ * mode.scm (/mode-set-word-params!): Call it.
+
+2009-10-25 Doug Evans <dje@sebabeach.org>
+
+ Record bitset attributes internally as a list.
+ Record rtx attribute values internally as ((rtx-expr)).
+ * attr.scm (bitset-attr?): Delete, unused.
+ (<bitset-attribute> parse-value): Rewrite.
+ (/attr-parse): Rewrite bitset default value processing.
+ (/attr-read): Pick out values of scalar attributes to distinguish
+ them from bitset values which are a list.
+ Fix spelling errors for processing of default values.
+ Handle string attributes.
+ (bitset-attr->list): Delete, all callers updated.
+ (/bitset-attr->charmask): Renamed from bitset-attr->charmask.
+ All callers updated.
+ (atlist-source-form): Rewrite.
+ * hardware.scm (<hardware-base> 'get-isas): Update recognition
+ of all isas.
+ (hardware-builtin!): Update spec of ISA attribute, (ISA foo,bar)
+ -> (ISA foo bar).
+ * intrinsics.scm (target:belongs-to-group?): Update, bitset attribute
+ values are now lists.
+ * mach.scm (def-isa-attr!): Update, bitset attribute values,
+ including the default, are now lists.
+ (all-isas-attr-value): Result is now a list.
+ * doc/rtl.texi: Clean up pass over attribute docs.
+
+ Change internal representation of rtx attribute values.
+ * attr.scm (/attr-val-is-rtx?): New function.
+ (attr-value): Call it.
+ (atlist-attr-value-no-default, attr-lookup-default): Ditto.
+ (/attr-parse): Use /attr-val-is-rtx? to detect rtx values.
+ Disallow rtx values for bitset attributes.
+ (/attr-read): Record rtx in default value as ((rtx-expr)).
+ (/attr-eval): Update.
+
+2009-10-24 Doug Evans <dje@sebabeach.org>
+
+ * gen-all-doc: Add sh.cpu.
+ * gen-all-desc: Use cpu/sh.cpu instead of ../cpu/sh.cpu
+ (until ../cpu/sh.cpu is updated and cpu/sh.cpu is deleted).
+
+ * sid-cpu.scm (/gen-sem-case): Tweaking debugging printf.
+ (/gen-sfrag-case): Ditto.
+ * sim-cpu.scm (/gen-sem-case): Ditto.
+
+ * doc/rtl.texi: Add note that different ifields, operands, insns,
+ and minsns may occur with the same name in different isas.
+ Add note on the canonical form of rtl expressions.
+
+2009-10-23 Doug Evans <dje@sebabeach.org>
+
+ * desc-cpu.scm (/gen-hash-defines): Remove #include of cgen-bitset.h.
+ * sid-cpu.scm (cgen-desc.h): Update location of cgen's bitset.h.
+
+ * decode.scm: Tweak various comments.
+ (/opcode-slots): Add FIXME.
+ (/build-decode-table-guts): Add assert.
+ * utils-sim.scm (/gen-set-itype-and-extract): New function.
+ (/gen-bracketed-set-itype-and-extract): New function.
+ (/gen-decode-default-entry): Rewrite.
+ (/table-guts-to-mask, /all-opcode-bits-used?): New functions.
+ (/gen-decode-insn-entry): New arg table-guts-thus-far, all callers
+ updated. Don't unnecessarily emit check for whether all opcode bits
+ have been examined.
+ (/gen-decode-expr-set-itype): Delete.
+ (/gen-decode-expr-entry): Update.
+ (/gen-decode-table-entry): New arg table-guts-thus-far, all callers
+ updated. Keep track of decoder tables used thus far.
+ (/gen-decoder-switch): Ditto.
+ * utils.scm (word-bit-value): New function.
+
+2009-10-14 Doug Evans <dje@sebabeach.org>
+
+ * ifield.scm (<ifield>, value): Provide default initial value.
+ (ifield-encode-mode): Delete
+ (ifield-decode-mode): Delete duplicate definition.
+ (<derived-ifield>, 'make!): Initialize members encode, decode.
+ * opcode.scm (<ifield>, 'gen-insert): Use ifld-decode-mode instead of
+ ifld-encode-mode.
+ (<multi-ifield>, 'gen-insert): Ditto.
+
+2009-10-05 Dave Korn <dave.korn.cygwin@googlemail.com>
+
+ * sim-model.scm (@cpu@_prepare_run): Use @prefix@, not @cpu@,
+ for @foo@_init_idesc_table.
+
+2009-09-30 Doug Evans <dje@sebabeach.org>
+
+ * doc/intro.texi: Mention SID.
+ * doc/sim.texi: Ditto.
+ * doc/porting.text (Doing a simulator port): Add some text.
+
+2009-09-27 Doug Evans <dje@sebabeach.org>
+
+ * cos.scm (/class-table): New global.
+ (/class-uid, /class-set-uid!): New functions.
+ (/class-parent-name): Renamed from /class-parents.
+ (/class-make!): Change parents arg to parent-name, all callers updated.
+ Assign uid to class.
+ (/class-lookup-uid): New function.
+ (/class-parent-classes): Rewrite.
+ (/class-mi?): Delete.
+ (/class-desc-mi?, /class-desc-offset-case, /class-desc-offset-case):
+ Delete.
+ (/class-desc-offset, /class-desc-child, /class-desc-parents): Update.
+ (/class-compute-class-desc, class-desc-dump): Update.
+ (/object-make!): Update.
+ (/object-make-with-values!): Delete arg class-desc, all callers
+ updated.
+ (/object-copy): Delete arg top?, all callers updated.
+ (/object-specialize): Delete.
+ (/object-elements, /object-top-class): Delete.
+ (/object-class-name, /object-class-desc): Update.
+ (/object-class-uid): New function.
+ (/object-elm-get, /object-elm-set!, object?, /class-check-init!,
+ class-make, /class-subclass? /class-lookup-element,
+ Update.
+ (/elm-delta, elm-list): Delete.
+ (/elm-make-method-getter, elm-get, elm-xget): Update.
+ (/elm-make-method-setter, elm-set!, elm-xset!): Update.
+ (elm-make-getter, elm-make-setter): Update.
+ (/method-lookup-next): Update.
+ (send): Don't specialize class passed to method.
+ (send-next): New arg class-name, all callers updated.
+ (/class-parent, /class-parent-via-path, object-parent): Delete.
+ (class-cons-parent!, class-append-parent!): Delete.
+ (object-reset!): Init /class-table.
+
+ * cos.scm (/object-debug-classes): Delete.
+ (/object-debug-elements, /object-debug-methods): Delete.
+
+ * cos.scm (/method-lookup): Delete arg virtual?, all callers updated.
+ (method-proc): Delete.
+ (method-make-virtual!, method-make-virtual-forward!): Delete.
+ * ifield.scm (<ifield> field-start): Update.
+ (<ifield> field-length, pretty-print): Update.
+ (<multi-ifield> field-length, field-start, pretty-print): Update.
+ * sid-cpu.scm (/gen-hardware-struct): Use gen-defn instead of gen-decl.
+ * sid.scm (<scalar> gen-sym-defn): Renamed from gen-sym-decl.
+ (<array> gen-sym-defn): Ditto.
+ (<hardware-base> gen-defn): Renamed from gen-defn.
+ (<hw-register> gen-type): Update.
+ (<hw-register> gen-defn): Renamed from gen-sym-decl, rewrite.
+ (<hw-memory>, <hw-address>, <hw-iaddress> gen-type): Update.
+ (<hw-memory>, <hw-address> gen-defn): Renamed from gen-sym-decl.
+ (<hw-immediate> gen-type): Update.
+ (<hw-immediate> gen-defn): Renamed from gen-sym-decl, rewrite.
+ * sim-cpu.scm (/gen-hardware-struct): Use gen-defn instead of gen-decl.
+ * sim.scm (<scalar> gen-sym-defn): Renamed from gen-sym-decl.
+ (<array> gen-sym-defn): Ditto.
+ (<hardware-base> gen-defn): Renamed from gen-defn.
+ (<hw-register> gen-type): Update.
+ (<hw-register> gen-defn): Renamed from gen-sym-decl, rewrite.
+ (<hw-memory>, <hw-address>, <hw-iaddress> gen-type): Update.
+ (<hw-memory>, <hw-address> gen-defn): Renamed from gen-sym-decl.
+ (<hw-immediate> gen-type): Update.
+ (<hw-immediate> gen-defn): Renamed from gen-sym-decl, rewrite.
+
+2009-09-25 Doug Evans <dje@sebabeach.org>
+
+ * operand.scm (/anyof-merge-setter): Handle set-quiet.
+ * rtl.scm (rtx-single-set?): Handle set-quiet.
+
+ * rtl-c.scm (estate-make-for-rtl-c): Delete args context, owner,
+ rtl-cover-fns?, macro?. All callers updated.
+ (estate-make-for-normal-rtl-c): Delete, have all callers call
+ estate-make-for-rtl-c directly.
+ (rtl-c-parsed): Pass #:outer-expr to estate-make-for-rtl-c.
+ (rtl-c, rtl-c-expr-parsed, rtl-c-expr, rtl-c++-parsed, rtl-c++): Ditto.
+
+ * rtl-c.scm (/par-replace-set-dest-expr-fn): New function,
+ replaces /par-replace-set-dests.
+ (/par-replace-set-src-expr-fn): New function, replaces
+ /par-replace-set-srcs.
+ (s-parallel): Rewrite.
+
+ * rtl.scm (rtx-pretty-strdump): New function.
+ * rtl-traverse.scm (/rtx-canon-error): Use it.
+ (<eval-state>): New member outer-expr.
+ (estate-error): Include outer expression in error message if present.
+
+2009-09-23 Doug Evans <dje@sebabeach.org>
+
+ * xc16x.cpu (h-cr): New hardware.
+ (muls): Comment out parts that won't compile, add fixme.
+ (mulu, divl, divlu, jmpabs, jmpa-, jmprel, jbc, jnbs, callr): Ditto.
+ (scxti, scxtmg, scxtm, bclear, bclr18, bset19, bitset, bmov): Ditto.
+ (bmovn, band, bor, bxor, bcmp, bfldl, bfldh): Ditto.
+
+ Rewrite rtl processing to require it to be "canonicalized" first,
+ and write a full canonicalizer / expression checker.
+ Remove all appearances of DFLT in canonical rtl.
+ * attr.scm (/attr-eval atval owner): Call rtx-canonicalize,
+ then rtx-simplify.
+ * iformat.scm (ifmt-analyze) Use canonical semantics.
+ * insn (<insn>): New member canonical-semantics.
+ * mach.scm (<arch>): New member multi-insns-instantiated?.
+ (/instantiate-multi-insns!): New function.
+ (/canonicalize-insns!): New function.
+ (arch-analyze-insns!): Canonicalize insn semantics before processing
+ them.
+ * mode.scm (/mode-set-word-params!): New function.
+ (mode-void?): New function.
+ (mode-compatible?): VOID is compatible with VOID.
+ (/mode-word-sizes-defined?): New global.
+ (mode-set-word-modes!): Use/set it.
+ (mode-ensure-word-sizes-defined): Update.
+ (mode-builtin!): New builtin "modes" SYM, INSN, MACH.
+ Redo WI/UWI/AI/IAI handling.
+ (op:new-mode): No longer accept DFLT.
+ (<derived-operand> constructor): Ensure all fields are initialized.
+ (<anyof-operand> constructor): Ditto.
+ (/derived-parse-ifield-assertion): Delete arg `args'.
+ All callers updated.
+ * rtl-c.scm (<rtl-c-eval-state>): New member `for-insn?'.
+ (rtl-c): Call rtx-canonicalize instead of rtx-compile.
+ (rtl-c-expr, rtl-c++): Ditto.
+ (/rtl-c-get): Use mode of operand, not containing expression.
+ (rtl-c-set-quiet, rtl-c-set-trace): Remove DFLT support.
+ (/rtx-use-sem-fn?): Don't check for (insn? owner), check
+ estate-for-insn? instead.
+ (s-unop): Use mode of expression, not first operand.
+ (s-binop, s-binop-with-bit, s-shop, s-cmpop): Ditto.
+ (s-sequence): Remove DFLT support.
+ (ifield): Use mode of expression, not UINT.
+ (pc): Comment out, unused.
+ (int-attr): New rtx kind.
+ (attr): Deprecate.
+ (set, set-quiet): Pass src to rtl-c-set-{trace,quiet} for expansion.
+ * rtl-traverse.scm (/rtx-canon-debug?): New global.
+ (/make-cstate): New function.
+ (/cstate-context, /cstate-outer-expr): New functions.
+ (/rtx-canon-error): New function.
+ (/rtx-lookup-hw, /rtx-pick-mode, /rtx-pick-mode3, /rtx-pick-op-mode,
+ /rtx-get-last-cond-case-rtx): New functions.
+ (/rtx-canon-*): New functions.
+ (/rtx-canner-table, /rtx-operand-canoners): New globals.
+ (/rtx-make-canon-table, /rtx-special-expr-canoners): New functions.
+ (/rtx-option, /rtx-option-list?): Rewrite.
+ (rtx-munge-mode&options): Replaces /rtx-munge-mode&options.
+ Rewritten, all callers updated.
+ (/rtx-canon-expr, /rtx-canon): New functions.
+ (rtx-canonicalize): Move here from rtl-xform.scm and rewrite.
+ (rtx-canonicalize-stmt): New function.
+ (tstate-make): Remove arg `set?'. All callers updated.
+ (tstate-new-set?): Delete.
+ (/rtx-traverse-options, /rtx-traverse-*mode): Delete,
+ moved to /rtx-canon-*.
+ (/rtx-traverse-normal-operand): New function.
+ (/rtx-traverse-rtx-list): Delete arg `mode', all callers updated.
+ (/rtx-traverse-rtx, /rtx-traverse-setrtx,, /rtx-traverse-testrtx,
+ /rtx-traverse-condrtx, /rtx-traverse-casertx, /rtx-traverse-locals,
+ /rtx-traverse-iteration, /rtx-traverse-env, /rtx-traverse-attrs):
+ Ditto.
+ (/rtx-traverse-symbol, /rtx-traverse-string, /rtx-traverse-number,
+ /rtx-traverse-symornum, /rtx-traverse-object): Delete.
+ (/rtx-make-traverser-table): Update.
+ (/rtx-traverse-operands): Remove mode processing, now done during
+ canonicalization.
+ (/rtx-traverse-expr): Delete arg `mode', all callers updated.
+ (/rtx-traverse): Ditto.
+ (rtx-init-traverser-tables!): New function.
+ * rtl-xform (/rtx-verify-no-dflt-modes-expr-fn): New function.
+ (rtx-verify-no-dflt-modes): New function.
+ (/rtx-simplify-expr-fn): Update, `arg' mode deleted.
+ (rtx-simplify-insn): Use insn-canonical-semantics.
+ (rtx-canonicalize): Moved to rtl-traverse.scm.
+ (/compile-expr-fn, rtx-compile): Delete.
+ (/rtx-trim-rtx-list): New function.
+ (/rtx-trim-for-doc): Handle set, if.
+ * rtl.scm (<rtx-func>): New members result-mode, matchexpr-index.
+ (/rtx-valid-mode-types): Update.
+ (/rtx-valid-matches): Update.
+ (/rtx-find-matchexpr-index): New function.
+ (rtx-lookup): Require rtx-kind to be the rtx name.
+ (def-rtx-node): New arg result-mode, all callers updated.
+ (def-rtx-syntax-node, def-rtx-operand-node): Ditto.
+ (rtx-lazy-sem-mode): Delete.
+ (/rtx-closure-make): New arg `mode', all callers updated.
+ (rtx-make-ifield, rtx-make-operand, rtx-make-local): Ditto.
+ (rtx-operand-obj): Rewrite.
+ (rtx-make-xop): New functions.
+ (/hw): Renamed from `hw', all callers updated.
+ Use the correct mode instead of DFLT for the index.
+ (rtl-builtin!): Call rtx-init-traversal-tables!.
+ (rtl-finish!): Update.
+ * rtx-funcs.scm (all rtx functions): New parameter: result-mode.
+ Update mode arg-type.
+ (pc): Comment out.
+ (int-attr): New rtx kind.
+ (attr): Deprecate.
+ * sem-frags.scm (/frag-hash-compute!): Update, mode arg deleted.
+ (/frag-cost-compute!): Ditto.
+ * semantics.scm (/build-operand!): Delete args op-name, op.
+ New arg op-expr. All callers updated.
+ (/build-mem-operand!): Remove DFLT support.
+ (semantic-compile): Update process-expr!, mode arg deleted.
+ * sid-cpu.scm (gen-semantic-code): Specify #:for-insn? in
+ rtl-c++ calls.
+ (/gen-sem-case, /gen-sfrag-code): Ditto.
+ * sid.scm (/op-gen-set-trace1): Renamed from /op-gen-set-trace.
+ (/op-gen-set-trace): New function. If not doing profiling, or using
+ the pbb engine, call /op-gen-set-quiet.
+ * sim-cpu.scm (gen-semantic-code): Specify #:for-insn? in rtl-c calls.
+ * utils-gen.scm (/gen-ifld-extract-base): Update call to rtl-c.
+ (/gen-ifld-extract-beyond, gen-multi-ifld-extract): Ditto.
+ * utils.scm (find-first-index): New function.
+ * doc/rtl.texi: Delete docs for `attr'. Add `int-attr'.
+
+ * rtx-funcs.scm (eq,ne,lt,gt,le,ge,ltu,leu,gtu,geu): Change class
+ to COMPARE.
+ * sem-frags.scm (/frag-cost-compute!): Add COMPARE.
+
+2009-09-21 Doug Evans <dje@sebabeach.org>
+
+ * rtl-c.scm (/rtl-c-build-table): Renamed from rtl-c-build-table.
+ All callers updated. Add FIXME.
+ (all rtx functions): Rename local estate to *estate*. It's an
+ artificial argument added to the rtx, so make it stand out.
+
+ * openrisc.cpu (or32 isa): Fix setup-semantics.
+
+ * rtl.scm (rtx-class-*?): Delete, unused.
+ (rtx-style-function?, rtx-style-operand?, rtx-style-macro?): Ditto.
+
+ * read.scm (/CGEN-RTL-VERSION): Initialize to #f.
+ (init-reader!): Set /CGEN-RTL-VERSION to default.
+
+ * read.scm (cpu-load): Print load parameters.
+
+ * dev.scm (load-doc): Set verbose-level to 2.
+
+2009-09-20 Doug Evans <dje@sebabeach.org>
+
+ * rtl.scm (rtx-strdump): Use write instead of display.
+
+2009-09-17 Doug Evans <dje@sebabeach.org>
+
+ * utils-cgen.scm (obj-csv-names): New function.
+ * utils-sim.scm (/sfmt-contents): Use it in logging message.
+
2009-09-12 Doug Evans <dje@sebabeach.org>
Clean up pass of mode handling.